赵县住房和城乡建设局网站优质网站建设方案
赵县住房和城乡建设局网站,优质网站建设方案,公众号微博seo,简单的网站建设公司中断
目录
中断
一、中断的概念
1.1.中断的基本概念
1.2.中断编程举例
二、中断优先级
2.1.中断优先级的概念
2.2.中断优先级的表示方法
2.2.1中断结构框图
2.2.2.嵌套中断向量控制器#xff08;NVIC#xff09;
2.3.抢占优先级与中断嵌套
2.4.子占优先级与中断排…中断目录中断一、中断的概念1.1.中断的基本概念1.2.中断编程举例二、中断优先级2.1.中断优先级的概念2.2.中断优先级的表示方法2.2.1中断结构框图2.2.2.嵌套中断向量控制器NVIC2.3.抢占优先级与中断嵌套2.4.子占优先级与中断排队2.5.练习三、串口中断编程实验3.1.编写闪灯代码3.2.初始化串口3.3.让RxNE标志位触发中断3.4.配置NVIC模块3.4.1.配置中断优先级分组3.4.2.设置中断优先级、闭合开关3.5.编写中断响应函数3.6.总代码一、中断的概念1.1.中断的基本概念单片机应对突发事件的一种生活中的突发事件单片机的突发事件常规程序中断相应函数1.2.中断编程举例串口发送数据控制LED闪烁速率闪灯程序串口数据接收程序如果直接合并程序假设亮灯需要100ms灭灯需要100ms一次完整的闪灯周期为200ms但只有在每次执行判断串口RXNE标志位时才会检查串口是否有数据如果数据在闪灯延迟期间送达就会被延迟到下一次轮询时才能处理串口波特率为115200bps数据帧格式为1位停止位8位数据位1位校验位115200 / 10 11520串口每秒中最多可以接收11520个字节如果使用中断当串口接收到数据时会触发中断CPU立即停止主循环的闪灯程序转而去执行中断服务函数来读取并且处理数据二、中断优先级2.1.中断优先级的概念在第一个事例中正在给病人1看病病人2比病人3先到但病人3需要赶火车所以先看病人3在第二个事例中正在给病人4看病但病人5病情较急所以先给病人5看病优先级优先处理重要紧急的事情用数字表示中断的紧急程度2.2.中断优先级的表示方法2.2.1中断结构框图片上外设芯片内部模块每一种模块都有对应的功能中断芯片上的片上外设可以产生中断例USART模块的全局中断由标志位控制嵌套中断向量控制器NVIC中断的管理员根据中断的优先级进行排队、嵌套中断时序图反映中断的时序流程中断向量表CPU响应中断时从中断向量表中寻找中断响应函数2.2.2.嵌套中断向量控制器NVIC配置中断优先级分组设置抢占优先级和子优先级控制中断开关2.3.抢占优先级与中断嵌套中断嵌套更高优先级的中断打断正在执行的中断中断嵌套的条件新中断的抢占优先级更高示例假设中断优先级分组为2序号抢占优先级子优先级中断11001102011中断21000102000中断30011000113中断41110113102注抢占优先级越小优先级越高判断中断1的抢占优先级与中断2的抢占优先级都为2不会发生中断嵌套中断3的抢占优先级比中断1的抢占优先级小所以比中断1的优先级高会发生中断嵌套中断1的抢占优先级比中断4的抢占优先级小所以中断1的优先级高不会发生中断嵌套2.4.子占优先级与中断排队中断排队优先级相仿等待前一个中断执行完再处理新中断因为抢占优先级相仿不会打断当前中断的执行子占优先级高的排在前面子占优先级相同则根据先来后到排队2.5.练习中断优先级分组2三、串口中断编程实验3.1.编写闪灯代码#include stm32f10x.h #include delay.h //声明板载LED初始化函数 void App_OnBoardLED_Init(void); //创建闪灯间隔变量 uint32_t blinkInterval 1000; int main(void) { App_OnBoardLED_Init(); while(1) { /*点亮板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); /*延迟*/ Delay(blinkInterval); /*熄灭板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); /*延迟*/ Delay(blinkInterval); } } //创建板载LED初始化函数 void App_OnBoardLED_Init(void) { /*启动GPIOC时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /*声明GPIO结构变量*/ GPIO_InitTypeDef GPIO_InitStruct; /*选择PC13引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_13; /*输出开漏模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_OD; /*最大输出速率为2MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_2MHz; /*初始化PA0引脚*/ GPIO_Init(GPIOC,GPIO_InitStruct); }3.2.初始化串口//创建USART1初始化函数 void App_USART1_Init(void) { /*GPIO结构前置声明*/ GPIO_InitTypeDef GPIO_InitStruct; //配置发送端Tx对应的PA9引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA9引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_9; /*设置复用输出推挽模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; /*最大输出速度为10MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_10MHz; /*初始化PA9引脚*/ GPIO_Init(GPIOA,GPIO_InitStruct); //配置接收端Rx对应的PA10引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA10引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_10; /*设置输入上拉模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU; /*初始化PA10引脚*/ GPIO_Init(GPIOA, GPIO_InitStruct); //初始化串口 /*开启USART1模块时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /*USART结构前置声明*/ USART_InitTypeDef USART_InitStruct; /*波特率为115200*/ USART_InitStruct.USART_BaudRate 115200; /*硬件流控设为无*/ USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; /*数据位为8位*/ USART_InitStruct.USART_WordLength USART_WordLength_8b; /*停止位为1位*/ USART_InitStruct.USART_StopBits USART_StopBits_1; /*校验方式为无*/ USART_InitStruct.USART_Parity USART_Parity_No; /*收发方向为双向*/ USART_InitStruct.USART_Mode USART_Mode_Tx | USART_Mode_Rx; /*初始化USART1*/ USART_Init(USART1,USART_InitStruct); /*闭合串口总开关*/ USART_Cmd(USART1,ENABLE); }3.3.让RxNE标志位触发中断每当串口接收到数据时就要产生一个中断可以通过串口的RxNE标志位判断每当RxNE从0变为1时说明串口收到数据逻辑或门只要有一个数据为1就输出1只有当所有数据为0才输出0要想使标志位触发中断需要闭合中断屏蔽开关void USART_ITConfig(USART_TypeDef* USARTx,uint16_t USART_IT,FunctionalState NewState);解析参数1串口的名称 USART1 USART2参数2标志位的名称USART_IT_TXEUSART_IT_TCUSART_IT_RXNEUSART_IT_PEUSART_IT_ERR参数3开关状态闭合ENABLE断开DISABLE作用配置USART的中断函数//创建USART1初始化函数 void App_USART1_Init(void) { /*GPIO结构前置声明*/ GPIO_InitTypeDef GPIO_InitStruct; //配置发送端Tx对应的PA9引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA9引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_9; /*设置复用输出推挽模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; /*最大输出速度为10MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_10MHz; /*初始化PA9引脚*/ GPIO_Init(GPIOA,GPIO_InitStruct); //配置接收端Rx对应的PA10引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA10引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_10; /*设置输入上拉模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU; /*初始化PA10引脚*/ GPIO_Init(GPIOA, GPIO_InitStruct); //初始化串口 /*开启USART1模块时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /*USART结构前置声明*/ USART_InitTypeDef USART_InitStruct; /*波特率为115200*/ USART_InitStruct.USART_BaudRate 115200; /*硬件流控设为无*/ USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; /*数据位为8位*/ USART_InitStruct.USART_WordLength USART_WordLength_8b; /*停止位为1位*/ USART_InitStruct.USART_StopBits USART_StopBits_1; /*校验方式为无*/ USART_InitStruct.USART_Parity USART_Parity_No; /*收发方向为双向*/ USART_InitStruct.USART_Mode USART_Mode_Tx | USART_Mode_Rx; /*初始化USART1*/ USART_Init(USART1,USART_InitStruct); /*闭合串口总开关*/ USART_Cmd(USART1,ENABLE); //配置中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); }3.4.配置NVIC模块3.4.1.配置中断优先级分组void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);解析参数分组方式选择NVIC_PriorityGroup_00位抢占优先级4位子优先级NVIC_PriorityGroup_11位抢占优先级3位子优先级NVIC_PriorityGroup_22位抢占优先级2位子优先级NVIC_PriorityGroup_33位抢占优先级1位子优先级NVIC_PriorityGroup_44位抢占优先级0位子优先级3.4.2.设置中断优先级、闭合开关void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);解析参数初始化的参数结构体地址作用初始化NVIC配置NVIC的各种参数补充NVIC_InitTypeDef结构struct NVIC_InitTypeDef { uint8_t NVIC_IRQChannel; uint8_t NVIC_IRQChannelPreemptionPriority; uint8_t NVIC_IRQChannelSubPriority; FunctioalState NVIC_IRQChannelCmd; };分析1.NVIC_IRQChannel中断的名称见stm32f10.h IRQn2.NVIC_IRQChannelPreemptionPriority抢占优先级3.NVIC_IRQChannelSubPriority子优先级4.NVIC_IRQChannelCmd开关状态int main(void) { /*设置中断优先级分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); App_OnBoardLED_Init(); App_USART1_Init() while(1) { /*点亮板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); /*延迟*/ Delay(blinkInterval); /*熄灭板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); /*延迟*/ Delay(blinkInterval); } } //创建USART1初始化函数 void App_USART1_Init(void) { /*GPIO结构前置声明*/ GPIO_InitTypeDef GPIO_InitStruct; //配置发送端Tx对应的PA9引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA9引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_9; /*设置复用输出推挽模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; /*最大输出速度为10MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_10MHz; /*初始化PA9引脚*/ GPIO_Init(GPIOA,GPIO_InitStruct); //配置接收端Rx对应的PA10引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA10引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_10; /*设置输入上拉模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU; /*初始化PA10引脚*/ GPIO_Init(GPIOA, GPIO_InitStruct); //初始化串口 /*开启USART1模块时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /*USART结构前置声明*/ USART_InitTypeDef USART_InitStruct; /*波特率为115200*/ USART_InitStruct.USART_BaudRate 115200; /*硬件流控设为无*/ USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; /*数据位为8位*/ USART_InitStruct.USART_WordLength USART_WordLength_8b; /*停止位为1位*/ USART_InitStruct.USART_StopBits USART_StopBits_1; /*校验方式为无*/ USART_InitStruct.USART_Parity USART_Parity_No; /*收发方向为双向*/ USART_InitStruct.USART_Mode USART_Mode_Tx | USART_Mode_Rx; /*初始化USART1*/ USART_Init(USART1,USART_InitStruct); /*闭合串口总开关*/ USART_Cmd(USART1,ENABLE); //配置中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置NVIC /*声明NVIC结构变量*/ NVIC_InitTypeDef NVIC_InitStruct; /*设置USART1中断名称*/ NVIC_InitStruct.NVIC_IRQChannel USART1_IRQn; /*设置抢占优先级*/ NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 0; /*子优先级*/ NVIC_InitStruct.NVIC_IRQChannelSubPriority 0; /*闭合中断开关*/ NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE; /*初始化NVIC*/ NVIC_Init(NVIC_InitStruct); }3.5.编写中断响应函数//创建USART中断响应函数 void USART1_IRQHandler(void) { /*判断中断产生原因*/ if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) SET) { uint8_t dataRcvd USART_ReceiveData(USART1); if(dataRcvd 0) { blinkInterval 1000; } else if(dataRcvd 1) { blinkInterval 200; } else if(dataRcvd 2) { blinkInterval 50; } } }3.6.总代码#include stm32f10x.h #include delay.h //声明板载LED初始化函数 void App_OnBoardLED_Init(void); //声明USART1初始化函数 void App_USART1_Init(void); //声明USART中断响应函数 void USART1_IRQHandler(void); //创建闪灯间隔变量 uint32_t blinkInterval 1000; int main(void) { /*设置中断优先级分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); App_OnBoardLED_Init(); App_USART1_Init(); while(1) { /*点亮板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); /*延迟*/ Delay(blinkInterval); /*熄灭板载LED*/ GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); /*延迟*/ Delay(blinkInterval); } } //创建USART中断响应函数 void USART1_IRQHandler(void) { /*判断中断产生原因*/ if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) SET) { uint8_t dataRcvd USART_ReceiveData(USART1); if(dataRcvd 0) { blinkInterval 1000; } else if(dataRcvd 1) { blinkInterval 200; } else if(dataRcvd 2) { blinkInterval 50; } } } //创建USART1初始化函数 void App_USART1_Init(void) { /*GPIO结构前置声明*/ GPIO_InitTypeDef GPIO_InitStruct; //配置发送端Tx对应的PA9引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA9引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_9; /*设置复用输出推挽模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_AF_PP; /*最大输出速度为10MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_10MHz; /*初始化PA9引脚*/ GPIO_Init(GPIOA,GPIO_InitStruct); //配置接收端Rx对应的PA10引脚 /*开启GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /*选择PA10引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_10; /*设置输入上拉模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU; /*初始化PA10引脚*/ GPIO_Init(GPIOA, GPIO_InitStruct); //初始化串口 /*开启USART1模块时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /*USART结构前置声明*/ USART_InitTypeDef USART_InitStruct; /*波特率为115200*/ USART_InitStruct.USART_BaudRate 115200; /*硬件流控设为无*/ USART_InitStruct.USART_HardwareFlowControl USART_HardwareFlowControl_None; /*数据位为8位*/ USART_InitStruct.USART_WordLength USART_WordLength_8b; /*停止位为1位*/ USART_InitStruct.USART_StopBits USART_StopBits_1; /*校验方式为无*/ USART_InitStruct.USART_Parity USART_Parity_No; /*收发方向为双向*/ USART_InitStruct.USART_Mode USART_Mode_Tx | USART_Mode_Rx; /*初始化USART1*/ USART_Init(USART1,USART_InitStruct); /*闭合串口总开关*/ USART_Cmd(USART1,ENABLE); //配置中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置NVIC /*声明NVIC结构变量*/ NVIC_InitTypeDef NVIC_InitStruct; /*设置USART1中断名称*/ NVIC_InitStruct.NVIC_IRQChannel USART1_IRQn; /*设置抢占优先级*/ NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 0; /*子优先级*/ NVIC_InitStruct.NVIC_IRQChannelSubPriority 0; /*闭合中断开关*/ NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE; /*初始化NVIC*/ NVIC_Init(NVIC_InitStruct); } //创建板载LED初始化函数 void App_OnBoardLED_Init(void) { /*启动GPIOC时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); /*声明GPIO结构变量*/ GPIO_InitTypeDef GPIO_InitStruct; /*选择PC13引脚*/ GPIO_InitStruct.GPIO_Pin GPIO_Pin_13; /*输出开漏模式*/ GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_OD; /*最大输出速率为2MHz*/ GPIO_InitStruct.GPIO_Speed GPIO_Speed_2MHz; /*初始化PA0引脚*/ GPIO_Init(GPIOC,GPIO_InitStruct); }