完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在之前的微课堂中和大家分享过灵动MM32系列MCU的UART通信实例,在此实例的基础上我们增加UART 9bit通信功能。UART 9bit通信的作用是第9bit用于标识是地址或数据,第9bit 为1标识是从机地址,为0标识是数据,此外UART通信的第9bit也可作为数据的同步帧位使用。 在双机通讯中,UART的8bit通信的第九位一般是奇偶校验位,而多机通讯中,第九位用于标识地址或数据,常用1表示后面的是从机地址,0表示后面的是数据。我们通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的UART服务开销。未被寻址的设备可启用其静默功能置于静默模式。在静默模式里,任何接收状态位都不会被设置,所有接收中断被禁止。 以MM32F013x系列MCU的UART通信为例,通过一个示例Demo介绍UART 9bit通信的同步帧方式。 01 与UART 9bit通信相关的寄存器 图一 如上图1所示为UART通用控制寄存器UART_CCR,在MM32F013x UM手册的第489和第490页有关于该寄存器位的详细描述。本实例用到的UART通用控制寄存器UART_CCR位说明如下:Bit11 B8EN(rw, reset:0x00)UART同步帧发送第9bit使能控制位。该位使能后校验使能PEN不起作用。 1:使能同步帧第9bit发送。 库函数设置: UART_Enable9bit(UART1, ENABLE) 0:禁止同步帧第9bit发送。 库函数设置: UART_Enable9bit(UART1, DISABLE) Bit10 B8TOG(rw,reset:0x00)UART同步帧发送第9bit自动翻转控制位。 1:使能第9bit自动翻转。 库函数设置: UART_Set9bitAutomaticToggle(UART1, ENABLE) 0:禁止第9bit自动翻转。 库函数设置: UART_Set9bitAutomaticToggle(UART1, DISABLE) 注:在 B8TXD 和 B8POL 的值相同时,在配置完寄存器后传输的第二个数据开始翻转,第一个数据默认为地址位。 Bit8 B8TXD(rw,reset:0x00)UART同步帧发送数据第9bit。 1:发送同步帧第9bit为高电平。 库函数设置: UART_Set9bitLevel(UART1, ENABLE) 0:发送同步帧第9bit为低电平。 库函数设置: UART_Set9bitLevel(UART1, DISABLE) 02 程序配置 初始化MM32F013x UART1 9bit通信 从官网下载MM32F013x例程,以MM32F0133C7P的UART1通信为例,增加与UART 9bit通信相关的寄存器位的初始化,这里以库函数方式给出,增加的3行代码如下所示: //Synchronous frame enable bit UART_CCR Bit11:B8EN UART_Enable9bit(UART1, ENABLE); //Synchronous frame transmit UART_CCR Bit8: B8TXD UART_Set9bitLevel(UART1, DISABLE); //Synchronous frame auto toggle UART_CCR Bit10:B8TOG UART_Set9bitAutomaticToggle(UART1, ENABLE); MM32F0133C7P UART1 9bit通信,初始化代码如下所示: void bsp_UART1_9Bit_Init(u32 baudrate) { GPIO_InitTypeDef GPIO_InitStructure; UART_InitTypeDef UART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); GPIO_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); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); UART_StructInit(&UART_InitStructure); UART_InitStructure.BaudRate = baudrate; UART_InitStructure.WordLength = UART_WordLength_8b; UART_InitStructure.StopBits = UART_StopBits_1; UART_InitStructure.Parity = UART_Parity_No; 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); UART_Enable9bit(UART1, ENABLE); UART_Set9bitLevel(UART1, DISABLE); UART_Set9bitAutomaticToggle(UART1, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); UART_Cmd(UART1, ENABLE); } 1●编写MM32F013x UART1中断函数 MM32F013x UART1中断服务函数,同时将收到的数据发送出去,代码如下所示: void UART1_IRQHandler(void) { u8 res; if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET) { //Receiving interrupts (data received must end at 0x0D 0x0a) UART_ClearITPendingBit(UART1, UART_IT_RXIEN); //read receive data. res = UART_ReceiveData(UART1); bsp_UART1_Send_Byte(res); } } 2●编写MM32F013x UART1发送函数 使用之前工程的MM32F0133C7P UART1发送函数,代码如下所示: void bsp_UART1_Send_Byte(u8 dat) { UART_SendData(UART1, dat); while(!UART_GetFlagStatus(UART1, UART_FLAG_TXEPT)); }MM32F013x UART1 9bit通信功能演示在main函数中调用SysTick和UART1 9bit通信初始化函数,代码如下所示: s32 main(void) { //SysTick init DELAY_Init(); //UART1 9bit init bsp_UART1_9Bit_Init(115200); while(1) { bsp_UART1_Send_Byte(0x55); DELAY_Ms(500); } } 编译工程代码,然后烧录软件到MM32F0133C7P核心板上,用逻辑分析仪抓取UART1 9bit通信发送数据和接收数据的波形: 演示发送数据:以MM32F0133C7P发送0x55为例,使用逻辑分析仪抓取UART1 9bit通信发送数据的波形如下图所示。 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2249个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11703 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5930 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10965 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4577 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4302 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
981浏览 1评论
806浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 22:13 , Processed in 0.565418 second(s), Total 62, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号