基于MM32F013x上实现UART极性取反的设计方案
原标题:基于MM32F013x上实现UART极性取反的设计方案
本文是针对在MM32F013x上实现UART极性取反的功能应用。
在嵌入式领域,通常默认串口的电平是高电平为逻辑1,低电平为逻辑0,而在MM32的UART特性中是可以将高电平设置为逻辑0,低电平设置为逻辑1的,UART极性取反虽然不常用,但还是在特殊情况下是需要这个功能,比如硬件设计已经导致必须使用极性取反,否则电路就要改板或者增加反相电路。例如下图的UART隔离电路就需要UART发送极性取反功能。
图1UART隔离电路
01、UART极性取反简介
UART极性取反下的电平与正常模式下的电平是相反的,正常情况下,UART空闲时电平是高,起始位是空闲状态下变成低电平,bit为1时电平也高。在UART极性取反状态下,空闲电平是低电平,起始位是高,bit为1时电平是低。
在数据接收发送寄存器中,数据也是可以反转的,原来的0变为1,原来的1变为0,这和电平极性反转是类似。需要特别注意的是,在极性反转的时候,起始位和结束位也都反转了,所有的信号电平都反转;而在数据寄存器中只反转了数据位,其中也包含了校验位,没有反转信号的起始位和结束位的极性。
图2UART极性取反波形
上图是用逻辑分析仪抓取的UART极性取反的逻辑波形。红色字体:“IDLE”部分是空闲状态,“START”是起始位,后面“0~7”是数据的bit0~bit7,“STOP”是停止位,“IDLE”是空闲(注意,逻辑分析仪设置反向,不然只能抓到波形,无法解析出数据)。
图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的值是一致的。
图4UART仿真watch窗口数据对比
下图逻辑分析仪抓取的逻辑波形,可以看到电平和分析到的数据都是一致的。
图5UART极性0x09取反波形
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。