建站服务外贸,1.电子商务网站建设的核心是( ),设计公司官网首页,网站制作优质公司目录
一、 硬件板及设计目的
二、建立工程
1.配置GPIO
2.配置时钟源和Debug
3.配置系统时钟
4.配置NVIC
三、代码编写
四、修改HAL_GPIO_EXTI_IRQHandler() 一、 硬件板及设计目的 本文使用的硬件板是ST的开发板NUCLEO-G474RE#xff0c;板上MCU型号为ST…目录
一、 硬件板及设计目的
二、建立工程
1.配置GPIO
2.配置时钟源和Debug
3.配置系统时钟
4.配置NVIC
三、代码编写
四、修改HAL_GPIO_EXTI_IRQHandler() 一、 硬件板及设计目的 本文使用的硬件板是ST的开发板NUCLEO-G474RE板上MCU型号为STM32G474RET6。并按照资源提示设计制造了扩展IO板有需要此扩展板的留言联系我。 本例设计目的及其功能和操作流程如下。
按下KeyLeft键时使LED1的输出翻转。按下KeyRight键时使LED2的输出翻转。按下KeyUp键时使LED1和LED2的输出都翻转。KeyDown键按下时产生EXTI0软中断模拟KeyUp键按下。 用户标签 引脚名称 引脚功能 GPIO模式 默认电平 上拉或下拉 LED1 PB11 GPIO_Output 推挽输出 High 上拉 LED2 PB12 GPIO_Output 推挽输出 High 上拉 KeyRight K1 PA0 EXTI0 输入 上拉 KeyDown K2 PA1 EXTI1 输入 上拉 KeyLeft K3 PA6 EXTI[9:5] 输入 上拉 KeyUp K5 PA7 EXTI[9:5] 输入 上拉
二、建立工程
1.配置GPIO
配置PB11、PB12GPIO OUTPUT默认High LevelPPPullUpHigh Speed标识为LED1LED2;配置PA0EXTI0PP标识为KeyRight配置PA1EXTI1PP标识为KeyDown配置PA6EXTI[9:5]PP标识为KeyLeft配置PA7EXTI[9:5]PP标识为KeyUp
2.配置时钟源和Debug 打开System Core中的RCC高速时钟(HSE)选择Crystal/ eramic Resonator使用片外时钟晶体作为HSE的时钟源。在SYS中将Debug设置Serial Wire。
3.配置系统时钟 将系统时钟(SYSCLK)频率配置为170 MHz。
4.配置NVIC 配置Time base的抢占式优先级为0配置EXTI0、EXTI1的抢占式优先级为1配置EXTI[9:5]的抢占式优先级为2这样处理后当优先级1的中断执行期间触发优先级为2的中断时不会及时响应直到优先级为1的中断执行完毕才去执行优先级为2的中断。
三、代码编写 为实现设计目的只需要在main.c的程序里添加外部中断的回调函数就可以。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){if (GPIO_Pin KeyUp_Pin) //PA7KeyUp, 使两个LED输出翻转{HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);HAL_Delay(500); //软件消除按键抖动的影响}else if(GPIO_Pin KeyRight_Pin) //PA0KeyRight, 使LED2 输出翻转{HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);HAL_Delay(500); //软件消除按键抖动的影响,观察优先级的作用}else if (GPIO_Pin KeyDown_Pin) //PA1KeyDown产生EXTI0 软中断{__HAL_GPIO_EXTI_GENERATE_SWIT(GPIO_PIN_0); //产生EXTI0 软中断HAL_Delay(500); //这个延时也是必要的否则由于按键抖动会两次触发}else if (GPIO_Pin KeyLeft_Pin) //PA6KeyLeft, 使LED1输出翻转{HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);HAL_Delay(1000); //软件消除按键抖动的影响,观察优先级的作用}}/* USER CODE END 4 */
四、修改HAL_GPIO_EXTI_IRQHandler() 完成回调函数的代码后下载到开发板上进行测试时按键按下后的响应并不如预期预期的现象是每按下一个按键翻转对应的LED再次按下按键再翻转。例如按下 Keyup键后两个LED会出现无规律的现象亮灭两次、或不亮、或亮了后又熄灭这不是按键抖动影响的。这是由ISR中调用的外部中断通用处理函数HAL_GPIO_EXTI_IRQHandler()的代码引起的这个函数的代码如下
/*** brief Handle EXTI interrupt request.* param GPIO_Pin Specifies the port pin connected to corresponding EXTI line.* retval None*/
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) ! 0x00u){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
} 这个函数在检测到中断挂起标志后先清除中断挂起标志然后再执行回调函数。一般的中断通用处理函数都是这样的处理流程是为了硬件能及时响应下一次中断。但是对于检测按键输入的外部中断这是有问题的因为清除中断挂起标志后按键的抖动就会触发下一次中断并将中断挂起标志置位。虽然在回调函数里使用了延时但是回调函数退出后NVIC检测到中断挂起标志被置位就会再执行一次回调函数。 所以对于外部中断方式的按键输入检测需要修改一下HAL_GPIO_EXTI_IRQHandler() 的代码将清除中断挂起标志位的功能放在后面即修改为如下的代码这样修改后的程序运行就实现了设计想要达到的目的了。
/*** brief Handle EXTI interrupt request.* param GPIO_Pin Specifies the port pin connected to corresponding EXTI line.* retval None*/
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{/* EXTI line interrupt detected */if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) ! 0x00u){HAL_GPIO_EXTI_Callback(GPIO_Pin);__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);}
} 需要注意的是函数HAL_GPIO_EXTI_IRQHandler()是文件stm32g4xx_hal_gpio.c中的这是HAL驱动的原始文件这个函数里并没有代码沙箱也不是弱函数不可以重写。修改这个函数的代码后在CubeMX 重新生成代码时这个函数的代码又会变成原来的样子。所以一定要记得再次改回去。