0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >工业控制 > 基于MM32F013x上实现UART极性取反的设计方案

基于MM32F013x上实现UART极性取反的设计方案

来源: elecfans
2021-02-04
类别:工业控制
eye 10
文章创建人 拍明

原标题:基于MM32F013x上实现UART极性取反的设计方案

  本文是针对在MM32F013x上实现UART极性取反的功能应用。

  在嵌入式领域,通常默认串口的电平是高电平为逻辑1,低电平为逻辑0,而在MM32的UART特性中是可以将高电平设置为逻辑0,低电平设置为逻辑1的,UART极性取反虽然不常用,但还是在特殊情况下是需要这个功能,比如硬件设计已经导致必须使用极性取反,否则电路就要改板或者增加反相电路。例如下图的UART隔离电路就需要UART发送极性取反功能。

  

1.jpg


  图1UART隔离电路

  01、UART极性取反简介

  UART极性取反下的电平与正常模式下的电平是相反的,正常情况下,UART空闲时电平是高,起始位是空闲状态下变成低电平,bit为1时电平也高。在UART极性取反状态下,空闲电平是低电平,起始位是高,bit为1时电平是低。

  在数据接收发送寄存器中,数据也是可以反转的,原来的0变为1,原来的1变为0,这和电平极性反转是类似。需要特别注意的是,在极性反转的时候,起始位和结束位也都反转了,所有的信号电平都反转;而在数据寄存器中只反转了数据位,其中也包含了校验位,没有反转信号的起始位和结束位的极性。

image.png

  图2UART极性取反波形

  上图是用逻辑分析仪抓取的UART极性取反的逻辑波形。红色字体:“IDLE”部分是空闲状态,“START”是起始位,后面“0~7”是数据的bit0~bit7,“STOP”是停止位,“IDLE”是空闲(注意,逻辑分析仪设置反向,不然只能抓到波形,无法解析出数据)。

  

image.png

  图3UART极性取反控制位

  UART->GCR寄存器描述

  设置寄存器TX_TOG位来使能UART发送极性取反功能。

  如果UART接收极性也需要取反,则设置RX_TOG位来使能UART接收极性取反功能。

  除了设置上述2个位外,其他部分的设置跟普通模式一模一样。

  02、初始化UART1

  从官网上下载MM32F013x例程,里面有UART普通模式的配置,主要是增加了UART->GCR的TX_TOG和RX_TOG位设置,如下:

  voiduart_nvic_init(u32bound){GPIO_InitTypeDefGPIO_InitStructure;UART_InitTypeDefUART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);//UART1NVICNVIC_InitStructure.NVIC_IRQChannel=UART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority=3;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);//BaudrateUART_StructInit(&UART_InitStructure);UART_InitStructure.BaudRate=bound;//Thewordlengthisin8-bitdataformat.UART_InitStructure.WordLength=UART_WordLength_8b;UART_InitStructure.StopBits=UART_StopBits_1;//Noevencheckbit.UART_InitStructure.Parity=UART_Parity_No;//Nohardwaredataflowcontrol.UART_InitStructure.HWFlowControl=UART_HWFlowControl_None;UART_InitStructure.Mode=UART_Mode_Rx|UART_Mode_Tx;UART_Init(UART1,&UART_InitStructure);UART_ITConfig(UART1,UART_IT_RXIEN,ENABLE);UART1->GCR|=UART_GCR_TXTOG;//发送取反位UART1->GCR|=UART_GCR_RXTOG;//接收取反位UART_Cmd(UART1,ENABLE);//UART1_TXGPIOA.9GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);//UART1_RXGPIOA.10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);}

  03、功能测试

  UART极性取反测试可以自发自收,需要将PA9和PA10短接,需要注意的是收发都需要配置成极性取反功能。在main函数所在.c文件里面,定义一个u8型全局变量UART_SendValue,UART_SendValue每隔500ms自加1,然后通过UART发送出去,依次循环。

  u8UART_SendValue=0;s32main(void){DELAY_Init();LED_Init();uart_nvic_init(9600);while(1){UartSendByte(++UART_SendValue);DELAY_Ms(500);}}

  在UART的中断服务函数里面,将接收到的数据存放在printBuf,这样可以在仿真界面下的watch窗口观看printBuf的值是否每隔500ms增加一次并且和UART_SendValue的值一致。

  voidUART1_IRQHandler(void){if(UART_GetITStatus(UART1,UART_ISR_RX)!=RESET){UART_ClearITPendingBit(UART1,UART_ISR_RX);printBuf=UART_ReceiveData(UART1);}}

  下图仿真界面下可以看到printBuf和UART_SendValue的值是一致的。

image.png

  图4UART仿真watch窗口数据对比

  下图逻辑分析仪抓取的逻辑波形,可以看到电平和分析到的数据都是一致的。

  

image.png


  图5UART极性0x09取反波形


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: MM32F013 UART

相关资讯

方案推荐
基于MC33771主控芯片的新能源锂电池管理系统解决方案

基于MC33771主控芯片的新能源锂电池管理系统解决方案

AMIC110 32位Sitara ARM MCU开发方案

AMIC110 32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于AMIC110多协议可编程工业通信处理器的32位Sitara ARM MCU开发方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于展讯SC9820超低成本LTE芯片平台的儿童智能手表解决方案

基于TI公司的AM437x双照相机参考设计

基于TI公司的AM437x双照相机参考设计

基于MTK6580芯片的W2智能手表解决方案

基于MTK6580芯片的W2智能手表解决方案