打印
[AT32F403/403A]

基于雅特力AT32 MCU的串口通信应用及代码实现

[复制链接]
53|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
帛灿灿|  楼主 | 2024-10-4 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近我在项目中使用雅特力AT32 MCU进行串口通信开发,想分享一下具体的代码实现,希望对大家有所帮助。这个例子展示了如何配置串口并实现基本的数据收发功能。

我们使用雅特力AT32F403为例,采用USART1进行串口通信,波特率设为115200,并且利用中断方式处理数据接收。以下是完整的代码示例。

#include "at32f403a.h"
#include "at32f403a_usart.h"

// 定义缓冲区大小
#define RX_BUFFER_SIZE 128

// 定义接收缓冲区
uint8_t rx_buffer[RX_BUFFER_SIZE];
uint8_t rx_index = 0;

// 初始化串口
void USART1_Init(void) {
    // 使能USART1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
   
    // 配置GPIO
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;  // TX Pin
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_10; // RX Pin
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART参数
    USART_InitType USART_InitStructure;
    USART_InitStructure.BaudRate = 115200;
    USART_InitStructure.WordLength = USART_WordLength_8B;
    USART_InitStructure.StopBits = USART_StopBits_1;
    USART_InitStructure.Parity = USART_Parity_No;
    USART_InitStructure.HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);
   
    // 使能USART1中断
    NVIC_InitType NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 使能接收中断
    USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
   
    // 使能USART
    USART_Cmd(USART1, ENABLE);
}

// 串口中断处理函数
void USART1_IRQHandler(void) {
    if (USART_GetINTStatus(USART1, USART_INT_RDNE) != RESET) {
        uint8_t data = USART_ReceiveData(USART1);

        // 保存数据到接收缓冲区
        if (rx_index < RX_BUFFER_SIZE) {
            rx_buffer[rx_index++] = data;
        }

        // 回显收到的数据
        USART_SendData(USART1, data);
        while (USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
    }
}

int main(void) {
    // 初始化系统
    SystemInit();
   
    // 初始化串口
    USART1_Init();
   
    while (1) {
        // 主循环可以添加其他逻辑
    }
}

主要功能:
  • 初始化USART1,波特率设为115200;
  • 通过中断方式接收数据;
  • 接收到的数据通过串口回显。

代码讲解:
  • USART1_Init:配置GPIO、初始化USART参数(波特率、数据位、停止位等)以及使能接收中断。
  • USART1_IRQHandler:串口接收中断处理函数,当接收到数据时,保存到接收缓冲区并回显。
  • main:初始化系统和串口后进入主循环,可以在其中加入其他业务逻辑。
这个代码框架可以很方便地扩展到其他通信应用中,比如通过串口控制设备或者传输数据。如果有需要进一步优化的地方,大家可以根据具体需求进行调整!

使用特权

评论回复
沙发
公羊子丹| | 2024-10-4 14:38 | 只看该作者
这代码写得挺清晰啊,正好我最近也在搞AT32,参考一下!

使用特权

评论回复
板凳
周半梅| | 2024-10-4 14:38 | 只看该作者
串口通信挺基础的,但这代码能直接用,省了不少时间,赞一个!

使用特权

评论回复
地板
帛灿灿|  楼主 | 2024-10-4 14:38 | 只看该作者
这个中断接收的方式很稳,之前用轮询老是丢数据,现在终于明白该用中断了!

使用特权

评论回复
5
童雨竹| | 2024-10-4 14:39 | 只看该作者
这个USART1_Init函数封装得不错,直接拿去用!

使用特权

评论回复
6
万图| | 2024-10-4 14:39 | 只看该作者
波特率115200够用了,要是能动态调整波特率就更好了!

使用特权

评论回复
7
Wordsworth| | 2024-10-4 14:39 | 只看该作者
看着挺简单的,但对刚入门的我来说还是有点难度,先拿去试试!

使用特权

评论回复
8
Bblythe| | 2024-10-4 14:39 | 只看该作者
回显功能很实用,调试的时候挺方便的,省得自己再写了!

使用特权

评论回复
9
Pulitzer| | 2024-10-4 14:40 | 只看该作者
接收缓冲区大小128个字节够用了,实际项目里还可以根据需求改大点吧?

使用特权

评论回复
10
Uriah| | 2024-10-4 14:40 | 只看该作者
之前用STM32,现在转AT32,发现差不多,代码迁移也很方便!

使用特权

评论回复
11
Clyde011| | 2024-10-4 14:40 | 只看该作者
我也在做类似的项目,但用的是UART DMA模式,有机会交流下!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

3628

帖子

0

粉丝