#include “bsp.h”
static char txBuffer[]=“UART_Interrupt”;
static char rxBuffer[RX_BUFFER_SIZE];
volatile uint32_t uartEventFlag=0;
UART_HandleTypeDef huart1;
/*
- 函 数 名: bsp_InitUsart1()
- 功能说明: 初始化串口1
- 形 参: 无
- 返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitUsart1(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (DAL_UART_Init(&huart1) != DAL_OK)
{
DAL_ErrorHandler();
}
// 发送数据
DAL_UART_Transmit(&huart1, (uint8_t *)&txBuffer, sizeof(txBuffer), 1000);
// 启动接收中断
DAL_UART_Receive_IT(&huart1, (uint8_t *)rxBuffer, RX_BUFFER_SIZE);
}
void DAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (huart->Instance == USART1)
{
/* Enable USART1 GPIO clock */
__DAL_RCM_GPIOA_CLK_ENABLE();
/* Enable USART1 clock */
__DAL_RCM_USART1_CLK_ENABLE();
/* Configure the UART TX and RX pin */
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
DAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
void DAL_UART_MspDeInit(UART_HandleTypeDef huart)
{
if (huart->Instance == USART1)
{
/ Reset USART */
__DAL_RCM_USART1_FORCE_RESET();
__DAL_RCM_USART1_RELEASE_RESET();
/* Disable USART and GPIO clocks */
DAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_10);
/* Disable USART interrupt */
DAL_NVIC_DisableIRQ(USART1_IRQn);
}
}
int fputc(int ch, FILE* f)
{
/* send a byte of data to the serial port */
DAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
/*
函 数 名: DAL_UART_RxCpltCallback()
功能说明: 串口接收中断回调函数,将接收到的数据发送出去
形 参: 无
返 回 值: 无
*********************************************************************************************************
*/
void DAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uartEventFlag = 1;
if(uartEventFlag)
{
uartEventFlag=0;
DAL_UART_Transmit(&huart1, (uint8_t *)rxBuffer, RX_BUFFER_SIZE, DAL_MAX_DELAY);
}
// 重启接收中断
DAL_UART_Receive_IT(&huart1, (uint8_t *)rxBuffer, RX_BUFFER_SIZE);
}
代码如上,想使用串口接收中断,把收到的数据发送出来。
首先,使用DAL_UART_Transmit发送数据时,串口助手能够收到数据。
串口助手发送数据时,能进入中断,
void USART1_IRQHandler(void)
{
DAL_UART_IRQHandler(&huart1);
}
但是调试时发现不能进入 DAL_UART_RxCpltCallback(huart);
STS:C0
BR:2D9
CTRL1:202C
CTRL3:01