chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

1、原理

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

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

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

o4YBAF_8C3aAf1jtAADJl_q1Dqc572.png

2、程序配置

2.1 初始化MM32F013x UART1串口

從官網(wǎng)下載MM32F013x例程,這里我們在MM32F0133C7P的樣例程序中添加注釋并對代碼修改。

#include "bsp_UART.h"
#include "led.h"
/*******************************************************************************
* 函數(shù)名稱:void bsp_UART1_Init(u32 baudrate)
* 函數(shù)功能:初始化UART1 PA9/PA10分別作為UART1的TX/RX
* 輸入?yún)?shù):無
* 返回?cái)?shù)值:無
******************************************************************************/
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時鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);        
    //使能GPIOA時鐘
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  

    //開啟GPIOA PA9復(fù)用于UART1_TX功能 
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);    
    //開啟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;    
    //字長為8位數(shù)據(jù)格式
    UART_InitStructure.UART_WordLength = UART_WordLength_8b;    
    //一位停止位
    UART_InitStructure.UART_StopBits = UART_StopBits_1;    
    //無奇偶校驗(yàn)位
    UART_InitStructure.UART_Parity = UART_Parity_No;    
    //無硬件數(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);

    //硬件自動波特率檢測第1個字節(jié)位的位寬前一個邊沿為下降沿,后一個邊沿為上升沿
    //___              _______
    //   |_ _ _ _|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ù)中斷、接收幀錯誤中斷、自動波特率結(jié)束中斷、自動波特率錯誤中斷、空閑中斷
    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)先級設(shè)置
    NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;
    //UART通道優(yōu)先級0
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;          
    //IRQ通道使能
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
    //根據(jù)指定的參數(shù)初始化NVIC寄存器
    NVIC_Init(&NVIC_InitStructure);    
}

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

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

/*******************************************************************************
* 函數(shù)名稱:void UART1_IRQHandler(void)
* 函數(shù)功能:串口1 UART1中斷服務(wù)程序
* 輸入?yún)?shù):無
* 返回?cái)?shù)值:無
*******************************************************************************/
//自動波特率幀錯誤標(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ù)緩存起來,最大接收UART1_REC_LEN個字節(jié) 
        UART1_Rx_Buf[UART1_Rx_Cnt] = Res;        
        //UART1作接收緩存溢出判斷,最大接收UART1_REC_LEN個字節(jié)
        if(UART1_Rx_Cnt < UART1_REC_LEN-1)
        {
            //還有數(shù)據(jù)要接收,接收計(jì)數(shù)變量自加
            UART1_Rx_Cnt++;
        }
        else
        {
            UART1_Rx_Cnt = 0;
        }
    }

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

    //接收數(shù)據(jù)幀錯誤中斷
    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);

        //自動波特率幀錯誤標(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);    
        }
    }

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

    //自動波特率結(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é)長度,變量聲明以及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文件中編寫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ù)值:無
*******************************************************************************/
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ù)的長度
* 返回?cái)?shù)值:無
*******************************************************************************/
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)用測試UART1硬件自動波特率收發(fā)數(shù)據(jù)函數(shù):UART1_Recv_Task();這里以檢測UART1通信首字節(jié)為4bit寬為例,模式為前一個邊沿為下降沿,后一個邊沿為上升沿。

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

o4YBAF_8C4mAVXorAAHgpS9Jm6M455.png

編輯:hfy

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

    關(guān)注

    147

    文章

    18794

    瀏覽量

    393106
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1308

    瀏覽量

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

    關(guān)注

    34

    文章

    1661

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

    國產(chǎn)MCU-靈動MM32F0050系列微控制器的簡單分享

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

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

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

    115200的波特率,為啥實(shí)際速度只有11KB/s?

    波特率≠真實(shí)速度! 這幾個概念確實(shí)容易混淆,但它們描述的是通信過程中不同層面的速率指標(biāo)。讓我們一起來理清楚它們的區(qū)別和聯(lián)系↓ 主要區(qū)別解析 比特 (Bit Rate): 指每秒傳輸?shù)亩M(jìn)制比特?cái)?shù)量
    的頭像 發(fā)表于 09-10 11:18 ?617次閱讀

    請問如何使用低功耗 UART (LP UART波特率補(bǔ)償?

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

    波特率是什么

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

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

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

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

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

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

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

    靈動微電子MM32MCU的主流型芯片選型

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

    靈動微電子推出全新超值型MM32F0050系列MCU

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

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

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

    CAN總線十萬個為什么 | CAN自定義波特率有什么用?

    導(dǎo)讀CAN總線通信中,波特率一致并不總能保證通信順暢。本文將揭秘自定義波特率的原理和應(yīng)用,探討如何通過優(yōu)化采樣點(diǎn)和提高容忍度解決通信問題,助力工程師提升通信穩(wěn)定性。通常情況下,CAN總線通信只需確保
    的頭像 發(fā)表于 02-07 11:36 ?1208次閱讀
    CAN總線十萬個為什么 | CAN自定義<b class='flag-5'>波特率</b>有什么用?