参考:
介绍
简介
特性
系统框图
查看引脚定义
在芯片数据手册查找
芯片数据手册下载方式参考获取资料手册
外设信息:
引脚定义:
相关函数
接口定义
UART_HandleTypeDef
UART_InitTypeDef
MSP回调函数机制
初始化钩子函数
中断回调
常用函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| HAL_UART_Init(UART_HandleTypeDef *huart);
void HAL_UART_MspInit(UART_HandleTypeDef *huart);
__HAL_RCC_USART1_CLK_ENABLE();
HAL_NVIC_EnableIRQ(USARTX_IRQn);
HAL_NVIC_SetPriority(USARTX_IRQn, 3, 3);
HAL_UART_Receive_IT (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
void USARTX_IRQHandler(void);
HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
HAL_UART_Transmit (UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
while ((USARTX->SR & 0X40) == 0); USARTX->DR = (uint8_t)ch;
|
函数详解
HAL_UART_Init
HAL_UART_Receive_IT
HAL_UART_Transmit
应用示例
串口收发数据
宏定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #define USART_TX_GPIO_PORT GPIOA #define USART_TX_GPIO_PIN GPIO_PIN_9 #define USART_TX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define USART_RX_GPIO_PORT GPIOA #define USART_RX_GPIO_PIN GPIO_PIN_10 #define USART_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)
#define USART_UX USART1 #define USART_UX_IRQn USART1_IRQn #define USART_UX_IRQHandler USART1_IRQHandler #define USART_UX_CLK_ENABLE() do{ __HAL_RCC_USART1_CLK_ENABLE(); }while(0)
#define USART_REC_LEN 200 #define USART_EN_RX 1 #define RXBUFFERSIZE 1
|
全局变量:
1 2 3 4 5 6 7 8 9 10 11 12 13
| uint8_t g_usart_rx_buf[USART_REC_LEN];
uint16_t g_usart_rx_sta = 0;
uint8_t g_rx_buffer[RXBUFFERSIZE];
UART_HandleTypeDef g_uart1_handle;
|
初始化usart外设:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
void usart_init(uint32_t baudrate) {
g_uart1_handle.Instance = USART_UX; g_uart1_handle.Init.BaudRate = baudrate; g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; g_uart1_handle.Init.StopBits = UART_STOPBITS_1; g_uart1_handle.Init.Parity = UART_PARITY_NONE; g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; g_uart1_handle.Init.Mode = UART_MODE_TX_RX; HAL_UART_Init(&g_uart1_handle);
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); }
void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct;
if (huart->Instance == USART_UX) { USART_TX_GPIO_CLK_ENABLE(); USART_RX_GPIO_CLK_ENABLE(); USART_UX_CLK_ENABLE();
gpio_init_struct.Pin = USART_TX_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_AF_PP; gpio_init_struct.Pull = GPIO_PULLUP; gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); gpio_init_struct.Pin = USART_RX_GPIO_PIN; gpio_init_struct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); HAL_NVIC_SetPriority(USART_UX_IRQn, 3, 3); #endif } }
|
中断函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
void USART_UX_IRQHandler(void) { #if SYS_SUPPORT_OS OSIntEnter(); #endif
HAL_UART_IRQHandler(&g_uart1_handle);
#if SYS_SUPPORT_OS OSIntExit(); #endif
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART_UX) { if ((g_usart_rx_sta & 0x8000) == 0) { if (g_usart_rx_sta & 0x4000) { if (g_rx_buffer[0] != 0x0a) { g_usart_rx_sta = 0; } else { g_usart_rx_sta |= 0x8000; } } else { if (g_rx_buffer[0] == 0x0d) g_usart_rx_sta |= 0x4000; else { g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0]; g_usart_rx_sta++;
if (g_usart_rx_sta > (USART_REC_LEN - 1)) { g_usart_rx_sta = 0; } } } }
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } }
|
主函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| int main(void) { uint8_t len; uint16_t times = 0; HAL_Init(); sys_stm32_clock_init(RCC_PLL_MUL9); delay_init(72); usart_init(115200); while(1) { if (g_usart_rx_sta & 0x8000) { len = g_usart_rx_sta & 0x3fff; printf("\r\n您发送的消息为:\r\n");
HAL_UART_Transmit(&g_uart1_handle,(uint8_t*)g_usart_rx_buf, len, 1000); while(__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_TC) != SET); printf("\r\n\r\n"); g_usart_rx_sta = 0; } else { times++;
if (times % 5000 == 0) { printf("\r\n正点原子 STM32开发板 串口实验\r\n"); printf("正点原子@ALIENTEK\r\n\r\n\r\n"); }
if (times % 200 == 0) printf("请输入数据,以回车键结束\r\n");
if (times % 30 == 0) LED0_TOGGLE();
delay_ms(10); } } }
|