`
第一步: 现在STM32CubeMx 中配置所需要IO口外部中断模式:
第二步: 配置中断触发模式 GPIO-->GPIO_mode GPIO--> GPIO Pull-up/Pull-down 这里以外部中断模式/下降边缘触发检测,默认上拉( Pull-up) 为例
第三步: 配置中断优先级: NVIC(嵌套向量中断控制器)-->EXTI line interrupts 根据自身需要配置中断优先级
到这里STM32CubeMx 就配置完成了,之下来分析STM32CubeMx生成的源码
先看一下GPIO的初始化函数;
- static void MX_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- /* GPIO Ports Clock Enable */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /*Configure GPIO pin Output Level */
- HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高
- /*Configure GPIO pin : PA8 */
- GPIO_InitStruct.Pin = GPIO_PIN_8;//配置GPIO_PIN_8
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //外部中断模式/下降边缘触发
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /*Configure GPIO pins : PA9 PA10 */
- GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//配置GPIO_PIN_9/GPIO_PIN_10
- GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;/外部中断模式/下降边缘触发
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /*Configure GPIO pin : KEY1_Pin */
- GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为输入模式
- GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉输入
- HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
- /*Configure GPIO pin : LED1_Pin */
- GPIO_InitStruct.Pin = LED1_Pin;//初始化LED1引脚
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式
- GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式
- HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
- /* EXTI interrupt init*/
- HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
- HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
- HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
- }
复制代码
接下来开始编写中断服务函数:
- //这里中断服务函数写在BEGIN 4,也可以写在其他可编辑的代码区域中,这里不明白的可以看前面几章的说明
- /* USER CODE BEGIN 4 */
- void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
- {
- switch(GPIO_Pin) //扫描是哪个中断源触发的中断
- {
- case GPIO_PIN_8: //如果是GPIO8
- {
- for(uint16_t i=0;i<2000;i++); //消抖一下
- if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8)) //再次确认一遍GPIO8是否拉低;
- {
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET); //如果是,LED1 输出高电平,
- }
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8); //清除外部中断标志位
- break;
- }
- case GPIO_PIN_9: //如果是GPIO9
- {
- for(uint16_t i=0;i<2000;i++); //消抖一下
- if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9)) //再次确认一遍GPIO9是否拉低;
- {
- HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET); //如果是,LED1 输出低电平,
- }
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9); //清除外部中断标志位
- break;
- }
- case GPIO_PIN_10: //如果是GPIO10
- {
- for(uint16_t i=0;i<2000;i++); //消抖一下
- if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)) //再次确认一遍GPIO10是否拉低;
- {
- HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); //如果是,翻转LED1输出电平,
- }
- __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10); //清除外部中断标志位
- break;
- }
- default:break;
- }
- }
- /* USER CODE END 4 */
复制代码
`
|