AT32F403A串口USART1配置


一、USART介绍

通用同步异步收发器(USART)是一个能通过多种不同的配置与使用不同的数据格式的外设进行通信的
通用接口,同时支持异步全双工,异步半双工以及同步传输。USART 提供了可编程的波特率发生器,根
据系统频率以及分频系数的不同,可产生高达 7.5MBits/s 的波特率,用户可以通过配置系统时钟以及分
频系数以此产生所需要的特定通信频率。
USART 除了支持标准的 NRZ 异步以及同步收发通信协议外,还支持一些常用的其他类型的串行通信协
议,如 LIN(局域互联网),IrDA(红外数据组织)SIRENDEC 规范,ISO7816-3 标准的异步智能卡协议,
以及 CTS/RTS(Clear To Send/Request To Send)硬件流操作。
USART 还支持多处理器通信,以及可配置通过空闲帧或 ID 匹配唤醒的静默模式,以此搭建 USART 网
络,并且同时支持使用 DMA 进行数据的收发,以此实现高速通信。
图 12-1 USART框图
在这里插入图片描述
USART 主要特性如下所列 :
 可编程配置的全双工或半双工通信
― 全双工异步通信
― 单线半双工通信
 可编程配置的通信模式
― NRZ标准格式(Mark/Space)
― LIN(局域互联网):LIN主机有发送间隔帧的能力以及LIN从机有检测间隔帧的能力
― IrDA SIR(串行红外): 在普通模式下持续时间为3/16位,在红外低功耗模式下位
持续时间可调
― ISO7816-3标准里定义的异步智能卡协议: 智能卡模式支持0.5或1.5个停止位
― RS-232 CTS/RTS(Clear To Send/Request To Send)硬件流操作
― 通过静默模式实现多处理器通信(具有ID匹配和总线空闲两种可编程配置的唤醒方式)
― 同步模式
 可编程配置的波特率发生器
― 发送和接收共用的可编程波特率,最高达7.5MBits/s
 可编程配置的帧格式
― 可编程的数据位位数(8位或9位)
― 可编程的停止位位数-支持1或2个停止位
― 可编程的校验控制:发送方具备发送校验位的能力,接收方具备对接收到的数据进行
校验的能力
 可编程配置的 DMA 多缓冲器通信
 可编程配置的独立的发送器和接收器使能位
 可编程配置的输出 CLK 的相位和极性以及频率
 检测标志
― 接收缓冲器满
― 发送缓冲器空
― 传输完成标志
 四个错误检测标志
― 溢出错误
― 噪声错误
― 帧错误
― 校验错误
 可编程配置的 10 个带标志的中断源
― CTSF改变
― LIN间隔帧检测
― 发送数据寄存器空
― 发送完成
― 接收数据寄存器满
― 检测到总线为空闲
― 溢出错误
― 帧错误
― 噪声错误
― 校验错误

二、串口printf打印

在嵌入式系统中,通过串口打印log是非常重要的调试手段,但是直接调用底层驱动打印信息非常不方便,在c语言中一般使用printf打印基本的显示信息,而默认printf的结果不会通过串口发送,所以需要对printf的输出进行重定向。

1.头文件定义

/**************** define print uart ******************/
#define PRINT_UART                       USART1
#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK
#define PRINT_UART_TX_PIN                GPIO_PINS_9
#define PRINT_UART_TX_GPIO               GPIOA
#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK

2.串口初始化配置

/**
  * @brief  initialize uart
  * @param  baudrate: uart baudrate
  * @retval none
  */
void uart_print_init(uint32_t baudrate)
{
  gpio_init_type gpio_init_struct;

  /* enable the uart and gpio clock */
  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);

  gpio_default_para_init(&gpio_init_struct);

  /* configure the uart tx pin */
  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;
  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);

  /* configure uart param */
  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
  usart_transmitter_enable(PRINT_UART, TRUE);
  usart_enable(PRINT_UART, TRUE);
}


3.串口printf输出定义

宏定义并实现具体的发送函数

   代码在编译时首先判断__GNUC__有无定义,之后将PUTCHAR_PROTOTYPE替换成具体的定义。在keil5中,使用fputc函数,所以其实最后是重写了fputc的实现,在该函数中,调用串口的发送函数,每次发送一个字符。
#if defined (__GNUC__) && !defined (__clang__)
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

/**
  * @brief  retargets the c library printf function to the usart.
  * @param  none
  * @retval none
  */
PUTCHAR_PROTOTYPE
{
  while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  usart_data_transmit(PRINT_UART, ch);
  return ch;
}

4. 主程序串口初始化配置

/**
  **************************************************************************
  * @file     main.c
  * @version  v2.0.9
  * @date     2022-04-25
  * @brief    main program
  **************************************************************************
  *                       Copyright notice & Disclaimer
  *
  * The software Board Support Package (BSP) that is made available to
  * download from Artery official website is the copyrighted work of Artery.
  * Artery authorizes customers to use, copy, and distribute the BSP
  * software and its related documentation for the purpose of design and
  * development in conjunction with Artery microcontrollers. Use of the
  * software is governed by this copyright notice and the following disclaimer.
  *
  * THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
  *
  **************************************************************************
  */

#include "at32f403a_407_board.h"
#include "at32f403a_407_clock.h"

/** @addtogroup AT32F403A_periph_examples
  * @{
  */

/** @addtogroup 403A_USART_printf USART_printf
  * @{
  */

__IO uint32_t time_cnt = 0;

/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
  system_clock_config();
  at32_board_init();
  uart_print_init(115200);

  /* output a message on hyperterminal using printf function */
  printf("usart printf example: retarget the c library printf function to the usart\r\n");

  while(1)
  {
    printf("usart printf counter: %u\r\n",time_cnt++);
    delay_sec(1);
  }
}

/**
  * @}
  */

/**
  * @}
  */

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AT32F403A是一款基于ARM Cortex-M4内核的微控制器,接收扫码枪传来的数据需要通过串口通信实现。 以下是AT32F403A接收串口数据的示例代码: ```c #include "at32f4xx.h" #define BUF_SIZE 64 uint8_t USART_RX_BUF[BUF_SIZE]; // 定义接收缓冲区 uint8_t RX_STA = 0; // 接收状态标志位 void USART1_IRQHandler(void) { uint8_t Res; if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 判断是否接收到数据 { Res = USART_ReceiveData(USART1); // 读取接收到的数据 if ((RX_STA & 0x80) == 0) // 接收未完成 { if (Res == 0x0d) // 接收到回车符 { RX_STA |= 0x80; // 标志接收完成 } else { USART_RX_BUF[RX_STA & 0x7f] = Res; // 保存数据到接收缓冲区 RX_STA++; // 接收状态标志位加1 if (RX_STA > (BUF_SIZE - 1)) // 如果接收数据长度超出缓冲区范围 { RX_STA = 0; // 重新开始接收 } } } } USART_ClearFlag(USART1, USART_FLAG_RXNE); // 清除接收中断标志位 } int main(void) { USART_InitTypeDef USART_InitStructure; // 使能 USART1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART1 TX -> PA9, RX -> PA10 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 USART1 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); // 使能 USART1 接收中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 使能 USART1 USART_Cmd(USART1, ENABLE); while (1) { if ((RX_STA & 0x80) == 0x80) // 接收完成 { printf("Received data: %s\r\n", USART_RX_BUF); RX_STA = 0; // 重新开始接收 } } } ``` 在上面的代码中,我们通过USART1接收串口数据,并将数据保存到接收缓冲区USART_RX_BUF中。当接收到回车符时,我们将标志接收完成,并将接收到的数据打印输出。需要注意的是,这里使用了printf函数输出数据,需要先在代码中添加相应的头文件和初始化。 当然,具体的代码实现还需要根据你使用的扫码枪的通信协议进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值