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库例程编写