什么是串口
串行通信接口:指按位发送和接收的接口,如RS232/422/485
RS232电平和COMS/TTL电平对比
RS232电平:逻辑1:-15V ~ -3V 逻辑0:+3V ~ +15V
CMOS电平: 逻辑1:3.3V 逻辑0:0V (STM32使用)
TTL电平:逻辑1:5V 逻辑0:0V (51单片机使用)
备注:因为电压不同,所以CMOS/TTL是不能是直接与RS232交换信息,需要电平转换芯片进行电压转换。 如3.3V可以使用MAX323/SP3232转换芯片, 如果是5V可以使用MAX232转换芯片
USART/UART异步通信配置步骤
一、配置串口工作参数、开启串口异步接收中断
使用HAL库接口HAL_UART_Init(); HAL_UART_Receive_IT();
#define RXBUFFERSIZE 1
UART_HandleTypeDef g_uart1_handle; /* UART句柄 */
uint8_t g_rx_buffer[RXBUFFERSIZE] = {0}; //接收缓冲区
void usart_init(uint32_t baudrate)
{
g_uart1_handle.Instance = USART1;
g_uart1_handle.Init.BaudRate = baudrate; //波特率
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; //字长为8位数据格式
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; //一个停止位
g_uart1_handle.Init.Parity = UART_PARITY_NONE; //无奇偶校验位
g_uart1_handle.Init.Mode = UART_MODE_TX_RX; //收发模式
g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; //无硬件流控
HAL_UART_Init(&g_uart1_handle); //HAL_UART_Init()会使能UART1
/* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
二、串口底层初始化
使用HAL库接口:HAL_UART_MspInit() 配置GPIO/NVIC/CLOCK等
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if (huart->Instance == USART1)
{
__HAL_RCC_USART1_CLK_ENABLE(); //使能USART1的时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA的时钟
gpio_init_struct.Pin = GPIO_PIN_9; //PA9 Tx
gpio_init_struct.Mode = GPIO_MODE_AF_PP; //推挽复用输出
gpio_init_struct.Pull = GPIO_PULLUP; //下拉,因为时钟空闲是低电平
gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; //低速
gpio_init_struct.Alternate = USART_TX_GPIO_AF; //复用为USART1的TX
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
gpio_init_struct.Pin = GPIO_PIN_10; //PA10 Rx
gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW; //低速
gpio_init_struct.Alternate = USART_RX_GPIO_AF; //复用为USART1的RX
HAL_GPIO_Init(GPIOA, &gpio_init_struct);
}
}
三、设置优先级、使能中断
使用HAL接口:HAL_NVIC_SetPriority(); HAL_NVIC_EnableIRQ();
HAL_NVIC_SetPriority(USART1_IRQn, 2, 0); //设置优先级
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能中断
四、编写中断服务函数
使用接口:USARTx_IRQHandler(); UARTx_IRQHandler();
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&g_uart1_handle);
HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
}
五、编写回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
g_rx_flag = 1;
}
五、串口数据发送(在main函数中)
USART DR(数据发送寄存器) 、HAL_UART_Transmit();
int main()
{
HAL_Init(); //初始化HAL库
sys_stm32_clock_init(360, 25, 2, 8); //设置时钟,180Hz
delay_init(180); //延时初始化
usart_init(115200);
printf("开始发送数据\r\n");
while(1)
{
if (g_rx_flag == 1)
{
HAL_UART_Transmit(&g_uart1_handle, (uint8_t *)g_rx_buffer, 1, 30);
while(__HAL_USART_GET_FLAG(&g_uart1_handle, UART_FLAG_TC) != 1);
printf("\r\n");
g_rx_flag = 0;
}
else
{
delay_ms(30);
}
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » STM32之串口通信
发表评论 取消回复