STM32 stm32f1外部中断问题题

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(15879)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'STM32外部中断详解',
blogAbstract:'&&&&一、基本概念
&ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。&&&& STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:3,
permalink:'blog/static/',
commentCount:3,
mainCommentCount:2,
recommendCount:7,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}查看: 3857|回复: 7
关于32软件中断的问题
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间0 小时
如果将Line0配置给PA0作为按键触发的中断,在打开Line0的软件中断,主函数的while(1){。。。}中的语句并不是从第一句开始执行的,是什么原因?
主题帖子精华
在线时间19 小时
什么意思?没看懂?
你是说有些语句没执行吗?估计是被编译器优化掉了。
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间0 小时
int&main(void)
{
&&NVIC_Configuration();
&&/*&配置LED灯使用的GPIO管脚模式*/
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB&|&RCC_APB2Periph_GPIOA,&ENABLE);& /*使能LED灯使用的GPIO时钟*/
&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_10&|&GPIO_Pin_11&|&GPIO_Pin_8&|&GPIO_Pin_9;
&&GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_Out_PP;
&&GPIO_Init(GPIOB,&&GPIO_InitStructure);
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,&GPIO_PinSource0);&& &&//选择外部中断线0
&&EXTI_InitStructure.EXTI_Line&=&EXTI_Line0;&&
&&EXTI_InitStructure.EXTI_Mode&=&EXTI_Mode_I
&&EXTI_InitStructure.EXTI_Trigger&=&EXTI_Trigger_F&//下降沿触发
&&EXTI_InitStructure.EXTI_LineCmd&=&ENABLE;&//中断线使能
&&EXTI_Init(&EXTI_InitStructure);&//初始化中断 &&
&&/*&Generate&software&interrupt:&simulate&a&falling&edge&applied&on&Key&Button&EXTI&line&*/
&&EXTI_GenerateSWInterrupt(EXTI_Line0);&//EXTI_Line0中断允许&到此中断配置完成,可以写中断处理函数。 &&&使从delay函数后面开始执行&
&&&flag&=&0xfeff&;
&while&(1)
&&{
&
&&&&&GPIO_Write(GPIOB,&flag);
&flag&&=1;
&& delay(30);
if(flag&==&0xEFF0)
&&&&&&&flag&=&0xFEFF;
&&else&if(flag&==&0xfffe)&&
&&flag=0 &
第一次运行时是直接从delay()后面开始的
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间0 小时
回复【2楼】Pony279:
---------------------------------
等级:
&注册时间:
&&09:58&
文章:&7&
在线&
int&main(void)&
{&
&&NVIC_Configuration();&
&&/*&配置LED灯使用的GPIO管脚模式*/&
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB&|&RCC_APB2Periph_GPIOA,&ENABLE);&&/*使能LED灯使用的GPIO时钟*/
&
&&GPIO_InitStructure.GPIO_Pin&=&GPIO_Pin_10&|&GPIO_Pin_11&|&GPIO_Pin_8&|&GPIO_Pin_9;
&&&GPIO_InitStructure.GPIO_Speed&=&GPIO_Speed_50MHz;&
&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_Out_PP;&
&&GPIO_Init(GPIOB,&&GPIO_InitStructure);&
&&GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,&GPIO_PinSource0);&&&&&//选择外部中断线0&
&&EXTI_InitStructure.EXTI_Line&=&EXTI_Line0;&&&
&&EXTI_InitStructure.EXTI_Mode&=&EXTI_Mode_I&
&&EXTI_InitStructure.EXTI_Trigger&=&EXTI_Trigger_F&//下降沿触发&
&&EXTI_InitStructure.EXTI_LineCmd&=&ENABLE;&//中断线使能&
&&EXTI_Init(&EXTI_InitStructure);&//初始化中断&&&&
&&/*&Generate&software&interrupt:&simulate&a&falling&edge&applied&on&Key&Button&EXTI&line&*/
&&&EXTI_GenerateSWInterrupt(EXTI_Line0);&//EXTI_Line0中断允许&到此中断配置完成,可以写中断处理函数。&&&&使从delay函数后面开始执行&
&&&&flag&=&0xfeff&;&
&while&(1)&
&&{&&&
&&&&&GPIO_Write(GPIOB,&flag);&
&flag&&=1;&
&&&delay(30);&
&&&
&&&
if(flag&==&0xEFF0)&
&&&&&&&flag&=&0xFEFF;&
&&else&if(flag&==&0xfffe)&&&
&&flag=0&&&
&&&sta=0;&
&&&&
&&}&
}&
第一次运行时是直接从delay()后面开始的&
主题帖子精华
在线时间19 小时
刚刚测试了,没有你说的问题啊。。。
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间0 小时
但是下到板子里确实有问题啊;还有那个软件延时的语句是什么作用
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间0 小时
本来应该是第一个灯亮的,但只要有&EXTI_GenerateSWInterrupt(EXTI_Line0);&这句话就会直接从第二个灯开始亮,搞不懂是什么原因
主题帖子精华
初级会员, 积分 98, 距离下一级还需 102 积分
在线时间0 小时
回复【7楼】sosharelo:
---------------------------------
额。。。弱弱的问下上边程序里的FLAG是哪个标志位?
新人求指导~~~
Powered by请教STM32定时器中断不正常的问题
本帖最后由 Sullivan 于
17:55 编辑
CPU型号:STM32f103RBT6,开发环境:Keil4.13。
现在想实现定时器触发中断的功能,系统使用HSI内部时钟。
所有的初始化,包括RCC、GPIO等等都放在Sys_Init()函数里写完。
现在遇到的问题是,无法正确进入中断服务函数。而且有的时候打开APB1里的TIM2时钟都会引起主循环不执行。
对这款cpu确实是了解太少了,请各位帮忙看看问题出在哪?void Sys_Init(void)
& & & & {
& & & & & & & & RCC_DeInit();//复位RCC寄存器
& & & & & & & & RCC_HSICmd(ENABLE);//启动HSI时钟
& & & & & & & & while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);//等待HSI就绪
& & & & & & & & RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_9);//配置PLL,选择HSI的2分频作为时钟信号,9倍频,36MHz。
& & & & & & & & RCC_PLLCmd(ENABLE);//启动PLL
& & & & & & & & while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL就绪& & & &
& & & & & & & & RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL作为时钟源
& & & & & & & & while(RCC_GetSYSCLKSource() != 0x08);//确认是PLL时钟
& & & &
& & & & & & & & RCC_HCLKConfig(RCC_SYSCLK_Div2);
& & & & & & & & RCC_PCLK2Config(RCC_HCLK_Div2);
& & & & & & & & RCC_PCLK1Config(RCC_HCLK_Div2);& & & && &
& & & & & & & & GPIO_DeInit(GPIOA);GPIO_DeInit(GPIOB);GPIO_DeInit(GPIOC);GPIO_DeInit(GPIOD);//寄存器重设为缺省值
& & & & & & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//开启GPIO时钟
& & & & & & & & RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//开启TIM2时钟& & & &
& & & & & & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
& & & & & & & & GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//关闭乱七八糟的端口复用
& & & & & & & & GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//解放PB3、PB4& & & && &
& & & & & & & &
& & & & /*DAC Pin Config start*/
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;& & & & & & & &&&
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
& & & & /*DAC Pin Config end*/
& & & &
& & & & /*ADC Pin Config start*/
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;& & & & & & & & //SDO
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;& & & & & & & & //CS
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;& & & & & & & & //SCK
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOC, &GPIO_InitStructure);& & & &&&
& & & & /*ADC Pin Config end*/
& & & &
& & & & /*LCD Pin Config start*/
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//LCD-RS
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOC, &GPIO_InitStructure);& & & &&&
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_3;//LCD-RW E
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &&&GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//LCD-DATA
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOC, &GPIO_InitStructure);& & & && &
& & & & /*LCD Pin Config end*/
& & & & & & & & lcd_init();
& & & & & & & & Init_ADC();& & & && &
& & & & /*Switch init start*/
& & & & & & & & Switch_All_off();
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5;
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOB, &GPIO_InitStructure);
& & & &
& & & & & & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_12;
& & & & & & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& & & & & & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
& & & & & & & & GPIO_Init(GPIOC, &GPIO_InitStructure);& & & &&&
& & & & /*Switch init end*/[/color]
& & & & /*TIM init start*/
& & & & & & & & TIM_DeInit(TIM2);
& & & & & & & & TIM_TimeBaseStructure.TIM_Period = 2500;
& & & & & & & & TIM_TimeBaseStructure.TIM_Prescaler = 71;
& & & & & & & & TIM_TimeBaseStructure.TIM_ClockDivision = 0;
& & & & & & & & TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
& & & & & & & & TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
& & & & & & & & TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE );
& & & & & & & & TIM_Cmd(TIM2,ENABLE);
& & & & & & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
& & & & & & & & NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQC
& & & & & & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
& & & & & & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & & & & & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & & & & & NVIC_Init(&NVIC_InitStructure);& & & && &
& & & & /*TIM init end*/
& & & & }
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2 , TIM_IT_Update) == SET)
{
&&TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
&&if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) GPIO_ResetBits(GPIOA, GPIO_Pin_8);
&&else GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
int main(void)
{
& & Sys_Init();
& & & & while(1)
{
& & & & GPIO_SetBits(GPIOA, GPIO_Pin_12);
& & & & GPIO_ResetBits(GPIOA, GPIO_Pin_12);
& & }
};复制代码
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQC
这个应该是:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQC
Halley 发表于
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQC
这个应该是:
NVIC_InitStructure.NVIC_IRQChanne ...
哦,这是我试验TIM2和TIM3的时候写混了,改过来依然不行,我已经在楼主位改正了。
请帮忙看看还有没有问题?
有可能是函数重入造成的死机:GPIO_SetBits()等函数同时被主程序与中断程序执行。建议在中断中用寄存器方式操作,不要调用库函数。
zydwh 发表于
19:34&&有可能是函数重入造成的死机:GPIO_SetBits()等函数同时被主程序与中断程序执行。建议在中断中用寄存器方 ...
有这个可能?…我现在逐条把语句注释掉,发现只要开着APB1-&TIM2时钟配置或者TIM2的NVIC配置就会没有响应,非常奇怪。
我在想有没有可能是内部时钟造成的?
I am not talking.
millwood0 发表于
21:08&&I am not talking.
请大师指点迷津。
我觉得你这个可能是个低级原因造成的,建议先把所有的无关代码注释掉
你的main里面连个延时都没有,只有两条语句,你是如何知道没进主循环的?就算进了你也不知道啊 是不?
建议你把ADC关掉先,不行换个定时器试试
阿莫电子论坛, 原"中国电子开发网"STM32跳至硬件错误中断(HardFault_Handle)
14:41:04来源: eefocus
1、遇到错误问题是数据类型不对,导致该步骤永远不能执行到,跳至硬件;所以硬件中断可尝试查找数据类型错误。
2、堆栈设置错误也会跳至
3、如果上电后, 在调试时, 执行单步, 会在不确定位置的地方产生HardFault_Handle, 检查一下你的时钟配置(外部晶振频率, SysTemInit/PLLConfig相关函数以及晶振频率宏定义), 可能是超频了...导致了不稳定.
4、如果在使用某些参数时,使用的类型与其定义的类型不同,也可能导致出现跳转hardfault,这种情况下, 一般是不固定的跳转hardfalt,排查问题较麻烦;
5、如果你使用片上flash做参数存储,那么你需要注意了,参数存储区最好从flash的后部往前存,避免参数区与代码区的互相覆盖。如果参数被覆盖了,或者代码被覆盖了,查找Bug就蛋蛋的忧桑了。。。这也会导致跳转hardfault。
关键字:&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或***通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
微信扫一扫加关注 论坛活动 E手掌握
微信扫一扫加关注
芯片资讯 锐利解读
大学堂最新课程
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

参考资料

 

随机推荐