基于STM32HAL库的串口实验(一)收发一个字符

目录

实验:使用串口一接收\发送一个字符

1.在uart1.c中进行串口初始化

2.在msp函数中对外设gpio口,nvic等进行配置

3.在中断服务函数中进行数据的收发


实验:使用串口一接收\发送一个字符

1.在uart1.c中进行串口初始化

UART_HandleTypeDef结构体中有这些参数:

uint32_t BaudRate;                 //波特率

  uint32_t WordLength;         //字长

  uint32_t StopBits;                 //停止位

  uint32_t Parity;               //校验位

  uint32_t Mode;                    //模式  

  uint32_t HwFlowCtl;              //流控   

  uint32_t OverSampling;          //采样次数

UART_HandleTypeDef uart1_handle = {0};
void uart1_init(uint32_t baudrate)
{
    uart1_handle.Instance = USART1;
    uart1_handle.Init.BaudRate = baudrate;
    uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;
    uart1_handle.Init.StopBits = UART_STOPBITS_1;
    uart1_handle.Init.Parity = UART_PARITY_NONE;
    uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    uart1_handle.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&uart1_handle);
}

波特率我们通过参数的形式进行传参,字长为8字节,带有停止位,没有校验位,没有流控,模式为可接可发

2.在msp函数中对外设gpio口,nvic等进行配置

1.打开USART1和GPIOA的时钟

2.对GPIO口进行初始化,PA9为Tx1,PA10为Rx1,根据手册里面的gpio复用表,将PA9配置为推完复用输出,将PA10配置为浮空输入或上拉输入,代码中是复用输入一样的。

3.打开USART1的使能中断,通过调用HAL_NVIC_EnableIRQ()函数,允许CPU响应USART1的中断请求。设置USART1中断的优先级。

4.__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE)用于使能UART接收中断。当UART接收到数据并且接收缓冲区非空时,会触发中断。

最后三行代码可以概括为 配置中断系统,使能USART1的中断,并设置中断优先级,最后使能UART接收中断,以便在接收到数据时能够及时响应。

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        __HAL_RCC_USART1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE(); 
        GPIO_InitTypeDef gpio_initstruct;
        
        //调用GPIO初始化函数
        gpio_initstruct.Pin = GPIO_PIN_9;         
        gpio_initstruct.Mode = GPIO_MODE_AF_PP;            
        gpio_initstruct.Pull = GPIO_PULLUP;                     
        gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;         
        HAL_GPIO_Init(GPIOA, &gpio_initstruct);
        
        gpio_initstruct.Pin = GPIO_PIN_10;          
        gpio_initstruct.Mode = GPIO_MODE_AF_INPUT;            
        HAL_GPIO_Init(GPIOA, &gpio_initstruct);
        
        HAL_NVIC_EnableIRQ(USART1_IRQn);
        HAL_NVIC_SetPriority(USART1_IRQn, 2, 2);
        
        __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
    }
}

3.在中断服务函数中进行数据的收发

通过__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_RXNE) 函数可以判断RXNE是否为空,如果不为空则会产生一个中断,就可以进行一个操作

void USART1_IRQHandler(void)
{
    uint8_t receive_data = 0;
    if(__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_RXNE) != RESET)
    {
        HAL_UART_Receive(&uart1_handle, &receive_data, 1, 1000);
        HAL_UART_Transmit(&uart1_handle, &receive_data, 1, 1000);
    }
}

4.在main函数中进行实现

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    uart1_init(115200);

    while(1)
    { 
        led1_on();
        led2_off();
        delay_ms(500);
        led1_off();
        led2_on();
        delay_ms(500);
    }
}

led是以前的东西,没有影响就没删掉,在main函数中进行调用uart1_init()函数,并传入一个参数设置波特率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

江桥吖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值