中断系统编程步骤.docx
- 文档编号:18935184
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:10
- 大小:169.93KB
中断系统编程步骤.docx
《中断系统编程步骤.docx》由会员分享,可在线阅读,更多相关《中断系统编程步骤.docx(10页珍藏版)》请在冰豆网上搜索。
中断系统编程步骤
中断系统编程步骤:
以“按K1(按键K1接到PB7管脚)产生一次EXTI中断,L3(L3接到PC13管脚)将闪烁一次。
〞为例。
第一局部配置中断系统
步骤一参加以下头文件:
#include"stm32f10x_lib.h"
//假设使用RCC_Configuration();使能外设对应的时钟,还必须参加以下头文件。
//假设使用具体的使能外设时钟命令〔例如,RCC_APB2PeriphClockCmd()等〕,那么不需要参加以下头文件。
#include"HelloRobot.h"//〔包含RCC_Configuration、GPIO_Configuration、USART_Configuration、NVIC_Configuration这3个函数的HelloRobot.h文件〕
步骤二GPIO配置:
①定义用于初始化GPIOx端口参数的构造体变量
GPIO_InitTypeDefGPIO_InitStructure;
②使能GPIO端口外设对应的时钟〔或RCC_Configuration();)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
③定义GPIOx端口管脚、响应速度、工作模式,即定义GPIO端口的初始化参数〔通过为构造体变量GPIO_InitStructure的成员赋值实现〕:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
//GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
④〔调用函数GPIO_Init()来〕初始化GPIOx端口,〔完成对端口中的存放器的设置。
〕
GPIO_Init(GPIOB,&GPIO_InitStructure);
----------
以上的步骤二,可以打包在一个函数GPIO_Configuration()中。
在main函数中,仅仅调用该函数即可。
使得main程序简介、明了。
步骤三EXTI的配置:
①定义用于初始化EXTI(外部中断/事件)参数的构造体变量:
EXTI_InitTypeDefEXTI_InitStructure;
②使能EXTI外设对应的时钟----注意:
当使用EXTI外设时,使能的是AFIO时钟,而不是EXTI外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
注意:
使能AFIO时钟时候,最好与使能GPIO端口外设对应的时钟一起使能〔用位或运算符〕。
否那么,常会无法进入EXTIx的中断处理程序。
建议在main〔〕函数中,变量定义以后,把所有用到的外设的时钟一起使能。
可以把所有外设的时钟使能,打包在一个函数RCC_Configuration()中〔注意:
它不是HelloRobot.h中的RCC_Configuration(),而是我们自己定义的,用于存放所有外设的时钟使能函数〕。
③选择GPIO管脚,接EXTI线路-----EXTI编程特有的语句
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);
以下是定义EXTI的初始化参数
④选择EXTI线路:
〔EXTI_Line0~EXTI_Line19〕
EXTI_InitStructure.EXTI_Line=EXTI_Line7;
⑤选择EXTI的模式:
〔中断请求模式或事件请求模式〕
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
⑥选择EXTI的触发方式:
〔上升沿触发、下升沿触发或上升沿和下升沿触发〕
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
⑦选中的EXTI线路〔在④中选中的EXTI线路〕的中断使能或中断失能:
ENABLE或DISABLE
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
注:
类似于:
MCS-51单片机的各中断源的中断允许位〔作为分控制位〕置1:
例如外部中断0的中断允许控制位EX0=1,定时器/计数器T0的中断允许控制位ET0=1.
⑧〔根据EXTI_InitStruct中指定的参数,调用函数EXTI_Init()来〕初始化外设EXTI,〔完成对外设EXTI存放器的设置。
〕
EXTI_Init(&EXTI_InitStructure);
注意:
〔i〕EXTIx(外部中断/事件)源类似于MCS-51单片机的INT0、INT1外部中断源。
〔ii〕当中断不是来自EXTIx,那么程序中,就不需要写入与EXTI有关的程序。
----------
以上的步骤三,可以打包在一个函数EXTI_Configuration()中。
在main函数中,仅仅调用该函数即可。
使得main程序简单、明了。
步骤四NVIC配置:
①定义用于初始化嵌套中断向量控制器(NVIC)参数的构造体变量:
NVIC_InitTypeDefNVIC_InitStructure;
②配置优先级组:
〔第0组~第4组,即NVIC_PriorityGroup_0~NVIC_PriorityGroup_4〕-----NVIC编程特有的语句
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
以下是定义NVIC的初始化参数
②选择中断通道〔中断IRQ通道〕
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQChannel;
③设置选中的中断通道的抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//0级抢占优先级
④设置选中的中断通道的子优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//0级次优先级
⑤选中的中断通道的中断使能
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
注:
类似于:
MCS-51单片机的总的中断使能信号EA=1.
⑥〔根据NVIC_InitStructure中指定的参数,调用函数NVIC_Init()来〕初始化NVIC嵌套向量中断控制器,〔完成对NVIC存放器的设置。
〕
NVIC_Init(&NVIC_InitStructure);
----------
以上的步骤四,可以打包在一个函数NVIC_Configuration()中。
在main函数中,仅仅调用该函数即可。
使得main程序简单、明了。
第二局部编写while
(1)死循环和中断效劳函数
步骤五编写while
(1)死循环程序:
例一
while
(1);
例二
while
(1)
{
……
}
步骤六编写中断效劳函数:
各种中断效劳函数的实现:
在固件函数库stm32f10x_it.c文件中。
翻开\library\src目录下的stm32f10x_it.c这个文件,可以看到***_IRQHandler函数的实现,虽然说是实现,但是几乎都是空的。
这些函数就是要开发者填写的中断效劳〔处理〕函数,如果你用到了哪个中断来做相应的处理,你就要填写相应的中断效劳〔处理〕函数。
〔实质上,中断效劳子程序的函数名:
它是严格按照stm32f10x_vector.s文件中的中断向量表中,对应的向量名来命名,两者必须一致。
〕
……
例如,当我们用PE4口线作为外部中断源时,所对应的中断处理函数是EXTI4_IRQHandler()
{
}
或
当我们用PB7口线作为外部中断源时,所对应的中断处理函数是
(i)用for(i=0;i<1000000;i++);语句实现延时:
voidEXTI9_5_IRQHandler(void)
{
u32i;
if(EXTI_GetITStatus(EXTI_Line7)==SET)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
for(i=0;i<1000000;i++);//系统时钟Systemclock为8MHz
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line7);
}
}
(ii)用Delay(1000000);语句实现延时:
voidEXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line7)==SET)
{
/*TogglePC13pin*/
GPIO_SetBits(GPIOC,GPIO_Pin_13);
Delay(1000000);//系统时钟Systemclock为8MHz
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
/*CleartheEXTIline7pendingbit*/
EXTI_ClearITPendingBit(EXTI_Line7);
}
}
voidDelay(vu32n1)
{
while(n1--);
}
注意:
①EXTI_ClearITPendingBit(EXTI_Line7);必须放在if()语句的最后。
否那么,假设放在Delay(1000000);函数前,那么会导致每次按下K1(按键K1接到PB7管脚)时,灯经常会闪烁2次。
--可以理解为,假设中断处理程序中,一上来就去除中断请求标志位,会因按键抖动,导致外部又产生一个下降沿,向CM3发出中断请求。
虽然,当前的中断处理程序还没有完成,但新的中断请求,会保存在挂起请求存放器中〔这是由stm32单片机的EXTI控制器内部构造所决定〕。
直到CM3响应为止。
即执行2次中断处理程序,闪烁2次。
假设去除中断请求标志位放在中断处理程序最后,因中断处理程序中的Delay(1000000);起到按键消抖动的功能,根本不会因按键抖动,导致外部又产生一个中断请求。
②假设灯还会经常闪烁2次,这说明延时时间太短。
按键刚按键,延时就已经到了,中断标志位就已经去除。
后面假设按键有抖动,会造成再次发起中断请求,造成灯又一次闪烁。
处理方法:
应加大延时时间。
③假设系统时钟Systemclock为72MHz,那么延时时间应该在后面再加个0
for(i=0;i<10000000;i++);//系统时钟Systemclock为72MHz
或
Delay(10000000);//系统时钟Systemclock为72MHz
比拟:
〔1〕用GPIO编程读键值:
不仅要考虑去抖动、还要考虑等待键释放。
程序如下
用软件实现按键的去抖动功能。
按一次键,不管时间长短,只能加1或减1
if(!
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))//判断K1是否按下
{Delay(90000);//去键抖动:
在键按下后,软件延时〔一般应为12ms〕,
if(!
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))//再判断K1是否按下,假设有,那么认为是一个确定的键按下
{
while(!
GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7));//等待键释放。
防止按键还未释放,程序返回执行时,又再次识别按键K1按下,执行按键处理程序
。
。
。
。
。
。
。
。
。
。
。
//按键K1,按下的处理程序
例如,++disp_ln3;
}
}
〔2〕用EXTI编程读键值:
仅仅需要考虑去抖动、不需要考虑等待键释放。
但要考虑清楚中断请求标志位。
注意:
①在EXTI的中断处理程序中,必须加一个for(i=0;i<1000000;i++);或Delay(1000000);-----起到按键消抖动的功能;
②去除中断标志位函数,即EXTI_ClearITPendingBit(EXTI_Linex);必须放在延时函数for(i=0;i<1000000;i++);或Delay(1000000);之后。
假设EXTI_GetITStatus(EXTI_Linex)函数的返回值是SET,说明此时确实有中断发生了。
去除中断标志位,即EXTI_ClearITPendingBit(EXTI_Linex);以防退出后,重复进入中断处理程序。
〔假设该语句去掉,会造成连接到PC13管脚上的LED灯常亮,∵没有去除中断标志,导致一旦退出中断处理程序,又立即进入中断处理程序〕
注意:
“挂起请求存放器〞保存各中断的中断请求,一旦该中断请求得到CM3的响应,进入该中断的中断处理程序,就必须手动去除该中断的中断请求标志位〔保存在“挂起请求存放器〞中〕。
否那么,一旦退出中断处理程序,CM3会再次响应该中断的请求,再次进入该中断的中断处理程序。
例:
/*GetthestatusofEXTIline7*/
ITStatusEXTIStatus;
EXTIStatus=EXTI_GetITStatus(EXTI_Line7);
例:
/*ClearstheEXTIline7interruptpendingbit*/
EXTI_ClearITpendingBit(EXTI_Line7);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断系统 编程步骤 中断 系统 编程 步骤