STM32 HAL库中断的大概流程

本文详细介绍了STM32中断服务函数的配置步骤,包括初始化GPIO、定时器等中断源,设置优先级和启动函数。在STM32F4xx_IT.c文件中,重点讲解了EXTI9_5_IRQHandler中断服务函数及其内部调用的HAL_GPIO_EXTI_IRQHandler函数,用于处理外部中断。HAL_GPIO_EXTI_Callback函数则用于自定义中断触发后的具体操作,例如读取按键状态、蜂鸣器控制等。通过实例展示了中断服务的完整流程。

1. 初始化相应的GPIO、定时器等中断源不必多说;

2. 设置优先级、启动函数等;

3. 编辑中断服务函数,通常在stm32f4xx_it.c这个文件中(参考硬石开发板,MX_CUBE自动生成的好像也在这);

/* USER CODE BEGIN 1 */
void EXTI9_5_IRQHandler(void)
{
	/* USER CODE BEGIN EXTI3_IRQn 0 */
	/* USER CODE END EXTI3_IRQn 0 */
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);        //关键函数
	/* USER CODE BEGIN EXTI3_IRQn 1 */
	/* USER CODE END EXTI3_IRQn 1 */
}

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);  这个函数是HAL库函数,可以追踪到源头

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_EXTI_Callback(GPIO_Pin)是HAL库声明的函数,在自己的文件中编辑好功能内容就OK了~

//举个栗子
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==GPIO_PIN_7)
	{
		Key_Value=FSMC_READ_KEY_VALUE();
		Flag_Key_Int=1;
		beep_ctl(1);
		delay_ms(10);
		beep_ctl(0);
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_7);
	}
}

 

### STM32 HAL实现串口中断接收具体流程 #### 函数调用与初始化设置 为了使STM32能够利用HAL执行基于中断的UART通信,需预先配置好硬件参数并启动相应的外设。这通常涉及创建一个`UART_HandleTypeDef`类型的句柄变量来保存有关UART实例的信息,并对其进行适当初始化[^1]。 ```c UART_HandleTypeDef huart1; ``` 接着,在初始化过程中指定波特率、字长、停止位等必要属性: ```c huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; if (HAL_UART_Init(&huart1) != HAL_OK){ // 初始化失败处理 } ``` #### 开启中断模式的数据接收 一旦完成上述准备工作,则可通过调用`HAL_UART_Receive_IT()`方法激活UART设备上的接收中断机制。此操作会告知MCU准备监听来自外部源传入的消息帧,并将其存储到预定义缓冲区内等待后续读取分析。 ```c uint8_t Rx_data[5]; HAL_UART_Receive_IT(&huart1, (uint8_t *)Rx_data, sizeof(Rx_data)); ``` 这里指定了要接收到的目标地址以及预期长度为五个字符大小的数据包作为例子说明用途;实际应用可根据需求调整这些参数值。 #### 处理接收到的数据 当成功捕获一整个消息单元后——即每当有新数据到达时触发相应ISR(Interrupt Service Routine),程序流会被重定向至特定于该事件的服务例程内继续执行下一步动作。对于每种可能发生的状况都存在对应的回调接口可供覆自定义逻辑,比如`HAL_UART_RxCpltCallback()`用于指示一次完整的传输周期结束后的响应措施[^3]。 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance==USART1){ // 对已获取的内容实施进一步解析或转发给其他模块... // 如果希望持续监控输入状态则再次发起新一轮侦听请求 HAL_UART_Receive_IT(huart, (uint8_t *)Rx_data, sizeof(Rx_data)); } } ``` 此外值得注意的是,除非显式注册了IDLE线态变化检测功能,否则即使遇到异常情况也无法自动跳转进入错误恢复路径之中去尝试解决问题所在之处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值