自学内容网 自学内容网

STM32之串口通信

什么是串口

串行通信接口:指按位发送和接收的接口,如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);
        }       
    } 
    
}

原文地址:https://blog.csdn.net/weixin_41446932/article/details/142462531

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!