Nuoeriris · 2020年12月14日

MM32F013x——UART 9bit 通信

在之前的微课堂中和大家分享过灵动MM32系列MCU的UART通信实例,在此实例的基础上我们增加UART 9bit通信功能。UART 9bit通信的作用是第9bit用于标识是地址或数据,第9bit 为1标识是从机地址,为0标识是数据,此外UART通信的第9bit也可作为数据的同步帧位使用。

在双机通讯中,UART8bit通信的第九位一般是奇偶校验位,而多机通讯中,第九位用于标识地址或数据,常用1表示后面的是从机地址,0表示后面的是数据。我们通常希望只有被寻址的接收者才被激活,来接收随后的数据,这样就可以减少由未被寻址的接收器的参与带来的多余的UART服务开销。未被寻址的设备可启用其静默功能置于静默模式。在静默模式里,任何接收状态位都不会被设置,所有接收中断被禁止。

以MM32F013x系列MCU的UART通信为例,通过一个示例Demo介绍UART 9bit通信的同步帧方式。

1. 与UART 9bit通信相关的寄存器

1.png
图一

如上图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)

2. 程序配置

2.1 初始化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 
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);
}
2.1.1 编写MM32F013x UART1中断函数

MM32F013x UART1中断服务函数,同时将收到的数据发送出去,代码如下所示:

void
UART1_IRQHandler(void)
{
    u8 res;
 
    if(UART_GetITStatus(UART1,UART_IT_RXIEN)
    {
        //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.1.2 编写MM32F013x UART1发送函数

使用之前工程的MM32F0133C7P UART1发送函数,代码如下所示:

void bsp_UART1_Send_Byte(u8 dat)
{
    UART_SendData(UART1,dat);
    while(!UART_GetFlagStatus(UART1,UART_FLAG_TXEPT));
}

3. 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通信发送数据的波形如下图所示。
2.jpg
图2

演示接收数据:以上位机串口助手发送0xAA为例,使用逻辑分析仪抓取UART1
9bit通信收到的数据的波形,观察箭头所指第bit9位,如下图3所示:
3.png
图3

推荐阅读
关注数
6108
内容数
272
灵动MM32 MCU相关技术知识,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息