【中断回调函数】

stm32hal库入门@[toc]

概要

通过中断回调函数实现与中断交互

整体架构流程

交互函数:
usart_test_.c

#include "usart_test.h"
#include "stm32f1xx_hal_gpio.h"

uint8_t  USART1_RX_BUF[USART1_REC_LEN]; 	//接受缓冲,最大USART_REC_LEN个字节
uint16_t USART1_RX_STA=0;								  //接受状态标记、、bit15:接收完成标志,bit14:接收到0x0d,bit13~0:接受到的有效字节数目
uint8_t  USART1_NewData;									//当前串口中断接受的1个字节数据缓存


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)		//串口中断回调函数
{
	if(huart == &huart1)
	{
		printf("%c",USART1_NewData);			//把收到的数据以a符号变量发送给电脑
		if((USART1_RX_STA&0x8000)==0)					//接受未完成
		{
			if(USART1_RX_STA&0x4000)				//接受到了0x0d
			{
				if(USART1_NewData!=0x0a)USART1_RX_STA=0;	//接受错误重新开始
				else USART1_RX_STA |=0x8000;							//接受完成了
			}
			else
			{
				if(USART1_NewData==0x0d)USART1_RX_STA|=0x4000;
				else
				{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=USART1_NewData;		//将收到的数据放回数组
					USART1_RX_STA++;	//数据长度计数加1
					if(USART1_RX_STA>(USART1_REC_LEN - 1))USART1_RX_STA=0;	//接收数据错误,重新开始接受
				}
			}			
		}
			HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);	//再开启接受中断
	}

}


usart_test_.h

#ifndef __USART_TEST_H
#define __USART_TEST_H


#include "stm32f1xx_hal.h"
#include "main.h"
#include "usart.h"
#include "stm32f1xx_hal_gpio.h"
#include "stm32f1xx_hal_uart.h"

#define USART_n   USART1		//定义使用printf函数的串口
#define USART1_REC_LEN 200	//定义USART1最大接受字节数
#define USART2_REC_LEN 200
#define USART3_REC_LEN 200
//不使用某个串口时要禁止此串口,以减少编译量
#define EN_USART1     1
#define EN_USART2     0
#define EN_USART3     0

extern uint8_t USART1_RX_BUF[USART1_REC_LEN];	//接收缓冲

extern uint16_t USART1_RX_STA;		//接收状态标记位

extern uint8_t  USART1_NewData;
//函数声明
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

#endif

主函数:

```c
while (1)
  {
    /* USER CODE END WHILE */
			if(USART1_RX_STA&0x0001)	//串口1判断中断接收标志位
			{
				if(USART1_RX_BUF[0]=='1')
				{
					HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET);
					BUZZER_SOLO1();
				}
				if(USART1_RX_BUF[0]=='0')
				{
					HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
					BUZZER_SOLO1();
				}
				USART1_RX_STA=0;	//串口接收标志位清0,即开启下一轮接收
			}
    /* USER CODE BEGIN 3 */
//		if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_SET) 
//			{ 
//        HAL_Delay(10);
//				HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET);
//        BUZZER_SOLO1();
				HAL_UART_Transmit(&huart1,(uint8_t*)&"KEY1\r\n",6,0xffff);		//串口发送:串口号1,内容“ABC”,数量3,溢出时间0xffff
//				printf("KEY1\r\n");
//       }
  }
  /* USER CODE END 3 */
}

`
#
## 小结
根据杨桃hal库例程编写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在HAL库中,中断回调函数是用来处理硬件中断事件的函数。当一个中断事件发生时,系统会调用预先注册的中断回调函数来处理该事件。 通常,你需要完成以下步骤来使用中断回调函数: 1. 注册中断回调函数:通过调用相应的HAL库函数,将你编写的中断回调函数与特定的中断线路或外设相关联。 2. 编写中断回调函数:根据你的需求和硬件的特性,编写中断回调函数的代码。这个函数将在中断事件发生时被调用。 3. 中断处理:当中断事件发生时,系统会自动调用已注册的中断回调函数。在中断回调函数中,你可以执行一些特定的操作,如读取/写入数据、更新状态等。 以下是一个简单的示例,演示如何使用HAL库来注册和处理中断回调函数: ```c #include "stm32f4xx_hal.h" // 中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_0) { // 处理GPIO_Pin为GPIO_PIN_0的中断事件 // 在这里执行你的操作 } } int main(void) { // 初始化HAL库 HAL_Init(); // 配置GPIO引脚和中断触发条件 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发 GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 注册中断回调函数 HAL_GPIO_RegisterCallback(GPIO_PIN_0, HAL_GPIO_EXTI_Callback); // 使能中断 HAL_NVIC_EnableIRQ(EXTI0_IRQn); while(1) { // 主循环代码 } } ``` 在上面的例子中,我们使用了STM32F4系列的HAL库来配置GPIO引脚和中断触发条件,并注册了名为"HAL_GPIO_EXTI_Callback"的中断回调函数。当GPIO_PIN_0引脚上升沿触发中断时,该函数将被调用。 请注意,具体的HAL库函数和回调函数命名可能会根据你使用的硬件平台和库版本而有所不同。因此,在实际开发中,你需要参考相关的文档和示例代码来正确使用中断回调函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值