【AS32X601驱动系列教程】USART_串口通讯详解
国科安芯的AS32系列MCU芯片集成7路USART,能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。USART 通过小数波特率发生器实现了多种波特率。 USART 不仅支持同步单向通信和半双工单线通信,以及 LIN(局域互连网络)和调制解调器操作 (CTS/RTS) 通过配置多个缓冲区使用 DMA(直接存储器访问)可实现高速数据通信,其通信数据格式如下:
硬件设计
评估板板载了一颗CH340 usb转ttl芯片用于串口通讯验证,串口接在MCU串口0,对外通过usbmini标准接口与上位机连接。
软件设计
本小节实现上位机与板卡的双向数据收发,板卡接收上位机数据,并原数据返回。
初始化流程
- 使能USART以及对应gpio时钟
- 配置gpio复用为usart功能
- 初始化gpio结构体
- 初始化usart结构体
- 调用库函数实现收发
代码分析
首先进行串口初始化,在Bsp文件夹中新建新建print.c和print.h,之后添加到工程目录下,在log.c中添加初始化代码:
- void User_Print_Init(uint32_t BaudRate)
- {
- USART_InitTypeDef USART_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIOD_CLK_ENABLE();
- USART0_CLK_ENABLE();
- /* Set GPIO multiplex mapping */
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART0); /* USART0_TX */
- GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_USART0); /* USART0_RX */
- /* GPIO Configure */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
- GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_IType = GPIO_IN_FLOATING;
- GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_4_5mA;
- GPIO_Init(GPIOD, &GPIO_InitStructure);
- USART_DeInit(USART0);
- USART_StructInit(&USART_InitStructure);
- /* Initializes the USART0 */
- USART_InitStructure.USART_BaudRate = BaudRate;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_InitStructure.USART_OverSampling = USART_OverSampling_16;
- USART_Init(USART0, &USART_InitStructure);
- USART_Cmd(USART0, ENABLE);
- }
首先,我们设置了一个形参用于配置串口通讯波特率,该波特率计算同样是通过系统时钟初始化所读取的总线时钟函数提供计算基础,因此当使用串口时,切勿漏掉该函数,否则需要手动输入时钟进行计算。
之后开启GPIOD和USART0的外设时钟,注意,在此之前不要忘了在系统时钟初始化中开启两个外设挂载的总线时钟。
然后调用库函数配置两个管脚复用为串口功能,然后初始化TX引脚为推挽输出,RX管脚为浮空输入。
最后配置USART0初始化结构体,功能配置为8位数据位,1位停止位,无校验,使能串口。
- while(1)
- {
- if(SET == USART_GetFlagStatus(USART0, USART_FLAG_RXFNE))
- {
- usart_data = USART_ReceiveData(USART0);
- USART_SendData(USART0,usart_data);
- }
- }
在主函数中,循环检测接收状态,当接收到数据时,调用接收函数读取数据,并通过串口发送函数原路返回。
除此之外,串口可通过中断方式和DMA方式进行数据收发,具体操作在中断和DMA章节进行具体介绍。
评估板验证
编译烧录代码,打开串口调试工具并连接串口线,观察最终效果。