新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2021-1-21
- 在线时间
- 3 小时
|
2金钱
以下是我写的蓝牙串口中断
#include "usart2.h"
#include "led.h"
#include "sys.h"
u8 data[1];
GPIO_InitTypeDef GPIO_Initure;
UART_HandleTypeDef UART2_Handler;
void USART2_Init()
{
/****定义结构体*****/
/**使能时钟**/
/***使能串口***/
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_USART1_CLK_ENABLE();
/***串口复用**/
GPIO_Initure.Pin=GPIO_PIN_3; //PA3
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART2
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA3
GPIO_Initure.Pin=GPIO_PIN_2; //PA2
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA2
/***配置串口****/
/****配置USART2 *****/
UART2_Handler.Instance=USART2; //USART2
UART2_Handler.Init.BaudRate=9600; //波特率
UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART2_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART2_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART2_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART2_Handler); //HAL_UART_Init()会使能UART2
HAL_UART_Receive_IT(&UART2_Handler, (u8*)data, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
/**使能串口中断***/
/***配置中断优先级***/
HAL_NVIC_EnableIRQ(USART2_IRQn); //使能USART2中断通道
HAL_NVIC_SetPriority(USART2_IRQn,0,0); //抢占优先级0,子优先级0
}
/***配置USART2中断函数****/
void USART2_IRQHandler()
{
//
u32 timeout=0;
u32 maxDelay=0x1FFFF;
HAL_UART_IRQHandler(&UART2_Handler); //调用HAL库中断处理公用函数
timeout=0;
while (HAL_UART_GetState(&UART2_Handler)!=HAL_UART_STATE_READY)//等待就绪
{
timeout++;////超时处理
if(timeout>maxDelay) break;
}
timeout=0;
while(HAL_UART_Receive_IT(&UART2_Handler,(u8 *)data, 1)!=HAL_OK)//一次处理完成之后,重新开启中断并设置RxXferCount为1
{
timeout++; //超时处理
if(timeout>maxDelay) break;
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(data[0] == '1')
{
LED0_Toggle;
}
}
|
|