STM32——串口通信(发送/接收数据与中断函数应用)

STM32——串口通信(发送/接收数据与中断函数应用)

在嵌入式系统中,串口通信是一种非常基本和常用的通信方式。STM32微控制器提供了多个USART(通用同步异步接收发射器)接口,用于实现串口通信。本文将介绍STM32串口通信的基本概念、配置步骤,并提供发送、接收数据的示例代码,以及中断函数的应用。

一、USART简介

USART是通用同步/异步收发器,支持同步和异步模式的串行通信。在异步模式下,数据通过RX和TX引脚以串行方式发送和接收,波特率、字长、停止位和奇偶校验位等参数可以配置。

二、USART配置步骤

  1. 使能串口时钟和GPIO时钟:需要为USART和其对应的GPIO端口提供时钟。
  2. GPIO端口模式设置:设置为推挽输出或浮空输入。
  3. 串口参数初始化:包括波特率、字长、停止位、奇偶校验等。
  4. 开启中断并初始化NVIC:如果需要使用中断方式接收数据,则需要配置。
  5. 使能串口:通过USART_Cmd(USARTx, ENABLE)函数使能串口。
  6. 编写中断处理函数:处理接收中断和其他可能的中断。

三、代码示例

3.1 USART初始化

void USART1_Init(u32 bound) {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // TX on PA9, RX on PA10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // USART1 configuration
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_Cmd(USART1, ENABLE);
}

3.2 数据发送

void USART1_SendData(u8 *buf, u16 len) {
    for (u16 t = 0; t < len; t++) {
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        USART_SendData(USART1, buf[t]);
    }
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}

3.3 中断处理函数

void USART1_IRQHandler(void) {
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        u8 r = USART_ReceiveData(USART1);
        // 处理接收到的数据
    }
}

四、总结

STM32的USART提供了灵活的配置选项,可以满足不同的通信需求。通过初始化USART,配置GPIO,使能中断并编写中断处理函数,可以实现数据的发送和接收。在实际应用中,还可以通过重定向fputc函数来支持printf等标准库函数。

在开发过程中,可以参考STM32的官方文档和库函数手册,以获取更详细的配置信息和使用示例。通过实际编码和调试,可以更好地理解和掌握STM32的串口通信功能。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI_Guru人工智能

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

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

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

打赏作者

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

抵扣说明:

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

余额充值