目录
简介
此文章记录stm32使用软件中断触发中断,且不占用io资源的案例。
1.cubemx配置
2.修改gpio.c
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin : PC13 设置io作为输出,可根据具体应用来*/
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* EXTI interrupt init 使能EXTI15_10线的中断*/
SET_BIT(EXTI->IMR, 1<<13);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
3.设置中断函数stm32f1xx_it.c
/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
printf("pin 0x%x soft irq\n\r", GPIO_Pin);
}
4.触发中断代码
while(1)
{
__HAL_TIM_SET_COUNTER(&htim1, 0);
HAL_TIM_Base_Start(&htim1);
HAL_Delay(1000);
HAL_TIM_Base_Stop(&htim1);
printf("%d\n\r", __HAL_TIM_GET_COUNTER(&htim1));
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
__HAL_GPIO_EXTI_GENERATE_SWIT(1<<13); //此函数为触发软件中断
}
5.st官方介绍(软件操作逻辑)
6.现象
- 打印
- 点灯
led正常闪烁