最近我在项目中使用雅特力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:初始化系统和串口后进入主循环,可以在其中加入其他业务逻辑。
这个代码框架可以很方便地扩展到其他通信应用中,比如通过串口控制设备或者传输数据。如果有需要进一步优化的地方,大家可以根据具体需求进行调整!
|