一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(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 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式工程師在開發(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);  

    //開啟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;    
    //字長(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 編寫MM32F013x UART1串口中斷服務(wù)函數(shù)

繼續(xù)在bsp_UART.c文件中編寫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文件中編寫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)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    146

    文章

    17984

    瀏覽量

    366938
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1276

    瀏覽量

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

    關(guān)注

    34

    文章

    1640

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    靈動(dòng)微電子超值型MM32G0001自推出以來(lái),累計(jì)出貨超億顆,此次超值型系列突破性升級(jí),隆重推出MM32G0005
    的頭像 發(fā)表于 06-28 09:54 ?717次閱讀
    <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à)比高、易于開發(fā)著稱。
    的頭像 發(fā)表于 05-06 13:32 ?817次閱讀
    <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 ?788次閱讀
    <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

    AN-891: ADuC703x系列LIN波特率計(jì)算

    電子發(fā)燒友網(wǎng)站提供《AN-891: ADuC703x系列LIN波特率計(jì)算.pdf》資料免費(fèi)下載
    發(fā)表于 01-14 15:53 ?0次下載
    AN-891: ADuC703<b class='flag-5'>x</b><b class='flag-5'>系列</b>LIN<b class='flag-5'>波特率</b>計(jì)算

    靈動(dòng)微電子MM32F5370 MCU產(chǎn)品特色

    靈動(dòng)·星”系列靈動(dòng)微電子推出的基于安謀科技(Arm China)國(guó)產(chǎn) Armv8-M 架構(gòu)內(nèi)核(STAR-MC1)的高性能 MCU 產(chǎn)品,專為電機(jī)控制、數(shù)字能源等實(shí)時(shí)控制應(yīng)用打造,
    的頭像 發(fā)表于 01-10 10:02 ?1513次閱讀
    <b class='flag-5'>靈動(dòng)</b><b class='flag-5'>微電子</b><b class='flag-5'>MM32F</b>5370 MCU產(chǎn)品特色

    請(qǐng)問(wèn)MSC1210串口UART1如何設(shè)置波特率

    如題,MSC1210的手冊(cè)上面有提到,UART0的波特率可以進(jìn)行選擇,可選擇為T1的溢出作為波特率的設(shè)置,但是UART1的波特率如何設(shè)置
    發(fā)表于 01-02 08:27

    RS232通信的波特率設(shè)置說(shuō)明

    RS232通信的波特率設(shè)置是確保數(shù)據(jù)正確傳輸?shù)年P(guān)鍵參數(shù)之一。以下是對(duì)RS232通信波特率設(shè)置的說(shuō)明: 一、波特率的概念 波特率是指每秒傳輸?shù)谋忍財(cái)?shù)(bps),是衡量數(shù)據(jù)傳輸速度的重要指
    的頭像 發(fā)表于 12-10 16:26 ?4370次閱讀

    波特率設(shè)置中的常見問(wèn)題解析

    在數(shù)字通信系統(tǒng)中,波特率是一個(gè)關(guān)鍵參數(shù),它直接影響數(shù)據(jù)傳輸?shù)男屎涂煽啃浴H欢?,在?shí)際應(yīng)用中,波特率的設(shè)置往往會(huì)引起一些常見的問(wèn)題。 一、波特率與數(shù)據(jù)速率的混淆 問(wèn)題描述: 許多人會(huì)將波特率
    的頭像 發(fā)表于 11-22 10:06 ?1717次閱讀

    波特率與串行通信的關(guān)系 各種設(shè)備波特率轉(zhuǎn)換的方法

    波特率(Baud Rate)是串行通信中的一個(gè)重要參數(shù),它指的是信號(hào)傳輸?shù)乃俾?,即單位時(shí)間內(nèi)傳輸?shù)姆?hào)(或信號(hào)狀態(tài))的數(shù)量。在串行通信中,波特率決定了數(shù)據(jù)傳輸?shù)乃俣龋虼藢?duì)于通信效率和設(shè)備兼容性
    的頭像 發(fā)表于 11-22 10:01 ?1660次閱讀

    常見的波特率標(biāo)準(zhǔn)和協(xié)議

    波特率是指在數(shù)據(jù)通信中,每秒鐘傳輸?shù)姆?hào)數(shù)(或比特?cái)?shù)),是衡量數(shù)據(jù)通信速度的重要指標(biāo)。在不同的通信協(xié)議和場(chǎng)景中,常見的波特率標(biāo)準(zhǔn)和協(xié)議有所不同。以下是一些常見的波特率標(biāo)準(zhǔn)和協(xié)議: 一、串口通信
    的頭像 發(fā)表于 11-22 09:56 ?6183次閱讀

    Wi-Fi與藍(lán)牙的波特率對(duì)比分析

    技術(shù))是一種允許電子設(shè)備連接到一個(gè)無(wú)線局域網(wǎng)(WLAN)的技術(shù)。 其數(shù)據(jù)傳輸速率遠(yuǎn)高于藍(lán)牙,適用于需要高速數(shù)據(jù)傳輸?shù)膱?chǎng)景。 發(fā)展歷程與波特率提升 : 隨著技術(shù)的發(fā)展,Wi-Fi的波特率不斷提升。 例如,從最初的IEEE 802.
    的頭像 發(fā)表于 11-22 09:54 ?1840次閱讀

    波特率的定義和計(jì)算方法 波特率與數(shù)據(jù)傳輸速度的關(guān)系

    波特率的定義 波特率(Baud Rate),又稱調(diào)制速率或傳符號(hào),是指每秒傳輸?shù)姆?hào)數(shù)目,單位為波特(Bd)。它是一個(gè)數(shù)字信號(hào)通信中重要的參數(shù),在串行通信協(xié)議中經(jīng)常被用作衡量串行數(shù)據(jù)
    的頭像 發(fā)表于 11-22 09:49 ?9179次閱讀

    波特率9600和115200的區(qū)別

    在現(xiàn)代通信技術(shù)中,數(shù)據(jù)傳輸速率是一個(gè)關(guān)鍵的性能指標(biāo)。對(duì)于串行通信,波特率是衡量數(shù)據(jù)傳輸速度的基本單位。波特率9600和115200是兩種常見的設(shè)置,它們?cè)诓煌膽?yīng)用場(chǎng)景中有著各自的優(yōu)勢(shì)和局
    的頭像 發(fā)表于 10-18 14:56 ?5568次閱讀

    波特率與比特有何關(guān)系 波特率與數(shù)據(jù)傳輸速率的關(guān)系

    波特率(Baud Rate)和比特(Bit Rate)是衡量數(shù)據(jù)通信系統(tǒng)性能的兩個(gè)重要參數(shù),它們之間有著密切的關(guān)系,但并不完全相同。 波特率(Baud Rate): 波特率是指在數(shù)據(jù)
    的頭像 發(fā)表于 10-18 14:55 ?2555次閱讀

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    頻率是兩個(gè)關(guān)鍵參數(shù),它們之間存在一定的關(guān)系,并且UART串口有一系列常用的波特率。以下是對(duì)這兩個(gè)概念的介紹。 一、UART波特率和傳輸頻率的
    的頭像 發(fā)表于 10-06 16:12 ?7012次閱讀
    <b class='flag-5'>uart</b><b class='flag-5'>波特率</b>和傳輸頻率的關(guān)系 <b class='flag-5'>UART</b>串口的常用<b class='flag-5'>波特率</b>為多少