本帖最后由 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的状态。
[url=]复制[/url]
#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是嵌入式系统开发中的基础功能,掌握这些技术有助于开发者更好地实现复杂的系统功能。
|