初始化USART2
在这里插入代码片
# include "stdio.h"
# define UART_SIZE 100
uint16_t uart_buffer_count;
uint8_t uart_buffer[ UART_SIZE] ;
UART_HandleTypeDef huart2;
Rxd_TypeDef Rxd2;
void MX_USART2_UART_Init ( void )
{
huart2. Instance = USART2;
huart2. Init. BaudRate = 115200 ;
huart2. Init. WordLength = UART_WORDLENGTH_8B;
huart2. Init. StopBits = UART_STOPBITS_1;
huart2. Init. Parity = UART_PARITY_NONE;
huart2. Init. Mode = UART_MODE_TX_RX;
huart2. Init. HwFlowCtl = UART_HWCONTROL_NONE;
huart2. Init. OverSampling = UART_OVERSAMPLING_16;
huart2. Init. OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2. AdvancedInit. AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if ( HAL_UART_Init ( & huart2) != HAL_OK)
{
Error_Handler ( ) ;
}
__HAL_UART_ENABLE_IT ( & huart2, UART_IT_IDLE) ;
HAL_UART_Receive_IT ( & huart2, Rxd2. RxBuffer, RxBufferSize) ;
}
```c
void HAL_UART_MspInit ( UART_HandleTypeDef* uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 } ;
if ( uartHandle-> Instance== USART2)
{
__HAL_RCC_USART2_CLK_ENABLE ( ) ;
__HAL_RCC_GPIOA_CLK_ENABLE ( ) ;
GPIO_InitStruct. Pin = USART_TX_Pin| USART_RX_Pin;
GPIO_InitStruct. Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct. Pull = GPIO_NOPULL;
GPIO_InitStruct. Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct. Alternate = GPIO_AF4_USART2;
HAL_GPIO_Init ( GPIOA, & GPIO_InitStruct) ;
HAL_NVIC_SetPriority ( USART2_IRQn, 3 , 0 ) ;
HAL_NVIC_EnableIRQ ( USART2_IRQn) ;
__HAL_UART_ENABLE_IT ( & huart2, UART_IT_RXNE) ;
}
}
空闲中断回调函数 huart->RxXferSize-huart->RxXferCount;为设置缓冲长度减去剩余长度获得收到的数据长度。 HAL_UART_AbortReceive_IT(&huart2);中止中断后,接收缓存剩余长度会重载为设置长度。
void HAL_UART_IdleCpltCallback ( UART_HandleTypeDef * huart)
{
if ( huart-> Instance == USART1)
{
}
else if ( huart-> Instance == USART2)
{
if ( ( __HAL_UART_GET_FLAG ( huart, UART_FLAG_IDLE) != RESET) )
{
uint32_t temp;
__HAL_UART_CLEAR_IDLEFLAG ( huart) ;
temp= huart-> RxXferSize- huart-> RxXferCount;
Rxd2. RxCounter= temp;
Rxd2. Start_rx_flag= RXOK;
HAL_UART_AbortReceive_IT ( & huart2) ;
HAL_UART_Receive_IT ( & huart2, Rxd2. RxBuffer, RxBufferSize) ;
}
}
}
int fputc ( int ch, FILE * f)
{
HAL_UART_Transmit ( & huart2, ( uint8_t * ) & ch, 1 , 0xFFFF ) ;
return ch;
}
中断函数 同时用到中断处理函数和空闲回调函数
void USART2_IRQHandler ( void )
{
HAL_UART_IdleCpltCallback ( & huart2) ;
HAL_UART_IRQHandler ( & huart2) ;
}
应用程序
if ( Rxd2. Start_rx_flag== RXOK)
{
Rxd2. RxCounter= 0 ;
Rxd2. Start_rx_flag= RXSTART;
HAL_GPIO_TogglePin ( LD2_GPIO_Port, LD2_Pin) ;
}