[AT32F403/403A] 基于雅特力AT32 MCU的串口通信应用及代码实现

[复制链接]
3725|10
 楼主| 帛灿灿 发表于 2024-10-4 14:37 | 显示全部楼层 |阅读模式

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

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

  1. #include "at32f403a.h"
  2. #include "at32f403a_usart.h"

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

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

  8. // 初始化串口
  9. void USART1_Init(void) {
  10.     // 使能USART1时钟
  11.     RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, ENABLE);
  12.     RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA, ENABLE);
  13.    
  14.     // 配置GPIO
  15.     GPIO_InitTypeDef GPIO_InitStructure;
  16.     GPIO_InitStructure.GPIO_Pins = GPIO_Pins_9;  // TX Pin
  17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  18.     GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
  19.     GPIO_Init(GPIOA, &GPIO_InitStructure);

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

  23.     // 配置USART参数
  24.     USART_InitType USART_InitStructure;
  25.     USART_InitStructure.BaudRate = 115200;
  26.     USART_InitStructure.WordLength = USART_WordLength_8B;
  27.     USART_InitStructure.StopBits = USART_StopBits_1;
  28.     USART_InitStructure.Parity = USART_Parity_No;
  29.     USART_InitStructure.HardwareFlowControl = USART_HardwareFlowControl_None;
  30.     USART_InitStructure.Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.     USART_Init(USART1, &USART_InitStructure);
  32.    
  33.     // 使能USART1中断
  34.     NVIC_InitType NVIC_InitStructure;
  35.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  36.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  37.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  38.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  39.     NVIC_Init(&NVIC_InitStructure);

  40.     // 使能接收中断
  41.     USART_INTConfig(USART1, USART_INT_RDNE, ENABLE);
  42.    
  43.     // 使能USART
  44.     USART_Cmd(USART1, ENABLE);
  45. }

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

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

  54.         // 回显收到的数据
  55.         USART_SendData(USART1, data);
  56.         while (USART_GetFlagStatus(USART1, USART_FLAG_TDE) == RESET);
  57.     }
  58. }

  59. int main(void) {
  60.     // 初始化系统
  61.     SystemInit();
  62.    
  63.     // 初始化串口
  64.     USART1_Init();
  65.    
  66.     while (1) {
  67.         // 主循环可以添加其他逻辑
  68.     }
  69. }

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

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

您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

6240

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部