串口编程实战

1.USART/UART异步通信配置步骤

1,配置串口工作参数 HAL_UART_Init()
2,串口底层初始化 HAL_UART_MspInit() 使能USART和对应的IO时钟,初始化IO,使能USART中断,设置优先级
3,开启串口异步接收中断 HAL_UART_Receive_IT()
4,设置优先级,使能中断 HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,编写中断服务函数 USARTx_IRQHandler()、 UARTx_IRQHandler()
6,串口数据发送 USART_DR, HAL_UART_Transmit()

2.代码展示

2.1 usart.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"

uint8_t g_usart1_rx_flag = 0;                                 //串口接收到数据标志
uint8_t g_rx_buffer[1];                                       //HAL串口接收到数据缓冲区

//1.串口初始化,配置串口工作参数 
UART_HandleTypeDef g_uart1_handle;                            //UART句柄

void usart_init(uint32_t baudrate)
{
    g_uart1_handle.Instance = USART1;                          /* 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.HwFlowCtl = UART_HWCONTROL_NONE;       /* 无硬件流控 */
    g_uart1_handle.Init.Mode = UART_MODE_TX_RX;                /* 收发模式 */
    HAL_UART_Init(&g_uart1_handle);                            /* HAL_UART_Init()会使能UART1 */
    //3,开启串口异步接收中断,以中断方式接收指定字节数据     
    HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t*)g_rx_buffer,1);
}

//2,串口MSP回调函数 底层初始化配置GPIO、NVIC、CLOCK等
void HAL_USART_MspDeInit(USART_HandleTypeDef *husart)
{
    GPIO_InitTypeDef gpio_init_struct;
    if(husart->Instance == USART1)            
    {
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
  
    gpio_init_struct.Pin = GPIO_PIN_9;                     //PA9引脚,TX引脚 
    gpio_init_struct.Mode = GPIO_MODE_AF_PP;               // 复用推挽输出 
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;         //高速 
    gpio_init_struct.Alternate = GPIO_AF7_USART1;          //复用为USART1 
    HAL_GPIO_Init(GPIOA, &gpio_init_struct);               //初始化发送引脚
        
    gpio_init_struct.Pin = GPIO_PIN_10;                   //PA10,RX引脚 
    gpio_init_struct.Pull = GPIO_PULLUP;                  //上拉 
    gpio_init_struct.Alternate = GPIO_AF7_USART1;         //复用为USART1
    HAL_GPIO_Init(GPIOA, &gpio_init_struct);              //初始化发送引脚 
        
    //4,设置优先级,使能中断         
    HAL_NVIC_SetPriority(USART1_IRQn,3,3); 
    HAL_NVIC_EnableIRQ(USART1_IRQn);
    
    }
} 
//5.中断服务处理函数
void USART1_IRQHandler()
{
    //调用中断公共处理函数
    HAL_UART_IRQHandler(&g_uart1_handle);
    //接收失能中断
    HAL_UART_Receive_IT(&g_uart1_handle,(uint8_t*)g_rx_buffer,1); 
}

//串口数据接收完成回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
       //串口数据接收接受完成,标志位为1
        g_usart1_rx_flag = 1;
    }
}

2.2 usart.h

#ifndef _USART_H
#define _USART_H

#include "stdio.h"
#include "./SYSTEM/sys/sys.h"

extern UART_HandleTypeDef g_uart1_handle;         //UART句柄
extern uint8_t g_usart1_rx_flag;                 //串口接收到数据
extern uint8_t g_rx_buffer[1];                   //HAL串口接收到数据缓冲区

void usart_init(uint32_t baudrate);             //串口初始化函数 

#endif

2.3 main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"

int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    led_init();                                 /* 初始化LED */
    usart_init(115200);                         /* 初始化usart */
    
    while(1)
    {
        //如果收到数据
        if(g_usart1_rx_flag == 1)                                             
        {
           //6.串口数据发送
            HAL_UART_Transmit(&g_uart1_handle,(uint8_t*)g_rx_buffer,1,1000);    //发送字符
            while(__HAL_UART_GET_FLAG(&g_uart1_handle,UART_FLAG_TC) !=1);       //接收是否完成
            printf("\r\n"); 
            g_usart1_rx_flag=0;
             
        }
        //如果没收到数据
        else 
        {
            delay_ms(10);
        }
        
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_libinc++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值