1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
1.## 使能IO口时钟
单片机的外部中断0-15与输入输出引脚相连,使用外部中断时需要使能对应的IO口时钟。 __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOC时钟 __HAL_RCC_GPIOH_CLK_ENABLE(); //开启GPIOH时钟 2.## 初始化IO口 复位时IO口默认为浮空输入模式,当选择模式为上升沿、下降沿、双边沿触发时会将系统配置寄存器 SYSCFG_EXTICRx寄存器相应位置一,即选择外部中断x的输入源是此I/O口。因为这里用到了系统配置寄存器SYSCFG应该开启SYSCFG时钟,但在调用函数 HAL_GPIO_Init 时如果判断出IO引脚的MODE值设置为上述三种模式就会开启SYSCFG时钟。 #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) || ((MODE) == GPIO_MODE_OUTPUT_PP) || ((MODE) == GPIO_MODE_OUTPUT_OD) || ((MODE) == GPIO_MODE_AF_PP) || ((MODE) == GPIO_MODE_AF_OD) || ((MODE) == GPIO_MODE_IT_RISING) || ((MODE) == GPIO_MODE_IT_FALLING) || ((MODE) == GPIO_MODE_IT_RISING_FALLING) || ((MODE) == GPIO_MODE_EVT_RISING) || ((MODE) == GPIO_MODE_EVT_FALLING) || ((MODE) == GPIO_MODE_EVT_RISING_FALLING) || ((MODE) == GPIO_MODE_ANALOG)) 对于下降沿触发,当中断产生时会输入一个低电平所以应选择上拉输入,即中断未发生时此引脚应是高电平状态;反之对于上升沿触发的外部中断应选择下拉输入;双边沿的话选择无上下拉模式; GPIO_InitTypeDef GPIO_Initure; GPIO_Initure.Pin=GPIO_PIN_0; //PA0 GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发 GPIO_Initure.Pull=GPIO_PULLDOWN; //下拉 HAL_GPIO_Init(GPIOA,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_13; //PC13 GPIO_Initure.Mode=GPIO_MODE_IT_FALLING; //下降沿触发 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 HAL_GPIO_Init(GPIOC,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3; //PH2,3 HAL_GPIO_Init(GPIOH,&GPIO_Initure); 此处回顾一下 普通配置IO设置为 GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); 串口通信设置USART1如下,一般写在回调函数里 GPIO_InitTypeDef GPIO_Initure; if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化 { __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PA9 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速 GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9 GPIO_Initure.Pin=GPIO_PIN_10; //PA10 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 3.## 设置中断优先级,使能中断通道 中断优先组设置在HAL库使能函数 HAL_Init中,根据设置的中断优先组来约束抢占优先级和子优先级的取值范围。 //中断线0-PA0 HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级为2,子优先级为0 HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线0 //中断线2-PH2 HAL_NVIC_SetPriority(EXTI2_IRQn,2,1); //抢占优先级为2,子优先级为1 HAL_NVIC_EnableIRQ(EXTI2_IRQn); //使能中断线2 以上三步可以封装在一个函数中作为外部中断初始化函数。 4.编写中断服务函数和外部中断回调函数 当中断产生时会进入相应的外部中断服务函数,这个函数需要自己编写,和串口中断一样HAL局库提供了一个外部中断通用处理函数HAL_GPIO_EXIT_IRQHandler,我们在自己编写的外部中断服务函数中调用该函数处理中断。HAL_GPIO_EXIT_IRQHandler函数通过判断中断来源引脚最终调用外部中断回调函数 HAL_GPIO_EXTI_Callback来处理中断。 用户通过编写这个回调函数来编写中断处理逻辑,注意所有的外部中断都会调用同一个回调函数。 //中断服务函数 void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);//调用中断处理公用函数 } void EXTI2_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);//调用中断处理公用函数 } 中断处理公用函数定义如下 void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) { /* EXTI line interrupt detected */ if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)//判断中断引脚是否产生中断 { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//清除中断标志位,方便下一次中断产生 HAL_GPIO_EXTI_Callback(GPIO_Pin); } } 中断回调函数及要实现的中断处理如下 //中断服务程序中需要做的事情 //在HAL库中所有的外部中断服务函数都会调用此函数 //GPIO_Pin:中断引脚号 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { delay_ms(100); //消抖 switch(GPIO_Pin) { case GPIO_PIN_0: if(WK_UP==1) { LED1=!LED1;//控制LED0,LED1互斥点亮 LED0=!LED1; } break; case GPIO_PIN_2: if(KEY1==0) //LED1翻转 { LED1=!LED1; } break; case GPIO_PIN_3: if(KEY0==0) //同时控制LED0,LED1翻转 { LED0=!LED0; LED1=!LED1; } break; case GPIO_PIN_13: if(KEY2==0) { LED0=!LED0;//控制LED0翻转 } break; } } 只要是按键操作就必须要加防抖动操作 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1820 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1634 浏览 1 评论
1104 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
740 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1692 浏览 2 评论
1951浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
756浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
586浏览 3评论
605浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 22:32 , Processed in 0.757623 second(s), Total 74, Slave 58 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号