1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STM32F407-外部中断

STM32F407-外部中断

时间:2022-06-29 03:42:13

相关推荐

STM32F407-外部中断

中断控制器

STM32的中断控制器是NVIC,可嵌套式中断控制。

中断优先级。一共有四位来表示,且这四位又被分为 组优先级和子优先级

外部中断

stm32中存在外部中断,管理着所有GPIO口的中断响应,有外部中断0-15,对应着GPIOX的 0-15端口。即外部中断线0 可以是PA0、PB0、PC0.。。。。,使用时进行配置,告诉外部中断使用的是哪个GPIO的哪个口。

外部中断 exti 在总线APB2上,使用时要先打开APB2总线时钟。

代码

使用四个按键来触发中断;按键连接在 PF9/8/7 PE6

void my_exti_init(void){//使能外部中断,外部中断 EXTI 在APB2总线上RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//配置EXTI,告诉外部中断,哪些端口要开启中断SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource9);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource8);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource6);//配置 F9 F8 F7 E6,这四个按键所在的GPIO口的中断,这样按下按键就会触发中断//配置NVIC 中断相关的参数//1)配置NVIC的分组方式NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2)调用NVIC的初始化函数NVIC_InitTypeDef Nvic_Value;Nvic_Value.NVIC_IRQChannel = EXTI9_5_IRQn;//选择中断号Nvic_Value.NVIC_IRQChannelCmd = ENABLE;//使能该中断Nvic_Value.NVIC_IRQChannelPreemptionPriority = 2;//配置组优先级的级别Nvic_Value.NVIC_IRQChannelSubPriority = 2;//配置子优先级的级别NVIC_Init(&Nvic_Value);//按照上述配置初始化NVIC控制器//配置EXTI相关的初始化参数EXTI_InitTypeDef Exti_Value;Exti_Value.EXTI_Line = EXTI_Line9 | EXTI_Line8 | EXTI_Line7 | EXTI_Line6;//选择外部中断号Exti_Value.EXTI_LineCmd = ENABLE;//使能外部中断Exti_Value.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式Exti_Value.EXTI_Trigger = EXTI_Trigger_Falling;//选择下降沿触发EXTI_Init(&Exti_Value);}

中断触发时的响应函数

void EXTI9_5_IRQHandler(void){//判断具体是哪个端口触发了中断,读取每个中断标志位;处理完之后要手动清除中断标志位if(EXTI_GetITStatus(EXTI_Line9) == SET)//判断是否是由EXTI9触发的中断{handler0();//调用处理函数EXTI_ClearITPendingBit(EXTI_Line9);//清除EXTI9的中断标志位}if(EXTI_GetITStatus(EXTI_Line8) == SET){handler1();EXTI_ClearITPendingBit(EXTI_Line8);}if(EXTI_GetITStatus(EXTI_Line7) == SET){handler2();EXTI_ClearITPendingBit(EXTI_Line7);}if(EXTI_GetITStatus(EXTI_Line6) == SET){handler3();EXTI_ClearITPendingBit(EXTI_Line6);}}

handler 为自定义的响应函数,由main函数传递过来

typedef void (*my_callback_func)(void);void my_exti_set_callback_func(my_callback_func func0, \my_callback_func func1,\my_callback_func func2,\my_callback_func func3){handler0 = func0;handler1 = func1;handler2 = func2;handler3 = func3;}

main函数

int main(void){my_led_init();key_init();my_systemclk_init();my_exti_init();my_exti_set_callback_func(func0,func1,func2,func3);while(1) ;}void func0(void){my_led_on_num(0);}void func1(void){my_led_on_num(1);}void func2(void){my_led_on_num(2);}void func3(void){my_led_off();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。