91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于靈動(dòng)微電子MM32F013x 系列的UART硬件自適應(yīng)波特率

電子設(shè)計(jì) ? 來(lái)源:靈動(dòng)MM32MCU ? 作者:靈動(dòng)MM32MCU ? 2021-02-15 09:09 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式工程師在開(kāi)發(fā)產(chǎn)品中經(jīng)常會(huì)用到MCU的片上UART和其它模塊進(jìn)行通信,為了在某些非正常的惡劣環(huán)境下能正常使用串口通信,可能需要對(duì)UART通信波特率進(jìn)行自適應(yīng)校準(zhǔn),在我們之前的微課堂中講解過(guò)關(guān)于MM32通用MCU的UART串口通信方面的基礎(chǔ)知識(shí),這里我們?cè)黾踊?a target="_blank">靈動(dòng)微電子MM32F013x 系列UART硬件自適應(yīng)波特率的使用。

1、原理

UART硬件波特率自適應(yīng)檢測(cè)首個(gè)通信字節(jié)的位寬(1bit、2bit、4bit、8bit),檢測(cè)前一個(gè)邊沿和后一個(gè)邊沿之間的位長(zhǎng),即檢測(cè)前一個(gè)邊沿為下降沿,后一個(gè)邊沿為上升沿或前一個(gè)邊沿為下降沿,后一個(gè)邊沿為下降沿,可通過(guò)軟件靈活配置。

本實(shí)例以串口工具作為上位機(jī),MM32F013x的UART1作為下位機(jī),MCU端初始化為非標(biāo)準(zhǔn)波特率9200,使能空閑中斷及其他狀態(tài)標(biāo)志位,上位機(jī)切換不同的波特率,由于上位機(jī)和MCU端的波特率不同,可能出現(xiàn)通信失敗的情況,啟動(dòng)UART硬件波特率自適應(yīng)功能,即檢測(cè)上位機(jī)發(fā)的首個(gè)字節(jié)位寬來(lái)識(shí)別上位機(jī)的波特率,MCU端通過(guò)硬件波特率自適應(yīng)切換到對(duì)應(yīng)的波特率,與上位機(jī)維持后續(xù)正常的通信。

如下圖所示,以首字節(jié)0XF8為例,首字節(jié)位寬為4bit的原理說(shuō)明:

o4YBAF_8C3aAf1jtAADJl_q1Dqc572.png

2、程序配置

2.1 初始化MM32F013x UART1串口

從官網(wǎng)下載MM32F013x例程,這里我們?cè)贛M32F0133C7P的樣例程序中添加注釋并對(duì)代碼修改。

#include "bsp_UART.h"
#include "led.h"
/*******************************************************************************
* 函數(shù)名稱:void bsp_UART1_Init(u32 baudrate)
* 函數(shù)功能:初始化UART1 PA9/PA10分別作為UART1的TX/RX
* 輸入?yún)?shù):無(wú)
* 返回?cái)?shù)值:無(wú)
******************************************************************************/
void bsp_UART1_Init(u32 baudrate)
{
    //GPIO初始化結(jié)構(gòu)體
    GPIO_InitTypeDef GPIO_InitStructure;
    //UART初始化結(jié)構(gòu)體
    UART_InitTypeDef UART_InitStructure;    
    //NVIC初始化結(jié)構(gòu)體
    NVIC_InitTypeDef NVIC_InitStructure;

    //使能UART1時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);        
    //使能GPIOA時(shí)鐘
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  

    //開(kāi)啟GPIOA PA9復(fù)用于UART1_TX功能 
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);    
    //開(kāi)啟GPIOA PA10復(fù)用于UART1_RX功能 
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);   

    //UART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     
    //配置GPIOA.9 速度為高速50MHz
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
    //配置GPIOA.9為復(fù)用推挽輸出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
    //根據(jù)GPIO結(jié)構(gòu)體初始化UART1_TX GPIOA.9
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //UART1_RX GPIOA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    
    //配置UART1_RX GPIOA.10為上拉輸入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    
    //根據(jù)GPIO結(jié)構(gòu)體初始化UART1_RX GPIOA.10
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //串口波特率
    UART_InitStructure.UART_BaudRate = baudrate;    
    //字長(zhǎng)為8位數(shù)據(jù)格式
    UART_InitStructure.UART_WordLength = UART_WordLength_8b;    
    //一位停止位
    UART_InitStructure.UART_StopBits = UART_StopBits_1;    
    //無(wú)奇偶校驗(yàn)位
    UART_InitStructure.UART_Parity = UART_Parity_No;    
    //無(wú)硬件數(shù)據(jù)流控
    UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;    
    //允許收發(fā)模式
    UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
    //根據(jù)UART結(jié)構(gòu)體初始化串口UART1
    UART_Init(UART1, &UART_InitStructure);

    //硬件自動(dòng)波特率檢測(cè)第1個(gè)字節(jié)位的位寬前一個(gè)邊沿為下降沿,后一個(gè)邊沿為上升沿
    //___              _______
    //   |_ _ _ _|1 x x x x|        = Binary:xxxx 1000  Fall to Rise -> 1 start bit 
    //AutoBaudRate Mode Fall to Rise 4bit width,the first byte is 0xF8 use test

    UART_AutoBaudRateSet(UART1, ABRMODE_FALLING_TO_RISINGEDGE4BIT, ENABLE);

    //接收數(shù)據(jù)中斷、接收幀錯(cuò)誤中斷、自動(dòng)波特率結(jié)束中斷、自動(dòng)波特率錯(cuò)誤中斷、空閑中斷
    UART_ITConfig(UART1, UART_IT_RXIEN | UART_ICR_RXFERRCLR | UART_ICR_ABRENDCLR |\ UART_ICR_ABRERRCLR | UART_ICR_RXIDLE | UART_IT_ERR, ENABLE);
    //使能UART1
    UART_Cmd(UART1, ENABLE);

    //UART1 NVIC中斷優(yōu)先級(jí)設(shè)置
    NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
    //UART通道優(yōu)先級(jí)0
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;          
    //IRQ通道使能
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
    //根據(jù)指定的參數(shù)初始化NVIC寄存器
    NVIC_Init(&NVIC_InitStructure);    
}

2.2 編寫(xiě)MM32F013x UART1串口中斷服務(wù)函數(shù)

繼續(xù)在bsp_UART.c文件中編寫(xiě)MM32F013x UART1串口中斷服務(wù)函數(shù)如下所示。

/*******************************************************************************
* 函數(shù)名稱:void UART1_IRQHandler(void)
* 函數(shù)功能:串口1 UART1中斷服務(wù)程序
* 輸入?yún)?shù):無(wú)
* 返回?cái)?shù)值:無(wú)
*******************************************************************************/
//自動(dòng)波特率幀錯(cuò)誤標(biāo)志
u8 Auto_BaudRate_FraErr_Flag = 0;
void UART1_IRQHandler(void)                    
{
    u8 Res;

    //UART1接收中斷
    if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET)  
    {
        //清UART1接收中斷標(biāo)志
        UART_ClearITPendingBit(UART1,UART_IT_RXIEN);            
        //讀取UART1接收到的數(shù)據(jù)
        Res = UART_ReceiveData(UART1);        
        //UART1接收數(shù)據(jù)緩存起來(lái),最大接收UART1_REC_LEN個(gè)字節(jié) 
        UART1_Rx_Buf[UART1_Rx_Cnt] = Res;        
        //UART1作接收緩存溢出判斷,最大接收UART1_REC_LEN個(gè)字節(jié)
        if(UART1_Rx_Cnt < UART1_REC_LEN-1)
        {
            //還有數(shù)據(jù)要接收,接收計(jì)數(shù)變量自加
            UART1_Rx_Cnt++;
        }
        else
        {
            UART1_Rx_Cnt = 0;
        }
    }

    //幀錯(cuò)誤中斷標(biāo)志位
    if(UART_GetITStatus(UART1, UART_IER_RXFERR) != RESET)
    {
        //自動(dòng)波特率幀錯(cuò)誤標(biāo)志置1
        Auto_BaudRate_FraErr_Flag = 1;
        //清幀錯(cuò)誤中斷標(biāo)志位
        UART_ClearITPendingBit(UART1,UART_IER_RXFERR);
    }

    //接收數(shù)據(jù)幀錯(cuò)誤中斷
    if(UART_GetITStatus(UART1, UART_ICR_RXFERRCLR) != RESET)
    {     
        UART_ClearITPendingBit(UART1,UART_ICR_RXFERRCLR);
    }

    //空閑中斷硬件波特率自校準(zhǔn)
    if(UART_GetITStatus(UART1, UART_ICR_RXIDLE) != RESET)
    {
        UART_ClearITPendingBit(UART1,UART_ICR_RXIDLE);

        //自動(dòng)波特率幀錯(cuò)誤標(biāo)志
        if(Auto_BaudRate_FraErr_Flag == 1)
        {
            Auto_BaudRate_FraErr_Flag = 0;

    //----------------Check MM32F013x UART_AutoBaudRateHard----------
    //___              _______
    //   |_ _ _ _|1 x x x x|  = Binary:xxxx 1000  Fall to Rise -> 1 start bit 
    //AutoBaudRate Mode Fall to Rise 4bit width,the first byte is 0xF8 use test

        UART_AutoBaudRateSet(UART1, ABRMODE_FALLING_TO_RISINGEDGE4BIT, ENABLE);    
        }
    }

    //自動(dòng)波特率錯(cuò)誤中斷清除位
    if(UART_GetITStatus(UART1, UART_ICR_ABRERRCLR) != RESET)
    {      
        UART_ClearITPendingBit(UART1,UART_ICR_ABRERRCLR);  
    }

    //自動(dòng)波特率結(jié)束中斷清除位
    if(UART_GetITStatus(UART1, UART_ICR_ABRENDCLR) != RESET)
    {
        UART_ClearITPendingBit(UART1,UART_ICR_ABRENDCLR);
    }
}

2.3 MM32F013x UART1串口接收函數(shù)

在bsp_UART.h文件中宏定義UART1波特率、接收字節(jié)長(zhǎng)度,變量聲明以及UART1接收數(shù)據(jù)函數(shù)和發(fā)送數(shù)據(jù)函數(shù)聲明。

 void UART1_Recv_Task(void)
{   
   //收到的數(shù)據(jù)原樣返回到串口上位機(jī)
   UART_SendBytes(UART1,UART1_Rx_Buf, UART1_Rx_Cnt);
}

2.4 MM32F013x UART串口發(fā)送函數(shù)

在bsp_UART.c文件中編寫(xiě)MM32F013x UART1發(fā)送數(shù)據(jù)函數(shù),發(fā)送單字節(jié)數(shù)據(jù)和發(fā)送多字節(jié)數(shù)據(jù)函數(shù)分別如下所示:

/*******************************************************************************
* 函數(shù)名稱:void UART_SendByte(UART_TypeDef* UARTx,u8 dat)
* 函數(shù)功能:UART發(fā)送單字節(jié)數(shù)據(jù)
* 輸入?yún)?shù):UARTx:UART1/UART2;dat:待發(fā)送的數(shù)據(jù)
* 返回?cái)?shù)值:無(wú)
*******************************************************************************/
void UART_SendByte(UART_TypeDef* UARTx,u8 dat)
{
    UART_SendData(UARTx, dat);

    while(!UART_GetFlagStatus(UARTx, UART_FLAG_TXEPT));
}

/*******************************************************************************
* 函數(shù)名稱:void UART_SendBytes(UART_TypeDef* UARTx,u8* buf, u16 len)
* 函數(shù)功能:UART發(fā)送多字節(jié)數(shù)據(jù)
* 輸入?yún)?shù):UARTx:UART1/UART2;buf:待發(fā)送的數(shù)據(jù);len:待發(fā)送數(shù)據(jù)的長(zhǎng)度
* 返回?cái)?shù)值:無(wú)
*******************************************************************************/
void UART_SendBytes(UART_TypeDef* UARTx,u8* buf, u16 len)
{
    while(len--)
    {
        UART_SendByte(UARTx,*buf++);       
    }
}

3、MM32F013x UART硬件 自適應(yīng)波特率的功能演示

在main.c文件的main函數(shù)里初始化bsp_UART1_Init(9200)串口初始化函數(shù),在while(1)大循環(huán)里調(diào)用測(cè)試UART1硬件自動(dòng)波特率收發(fā)數(shù)據(jù)函數(shù):UART1_Recv_Task();這里以檢測(cè)UART1通信首字節(jié)為4bit寬為例,模式為前一個(gè)邊沿為下降沿,后一個(gè)邊沿為上升沿。

MCU端設(shè)置非標(biāo)準(zhǔn)波特率9200,我們通過(guò)上位機(jī)以不同的波特率發(fā)送F8進(jìn)行硬件波特率自適應(yīng),自適應(yīng)完成后UART1就切換到對(duì)應(yīng)的波特率,MCU端收到數(shù)據(jù)后直接返回給上位機(jī)。

o4YBAF_8C4mAVXorAAHgpS9Jm6M455.png

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18925

    瀏覽量

    398150
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1314

    瀏覽量

    106644
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1662

    瀏覽量

    57971
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    是否可以將 visionfive2 的 uart 配置為 1Mb 波特率?

    我需要通過(guò) uart 加載 u-boot 和 u-boot spl,由于某種原因我不能使用 sd 或 spi flash。但是這需要太多時(shí)間,因?yàn)槟J(rèn)的 uart 波特率是 115200。 我試過(guò)
    發(fā)表于 02-04 06:24

    碩博電子IO模塊修改波特率和節(jié)點(diǎn)ID操作步驟

    正確設(shè)置波特率與節(jié)點(diǎn)ID,是保證IO模塊與控制器穩(wěn)定通信的關(guān)鍵。配置不當(dāng)易引發(fā)設(shè)備失聯(lián)、數(shù)據(jù)錯(cuò)亂等故障。本文將詳細(xì)講解波特率與節(jié)點(diǎn)ID的規(guī)范修改步驟,輕松搞定配置難題。
    的頭像 發(fā)表于 01-27 10:39 ?517次閱讀
    碩博<b class='flag-5'>電子</b>IO模塊修改<b class='flag-5'>波特率</b>和節(jié)點(diǎn)ID操作步驟

    FDCAN 數(shù)據(jù)段波特率增加后發(fā)送失敗的問(wèn)題分析

    客戶在使用 FDCAN 協(xié)議,仲裁段波特率配置位 1Mbit/s,數(shù)據(jù)段波特率配置為 5Mbit/s時(shí),發(fā)現(xiàn) FDCAN 發(fā)送功能異常。首先建議客戶使用 IC 內(nèi)部回環(huán)模式進(jìn)行測(cè)試發(fā)現(xiàn) 5M
    發(fā)表于 01-04 11:16 ?0次下載

    請(qǐng)問(wèn)UART內(nèi)核接收數(shù)據(jù)時(shí)如何控制波特率和移位寄存器?

    UART內(nèi)核接收數(shù)據(jù)時(shí)如何控制波特率和移位寄存器?
    發(fā)表于 12-25 06:03

    支持小數(shù)波特率的意義是什么

    我看芯源有一款MCU是支持小數(shù)波特率,支持小數(shù)波特率的意義是什么?是為了數(shù)據(jù)傳輸更穩(wěn)定?
    發(fā)表于 12-11 07:15

    國(guó)產(chǎn)MCU-靈動(dòng)MM32F0050系列微控制器的簡(jiǎn)單分享

    在當(dāng)今智能設(shè)備蓬勃發(fā)展的時(shí)代,微控制器(MCU)作為電子產(chǎn)品的"大腦",正朝著更高性能、更小體積的方向快速演進(jìn)。靈動(dòng)微電子推出的MM32F0050
    的頭像 發(fā)表于 11-04 14:54 ?400次閱讀

    UART波特率計(jì)算及UART收發(fā)回顯實(shí)驗(yàn)

    決定串口波特率的寄存器有BRR(Bite Rate Rigister),SEMR(Serial Extended Mode Rigister)和MDDR(Modulation Duty
    的頭像 發(fā)表于 10-17 09:51 ?2980次閱讀
    <b class='flag-5'>UART</b><b class='flag-5'>波特率</b>計(jì)算及<b class='flag-5'>UART</b>收發(fā)回顯實(shí)驗(yàn)

    請(qǐng)問(wèn)如何使用低功耗 UART (LP UART波特率補(bǔ)償?

    如何使用低功耗 UART (LP UART波特率補(bǔ)償?
    發(fā)表于 08-21 07:05

    波特率是什么

    波特率是串行通信中的一個(gè)核心參數(shù),用于描述數(shù)據(jù)在傳輸線路上的傳輸速率。以下從定義、單位、與比特的關(guān)系、實(shí)際應(yīng)用及設(shè)置注意事項(xiàng)等方面進(jìn)行詳細(xì)說(shuō)明: 一、定義與本質(zhì) 波特率(Baud Rate)指單位
    的頭像 發(fā)表于 07-22 11:11 ?8342次閱讀

    可編程電源的通信波特率應(yīng)如何設(shè)置?

    、115200bps),并通過(guò)測(cè)試驗(yàn)證最佳參數(shù)。以下是具體設(shè)置方法與注意事項(xiàng):一、波特率設(shè)置的核心原則 設(shè)備兼容性優(yōu)先 查閱手冊(cè):確認(rèn)電源支持的波特率范圍(如Keysight N6700系列
    發(fā)表于 07-07 15:01

    基于瑞薩64位MPU RZ/G2L的uboot串口多波特率支持介紹

    本文主要介紹基于瑞薩64位MPU RZ/G2L,討論uboot下非常規(guī)波特率115200的支持方法,用于解決客戶對(duì)uboot下特殊波特率的需求,供客戶參考。
    的頭像 發(fā)表于 07-04 15:54 ?3060次閱讀
    基于瑞薩64位MPU RZ/G2L的uboot串口多<b class='flag-5'>波特率</b>支持介紹

    靈動(dòng)微電子推出基于Arm Cortex-M0+內(nèi)核的MM32G0005系列MCU

    靈動(dòng)微電子超值型MM32G0001自推出以來(lái),累計(jì)出貨超億顆,此次超值型系列突破性升級(jí),隆重推出MM32G0005
    的頭像 發(fā)表于 06-28 09:54 ?1775次閱讀
    <b class='flag-5'>靈動(dòng)</b><b class='flag-5'>微電子</b>推出基于Arm Cortex-M0+內(nèi)核的<b class='flag-5'>MM</b>32G0005<b class='flag-5'>系列</b>MCU

    靈動(dòng)微電子MM32MCU的主流型芯片選型

    靈動(dòng)微電子MM32系列32位MCU已經(jīng)在江湖上久負(fù)盛名,以產(chǎn)品平臺(tái)化、系列化、兼容性好、性價(jià)比高、易于開(kāi)發(fā)著稱。
    的頭像 發(fā)表于 05-06 13:32 ?2824次閱讀
    <b class='flag-5'>靈動(dòng)</b><b class='flag-5'>微電子</b><b class='flag-5'>MM</b>32MCU的主流型芯片選型

    靈動(dòng)微電子推出全新超值型MM32F0050系列MCU

    靈動(dòng)微電子推出全新超值型MM32F0050系列MCU。2018年,靈動(dòng)首次上市了其主打性價(jià)比的超值型MM
    的頭像 發(fā)表于 04-01 09:36 ?1765次閱讀
    <b class='flag-5'>靈動(dòng)</b><b class='flag-5'>微電子</b>推出全新超值型<b class='flag-5'>MM32F</b>0050<b class='flag-5'>系列</b>MCU

    STM32G070 UART串口,低波特率傳送數(shù)據(jù)時(shí),TIMER出現(xiàn)嚴(yán)重延時(shí)現(xiàn)象如何解決?

    STM32G070, UART串口,低波特率傳送數(shù)據(jù)時(shí),TIMER出現(xiàn)嚴(yán)重延時(shí)現(xiàn)象,傳送數(shù)據(jù)長(zhǎng)的話,導(dǎo)致系統(tǒng)重啟。如何解決?
    發(fā)表于 03-07 07:07