首页| 行业标准| 论文文档| 电子资料| 图纸模型
购买积分 购买会员 激活码充值

您现在的位置是:团子下载站 > 其他 > MM32F013x——UART 单线半双工通信

MM32F013x——UART 单线半双工通信

  • 资源大小:249.91KB
  • 上传时间:2021-08-19
  • 下载次数:0次
  • 浏览次数:36次
  • 资源积分:1积分
  • 标      签: MM32F013x 灵动微电子 uart

资 源 简 介

本文将介绍在MM32F013x上实现UART单线半双工的功能应用。UART单线半双工简介在使用数字舵机通讯时所用到的通信方式为UART通信,但舵机只有三根接线,除去VCC和GND,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式。在单线半双工模式下,TX和RX引脚在芯片内部互连。01配置流程单线半双工模式是通过设置UART_SCR寄存器的HDSEL位,在这个模式里UART_SCR寄存器的SCEN位必须保持清零状态。在单线半双工模式下,TX和RX引脚在芯片内部互联,使用控制位”HALFDUPLEXSEL”(UART_SCR中的HDSEL位)选择半双工和全双工通信。注意当选择单线半双工模式时RX不再被使用,当有数据需要发送的时候IO才会被UART驱动,没有数据传输时TX总是被释放,所以使用单线半双工需要外部加上拉。除此之外通讯上和正常的UART模式类似。由于是单线半双工同一时刻总线上只能有一个节点发送,所以需要软件协议层去管理线上冲突防止多个设备同时发送,当TXEN位被设置时,只要数据一写到数据寄存器上,发送就继续。02UART_SCR寄存器描述配置UART_SCR的HDSEL为1UART_SCR寄存器的SCEN位清零初始化UART1从官网上下载MM32F013x例程,里面有UART普通模式的配置,在这个基础上我们直接调用UART_HalfDuplexCmd(UART1,ENABLE);函数接口将串口配置成单线半双工模式,然后IO口初始化只需要配置PA9TX即可,如下:voidUART1_NVIC_Init(u32baudrate){UART_InitTypeDefUART_InitStructure;NVIC_InitTypeDefNVIC_InitStructure;GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1,ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA,ENABLE);//UART1NVICNVIC_InitStructure.NVIC_IRQChannel=UART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);//BaudrateUART_StrucTInit(&UART_InitStructure);UART_InitStructure.BaudRate=baudrate;//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_HalfDuplexCmd(UART1,ENABLE);//HalfDuplexEnableUART_ITConfig(UART1,UART_IT_RXIEN,ENABLE);UART_Cmd(UART1,ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//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);}功能验证测试UART单线半双工功能测试我们现在拿两个MM32F0133的板子一个做主机一个做从机进行单线收发测试,主机先发送一包数据给从节点,当从节点收到这包数据后再把这包数据发回给主机,然后主机和从机两个板子PA9短接到一起,外部在加一个4.7K上拉电阻。主机函数处理:uint8_ttxbuff[10]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA};s32main(void){CONSOLE_Init(115200);//UART2printf打印UART1_NVIC_Init(115200);printf("UARTHalfDuplexTXTest/r/n");UART1_Send_Group(txbuff,sizeof(txbuff));printf("TXData:");for(index=0;index主机UART的中断服务函数里面,将接从机发送的数据存放在Rx_buff里面,当收到一包数据后通过printf打印到串口,和原始发送的数据进行对比。voidUART1_IRQHandler(void){u8recvbyte;//Sendpacketif(UART_GeTITStatus(UART1,UART_IT_TXIEN)!=RESET){UART_ClearITPendingBit(UART1,UART_IT_TXIEN);}//RecvpackeTIf(UART_GetITStatus(UART1,UART_ISR_RX)!=RESET){UART_ClearITPendingBit(UART1,UART_ISR_RX);recvbyte=UART_ReceiveData(UART1);Rx_buff[rx_cnt]=recvbyte;rx_cnt++;if(rx_cnt==10){gUartRxSta=1;rx_cnt=0;}}}从机函数处理:s32main(void){CONSOLE_Init(115200);//UART2printf打印UART1_NVIC_Init(115200);printf("UARTHalfDuplexRXTest/r/n");while(1){if(gUartRxSta==1)//收到一包数据{gUartRxSta=0;UART1_Send_Group(Rx_buff,10);memset(Rx_buff,0x00,10);}}//return0;}从机UART的中断服务函数里面,将接主机发送的数据存放在Rx_buff里面,当收到一包数据后通过单线半双工这个串口发送回去。voidUART1_IRQHandler(void){u8recvbyte;//Sendpacketif(UART_GetITStatus(UART1,UART_IT_TXIEN)!=RESET){UART_ClearITPendingBit(UART1,UART_IT_TXIEN);}//Recvpacketif(UART_GetITStatus(UART1,UART_ISR_RX)!=RESET){UART_ClearITPendingBit(UART1,UART_ISR_RX);recvbyte=UART_ReceiveData(UART1);Rx_buff[rx_cnt]=recvbyte;rx_cnt++;if(rx_cnt==10){gUartRxSta=1;rx_cnt=0;}}}观察测试结果:然后我们通过主机UART2的printf打印可以看到主机TXData和从机返回的RXData数据是一样的。再看看下图逻辑分析仪抓取的逻辑波形,可以也可以看到主机发送的波形和从机返回的波形数据是一样的。转自:灵动微电子
VIP VIP