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