中断系统编程步骤文档格式.docx

上传人:b****2 文档编号:805040 上传时间:2023-04-29 格式:DOCX 页数:10 大小:169.93KB
下载 相关 举报
中断系统编程步骤文档格式.docx_第1页
第1页 / 共10页
中断系统编程步骤文档格式.docx_第2页
第2页 / 共10页
中断系统编程步骤文档格式.docx_第3页
第3页 / 共10页
中断系统编程步骤文档格式.docx_第4页
第4页 / 共10页
中断系统编程步骤文档格式.docx_第5页
第5页 / 共10页
中断系统编程步骤文档格式.docx_第6页
第6页 / 共10页
中断系统编程步骤文档格式.docx_第7页
第7页 / 共10页
中断系统编程步骤文档格式.docx_第8页
第8页 / 共10页
中断系统编程步骤文档格式.docx_第9页
第9页 / 共10页
中断系统编程步骤文档格式.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

中断系统编程步骤文档格式.docx

《中断系统编程步骤文档格式.docx》由会员分享,可在线阅读,更多相关《中断系统编程步骤文档格式.docx(10页珍藏版)》请在冰点文库上搜索。

中断系统编程步骤文档格式.docx

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_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程序简单、明了。

 

步骤四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()中。

第二局部编写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;

//系统时钟Systemclock为8MHz

GPIO_ResetBits(GPIOC,GPIO_Pin_13);

EXTI_ClearITPendingBit(EXTI_Line7);

}

}

(ii)用Delay(1000000);

if(EXTI_GetITStatus(EXTI_Line7)==SET)

/*TogglePC13pin*/

GPIO_SetBits(GPIOC,GPIO_Pin_13);

Delay(1000000);

GPIO_ResetBits(GPIOC,GPIO_Pin_13);

/*CleartheEXTIline7pendingbit*/

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;

10000000;

//系统时钟Systemclock为72MHz

Delay(10000000);

比拟:

〔1〕用GPIO编程读键值:

不仅要考虑去抖动、还要考虑等待键释放。

程序如下

用软件实现按键的去抖动功能。

按一次键,不管时间长短,只能加1或减1

if(!

GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))//判断K1是否按下

{Delay(90000);

//去键抖动:

在键按下后,软件延时〔一般应为12ms〕,

GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))//再判断K1是否按下,假设有,那么认为是一个确定的键按下

{

while(!

GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7));

//等待键释放。

防止按键还未释放,程序返回执行时,又再次识别按键K1按下,执行按键处理程序

//按键K1,按下的处理程序

例如,++disp_ln3;

}

〔2〕用EXTI编程读键值:

仅仅需要考虑去抖动、不需要考虑等待键释放。

但要考虑清楚中断请求标志位。

①在EXTI的中断处理程序中,必须加一个for(i=0;

或Delay(1000000);

-----起到按键消抖动的功能;

②去除中断标志位函数,即EXTI_ClearITPendingBit(EXTI_Linex);

必须放在延时函数for(i=0;

之后。

假设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);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2