资料介绍
在之前的微课堂中和大家分享过灵动MM32系列MCU的UART通信实例,在此实例的基础上我们增加UART 9bit通信功能。UART 9bit通信的作用是第9bit用于标识是地址或数据,第9bit 为1标识是从机地址,为0标识是数据,此外UART通信的第9bit也可作为数据的同步帧位使用。
在双机通讯中,UART的8bit通信的第九位一般是奇偶校验位,而多机通讯中,第九位用于标识地址或数据,常用1表示后面的是从机地址,0表示后面的是数据。我们通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的UART服务开销。未被寻址的设备可启用其静默功能置于静默模式。在静默模式里,任何接收状态位都不会被设置,所有接收中断被禁止。
以MM32F013x系列MCU的UART通信为例,通过一个示例Demo介绍UART 9bit通信的同步帧方式。
一、与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)
二、程序配置
初始化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通信发送数据的波形如下图所示。
演示接收数据:
以上位机串口助手发送0xAA为例,使用逻辑分析仪抓取UART1 9bit通信收到的数据的波形,观察箭头所指第bit9位,如下图3所示:
转自:灵动MM32MCU
- MM32F013x——ADC任意通道工作模式
- MM32F013x——RTC闹钟定时唤醒
- MM32F013x——移植EasyLogger组件
- MM32F013x——UART 9bit 通信
- MM32F013x——UART 多处理器通信
- MM32F013x——UART 极性取反通信
- MM32F013x——UART 单线半双工通信
- MM32F013x——UART ISO7816-3协议的应用
- MM32F013x——ADC任意通道工作模式
- MM32F013x——移植EasyFlash组件
- MM32F013x——移植EasyLogger组件
- 基于ARM Cortex M0的微控制器MM32F013x 22次下载
- MM32F013x——UART 单线半双工通信
- MM32F013x——UART 极性取反通信
- MM32F013x——UART 多处理器通信
- 【GD32 MCU 移植教程】9、从 STM32F10x 系列移植到 GD32F30x 系列 111次阅读
- 简单认识UART串行通信协议 1292次阅读
- MM32F0140 DMA学习笔记 588次阅读
- 基于STM32模拟UART串口通信 1513次阅读
- 基于FPGA实现多路UART/SPI通信系统 1506次阅读
- 基于MM32F5270控制器的I2S音频播放 2028次阅读
- UART串口通信协议详解 6856次阅读
- stm32串口奇偶校验 1w次阅读
- 基于Verilog的UART串行通信接口电路设计 2213次阅读
- SAM4E单片机在UART异步串口通信协议中的应用 1462次阅读
- 浅谈UART通信协议 UART接收数据时序设计 8312次阅读
- 串口通信的原理,IO口模拟UART串口通信 2.1w次阅读
- 单片机通信uart和modbus有什么区别 2w次阅读
- 单片机之间UART通信示意图分享 1.6w次阅读
- k9f1208完整手册 k9f1208数据表Datasheet资料下载 2767次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多