[MM32软件]UART和USART有何区别?基于MM32G0001实现同步/异步串行接受发送器

1.引言


USART(Universal Synchronous/Asynchronous Receiver/Transmitter),是通用同步/异步串行接收/发送器。与UART相同点:均存在异步模式、多处理通信、智能卡功能、IrDA红外功能。
USART与UART的区别在于:

  • USART多支持一个同步模式;
  • 在异步模式下,等同于UART;
  • 在同步模式下,可当做SPI来用,比如用USART来驱动SPI设备;


 



MM32G0001使用高性能的 Arm® Cortex-M0 为内核的 32 位微控制器,最高工作频率可达 48MHz,内置高速存储器,丰富的增强型 I/O 端口和多种外设。含16KB Flash,2KB SRAM。
 


其电路图如下图所示:
 



本实验基于MINI-G0001开发板,实现usart三个样例。

2.实验原理


USART结构框图:
 



波特率配置公式不同:

  • 异步通信模式


 


 

  • 同步通信模式:


 


 

复制
/* Set usart synchronous baudrate. */

void USART_SetBaudrateSync(USART_Type * USARTx, USART_SyncBaudrate_Type * sync)

{

    USARTx->BRR &= ~(USART_BRR_FFD_MASK | USART_BRR_MFD_MASK);

    USARTx->BRR |= USART_BRR_MFD( (sync->ClockFreqHz / sync->BaudRate) / 4u);

}



/* set usart asynchronous baudrate. */

void USART_SetBaudrateAsync(USART_Type * USARTx, USART_AsyncBaudrate_Type * async)

{

    USARTx->BRR &= ~(USART_BRR_FFD_MASK | USART_BRR_MFD_MASK);

    uint8_t N = 8u * (2u - async->OverSampling);

    USARTx->CR1 |= USART_CR1_OVER8(async->OverSampling);

    uint32_t temp = async->ClockFreqHz / async->BaudRate;

    USARTx->BRR |= USART_BRR_MFD( temp / N ) | USART_BRR_FFD( temp % N );

}


同步时钟:
在USART使用同步模式时,数据传输需要一条时钟线CLK及一条数据线
同步模式支持主模式和从模式:主模式时使用内部波特率生成器生成的时钟,同时输出时钟;从模式时由SCLK引脚输入时钟。

 



USART数据帧:
 



USART 内置检测电路检测一帧数据的开始,并对 RX 引脚进行采样, USART 采用 8 或 16 倍数据波特率的时钟采样 RX 引脚的数据。
 



奇偶校验:
偶校验: 校验位加上数据中’1’的总数为偶数
奇校验: 校验位加上数据中’1’的总数为奇数

  • 配置 USART_CR1 寄存器中的 PCE 位为’1’来使能奇偶校验控制,PS 位用来选择奇校验或偶校验


 



3.软件设计


配置引脚

复制
void BOARD_InitPins(void)

{

    /* PA12 - USART_TX. */

    GPIO_Init_Type gpio_init;

    gpio_init.Pins  = GPIO_PIN_12;

    gpio_init.PinMode  = GPIO_PinMode_AF_PushPull; 

    gpio_init.Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &gpio_init);

    GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_1);



    /* PA3 - USART_RX. */

    gpio_init.Pins  = GPIO_PIN_3;

    gpio_init.PinMode  = GPIO_PinMode_In_PullUp; 

    gpio_init.Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &gpio_init);

    GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_1);

}

开启时钟

复制
/* USART. */

    RCC_EnableAPB1Periphs(RCC_APB1_PERIPH_USART1, true);

    RCC_ResetAPB1Periphs(RCC_APB1_PERIPH_USART1);

配置USART

复制
/* DEBUG UART. */

#define BOARD_DEBUG_USART_PORT        USART1

#define BOARD_DEBUG_USART_BAUDRATE    9600u

#define BOARD_DEBUG_USART_FREQ        CLOCK_APB1_FREQ


4.实验样例


usart_basic
使用异步模式,与串口通信工具进行数据收发,主函数如下:

复制
int main(void){

    uint8_t c;



    BOARD_Init();



    app_usart_init();

    app_usart_putstr((uint8_t *)"\r\nusart_basic example.\r\n");



    while (1){

        c = app_usart_getchar();

        app_usart_putchar(c);}}

usart_rx_interrupt

每当键入,LED会闪灯

复制
int main(void)

{

    BOARD_Init();



    app_usart_init();



    while (1){}

}



/* Initialization USART asynchtonous mode. */

void app_usart_init(void){

    /* Initialization USART asynchronous mode. */

    USART_InitAsync_Type usart_init;

    usart_init.EnableSwapTxRxXferSignal = false;

    usart_init.Parity = USART_Parity_None;

    usart_init.StopBits = USART_StopBits_1;

    usart_init.WordLength = USART_WordLength_8b;

    usart_init.XferMode = USART_XferMode_RxTx;

    usart_init.XferSignal = USART_XferSignal_Normal;



    /* Set USART asynchronous baudrate. */

    USART_AsyncBaudrate_Type usart_baudrate;

    usart_baudrate.BaudRate = BOARD_DEBUG_USART_BAUDRATE;

    usart_baudrate.ClockFreqHz = BOARD_DEBUG_USART_FREQ;

    usart_baudrate.OverSampling = USART_OverSampling_16;



    USART_InitAsync(BOARD_DEBUG_USART_PORT, &usart_init);

    USART_SetBaudrateAsync(BOARD_DEBUG_USART_PORT, &usart_baudrate);

    USART_EnableInterrupts(BOARD_DEBUG_USART_PORT, USART_STATUS_RX_NOTEMPTY, true);

    NVIC_EnableIRQ(BOARD_DEBUG_USART_IRQn);

    USART_Enable(BOARD_DEBUG_USART_PORT, true);  /* Enable USART. */}

usart_tx_interrupt
观察到串口输出多遍键入的字符

复制
void app_usart_putstr_init(uint8_t c)

{

    /* prepare the buffer. */

    for (uint32_t i = 0u; i < APP_USART_TX_BUFF_LEN; i++)

    {

        app_usart_tx_buff[i] = c;

    }

    app_usart_tx_buff_idx = 0u;



    /* enable the tx interrupt to transmit the buffer. */

    USART_EnableInterrupts(BOARD_DEBUG_USART_PORT, USART_STATUS_TX_EMPTY, true);

}
复制
/* USART get data. */

uint8_t app_usart_getchar(void)

{

    while ( 0u == (USART_STATUS_RX_NOTEMPTY & USART_GetStatus(BOARD_DEBUG_USART_PORT) ) )

    {

    }

    return USART_GetData(BOARD_DEBUG_USART_PORT);

}

---------------------
作者:春娇霹雳娃
链接:https://bbs.21ic.com/icview-3318424-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
串口监控器是一个免费的多功能串口通讯监控软件,它能够多种方式显示,接收,分析通讯数据;能够以多种灵活方式发送数据;功能强大,操作简便,在串口通讯监控,设备通讯测试中,能够有效提高工作效率。 主要功能如下: 接收数据: 1. 以十六进制方式显示接收到的数据。 2. 以字符方式显示接收到的数据。 3. 数据帧自动识别,分行显示。 4. 接收数据自动换行设置。 5. 显示或隐藏数据帧的接收时间。 6. 自动清除,自动保存接收到的数据。 7. 接收数据个数计数。 发送数据: 1. 十六进制方式发送数据。 2. 字符串方式发送数据。 3. 发送“发报窗口”当前光标行的数据帧。 4. 循环发送“发报窗口”当前光标行的数据帧。 5. 循环发送“发报窗口”固定行的数据帧。 6. 循环依次发送“发报窗口”的多行数据帧。(设置起始行,行数) 7. 触发发送,接收到“发报窗口”某一行数据,触发发送“发报窗口”另一行数据。 8. 发送数据个数计数。 实用增强功能: 1. 强大易用的进制转换功能。 2. 智能识别当前光标处数据帧的行号,“字符”或“十六进制数”的个数。 3. 智能计算当前选择的“字符”或“十六进制数”的个数。 4. 强大的数据查找功能。 5. 定时保存,定时清除数据。 6. 根据自己的喜好,灵活变换操作界面。 应用场合: 1. 截取和分析设备之间通讯数据流。 2. 串行外围设备硬件开发。 3. 串行设备驱动程序开发。 4. 调试和测试设备和设备之间的串行通讯过程。 5. 记录和分析RS232/422/485通信过程。 6. 模拟某设备通讯过程,对另外设备进行通讯测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值