mylau 发表于 2024-11-17 23:07

基于雅特力AT32F403A MCU的GPIO和UART通信应用

本帖最后由 mylau 于 2024-11-17 23:18 编辑

雅特力(ARTERY)的AT32F403A系列MCU是一款高性能的32位微控制器,基于ARM Cortex-M4内核,适用于工业控制、物联网、消费类电子等应用场景。本篇文章将介绍如何使用AT32F403A的GPIO和UART模块,通过实际代码实现LED控制和串口通信的功能。

应用场景GPIO和UART外设是嵌入式开发中的基础功能。GPIO通常用于控制外部设备,如LED、继电器等;UART则用于设备之间或设备与PC的通信。在这个例子中,我们将通过GPIO控制一个LED的状态,并通过UART实现与PC的通信。

硬件设计硬件部分,我们使用AT32F403A的一个GPIO引脚控制一个LED,并利用UART1接口与PC进行串口通信。我们需要以下硬件:


[*]AT32F403A开发板
[*]LED及其限流电阻
[*]USB转TTL模块,用于PC与MCU的通信
GPIO引脚连接LED,UART1引脚通过USB转TTL模块连接到PC。

代码实现下面是基于AT32F403A的GPIO和UART通信代码,通过UART与PC进行数据收发,并通过按键控制LED的状态。

复制
#include "at32f4xx.h"

#define LED_PIN GPIO_PIN_13// 定义LED连接的GPIO引脚
#define BUTTON_PIN GPIO_PIN_0// 定义按键连接的GPIO引脚

void SystemClock_Config(void);
void GPIO_Init(void);
void UART_Init(void);
void UART_SendString(char* str);

int main(void)
{
    // 系统时钟初始化
    SystemClock_Config();
    // GPIO初始化
    GPIO_Init();
    // UART初始化
    UART_Init();
   
    // 初始化后发送欢迎信息
    UART_SendString("AT32F403A UART Ready.\r\n");

    while (1)
    {
      // 检查按键状态
      if (GPIO_ReadInputDataBit(GPIOA, BUTTON_PIN) == RESET)// 按键按下
      {
            // 点亮LED
            GPIO_SetBits(GPIOC, LED_PIN);
            // 发送按键按下信息
            UART_SendString("Button Pressed. LED On.\r\n");
      }
      else
      {
            // 熄灭LED
            GPIO_ResetBits(GPIOC, LED_PIN);
            // 发送按键释放信息
            UART_SendString("Button Released. LED Off.\r\n");
      }
    }
}

// 系统时钟配置
void SystemClock_Config(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2ENR_IOPAEN, ENABLE);// 使能GPIOA时钟,用于按键
}

// GPIO初始化
void GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    // 配置LED引脚为推挽输出模式
    GPIO_InitStruct.GPIO_Pin = LED_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
   
    // 配置按键引脚为浮空输入模式
    GPIO_InitStruct.GPIO_Pin = BUTTON_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// UART初始化
void UART_Init(void)
{
    USART_InitTypeDef USART_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;

    // 配置USART1 TX (PA9)为推挽复用模式
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置USART1 RX (PA10)为浮空输入模式
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置USART1参数
    USART_InitStruct.USART_BaudRate = 115200;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
   
    // 初始化USART1
    USART_Init(USART1, &USART_InitStruct);
    // 使能USART1
    USART_Cmd(USART1, ENABLE);
}

// 串口发送字符串
void UART_SendString(char* str)
{
    while (*str)
    {
      USART_SendData(USART1, *str++);
      while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
}


代码解析

[*]系统时钟配置:SystemClock_Config函数配置了MCU的系统时钟,并使能GPIO和USART1的外设时钟,为后续的GPIO和UART初始化提供基础。
[*]GPIO初始化:在GPIO_Init函数中,我们将GPIOC的13号引脚配置为推挽输出,用于控制LED,同时将GPIOA的0号引脚配置为浮空输入,用于检测按键状态。
[*]UART初始化:UART_Init函数初始化USART1的TX(PA9)和RX(PA10)引脚,设置波特率为115200,数据格式为8位数据位、1个停止位、无校验位,并开启串口收发功能。
[*]主循环功能:在主循环中,MCU会持续检测按键状态,按下时点亮LED并通过UART发送“Button Pressed. LED On.”消息,松开按键时熄灭LED并发送“Button Released. LED Off.”消息。

代码运行结果当我们通过USB转TTL模块将AT32F403A与PC连接,并打开串口调试工具时,能够看到MCU发送的消息。当按下开发板上的按键时,LED点亮,串口中会显示“Button Pressed. LED On.”消息;松开按键后,LED熄灭,串口中显示“Button Released. LED Off.”。

扩展应用这个简单的GPIO和UART应用可以作为嵌入式系统开发的基础。在实际项目中,GPIO可以用于控制更多外设,如继电器、蜂鸣器等,而UART通信可以扩展为与其他设备或模块(如GSM模块、蓝牙模块)的通信,实现更复杂的应用场景。

总结本文详细介绍了如何使用雅特力的AT32F403A MCU进行GPIO和UART的基本应用,通过具体代码展示了如何实现按键控制LED状态并通过串口与PC进行数据通信。GPIO和UART是嵌入式系统开发中的基础功能,掌握这些技术有助于开发者更好地实现复杂的系统功能。


页: [1]
查看完整版本: 基于雅特力AT32F403A MCU的GPIO和UART通信应用