贵阳网站建设多少钱?,罗湖中心区做网站,上海搜索推广,福州网站建设兼职原理部分
1中断示意图#xff0c;中断会打断主函数的执行#xff0c;终端执行完成之后再返回主函数继续执行 2.STM32中断
这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断#xff0c;每个中断通道都拥有16个可编程的优先等级#xff0c;可对优先级进行分组…原理部分
1中断示意图中断会打断主函数的执行终端执行完成之后再返回主函数继续执行 2.STM32中断
这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断每个中断通道都拥有16个可编程的优先等级可对优先级进行分组进一步设置抢占优先级和响应优先级 4.抢占优先级是表示可以直接插队让CPU执行相当于急诊 响应优先级就是看谁的优先级高等待CPU执行完当前任务之后就立马执行优先级最高的相当于平时较重的疾病 5.EXTI框图最终有两个选择第1个表示事件响应触发别的外设操作。第2个表示中断引脚电平触发中断 6.主要看此结构打通一条GPIO到NVIC的中断通路就可以使用中断 7.旋转编码器电路图 实验过程
1.按照江科大老师给的电路链接图进行连接 2.在hardware中新建sensor.c和sensor.h文件夹
3.sensor.h代码如下
#ifndef _SENSOR__H #define _SENSOR__H
void SENSOR_Init(void); uint16_t turn(void); #endif
4.sensor.c代码如下
#include stm32f10x.h
uint16_t CountSensor_Count;
void SENSOR_Init(void) { //使用各个外设前必须开启时钟否则对外设的操作无效 //中断只需开始B口和AFIO即可EXTI和NVIC无需开启时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; //GPIO模式赋值为上拉输出模式 GPIO_InitStructure.GPIO_Pin GPIO_Pin_14; //GPIO引脚赋值为第1,2号引脚 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //GPIO速度赋值为50MHz GPIO_Init(GPIOB, GPIO_InitStructure); //将赋值后的构体变量传递给GPIO_Init函数 //函数内部会自动根据结构体的参数配置相应寄存器 //实现GPIOB的初始化 /*AFIO选择中断引脚*/ //将外部中断的14号线映射到GPIOB即选择PB14为外部中断引脚 //AFIO这个函数在GPIO那个里面 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14); /*EXTI初始化*/ //这个在library中找一下 EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_LineEXTI_Line14; //选择哪个口 EXTI_InitStruct.EXTI_ModeEXTI_Mode_Interrupt; //中断 EXTI_InitStruct.EXTI_TriggerEXTI_Trigger_Rising; //这个需要搜索一下EXTI_Trigger,现在是上升沿触发 EXTI_InitStruct.EXTI_LineCmdENABLE; //中断打开 EXTI_Init(EXTI_InitStruct); //NVIC在初始化之前需要指定中断优先级分组 /*NVIC中断分组*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*NVIC初始化*/ NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannelEXTI15_10_IRQn; //选择配置NVIC的EXTI15_10线因为那个14号线过来的在10-15以内 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority1; //这个是自己给的值越低优先级越高 NVIC_InitStruct.NVIC_IRQChannelSubPriority1; NVIC_InitStruct.NVIC_IRQChannelCmdENABLE; NVIC_Init(NVIC_InitStruct); }
uint16_t turn(void) { return CountSensor_Count; }
//中断函数不需要声明但一定是这个函数名 void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line14)SET) //判断是否是外部中断14号线触发的中断 { if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) 0) { CountSensor_Count ; //计数值自增一次 } EXTI_ClearITPendingBit(EXTI_Line14); //清除外部中断14号线的中断标志位 //中断标志位必须清除 //否则中断将连续不断地触发导致主程序卡死 } }
最后中断函数的设置参考这个红色的一般用于主函数中蓝色的一般用于sensor中 5.main.c代码如下
#include stm32f10x.h // Device header #include OLED.h #include sensor.h
int main() { OLED_Init(); SENSOR_Init(); OLED_ShowString(1, 2, RED_LED:); while (1) { OLED_ShowNum(2, 2, turn(), 5); } } 6.实验结果 注意
ctrlalt空格可以出现代码提示