找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2227|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32串口學(xué)習(xí)_01 -CPU小白

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
一.STM32串口介紹     
   a.串口的數(shù)據(jù)包格式為 起始位+數(shù)據(jù)位+校驗(yàn)位+停止位,所以一般需要設(shè)置數(shù)據(jù)位為8,校驗(yàn)位為1,停止位為1。我們?cè)侔l(fā)送過(guò)程中只發(fā)送數(shù)據(jù),其他的都由硬件來(lái)完成了,所以通信的雙方在數(shù)據(jù)包格式配置相同時(shí)才能正確通信。
   b.除去數(shù)據(jù)包格式設(shè)置一樣外,因?yàn)榇诖蠖鄶?shù)都是用異步通信,由于沒(méi)有時(shí)鐘信號(hào),所以2個(gè)通信設(shè)備需約定好波特率,常見(jiàn)的有4800、9600、115200等,波特率一致時(shí)才能正確通信。
   c.stm32的庫(kù)文件中將這些需要配置的參數(shù)都寫(xiě)在了USART_InitTypeDef 結(jié)構(gòu)體中,我們只要對(duì)其進(jìn)行賦值,再調(diào)用函數(shù)USART_Init(),USART_Init函數(shù)會(huì)將USART_InitTypeDef 結(jié)構(gòu)體中的數(shù)據(jù)寫(xiě)入相應(yīng)的寄存器,這樣就完成了對(duì)32串口的配置。

二.串口初始化(統(tǒng)一初始化)
   a.串口配置時(shí),只有少數(shù)值需要時(shí)常更改,大部分都是重復(fù)內(nèi)容,因此將常用的這些值做為參數(shù)傳入。這樣調(diào)用一個(gè)函數(shù)可以對(duì)所有的串口進(jìn)行賦值。(串口使用的GPIO在后續(xù)的文章中統(tǒng)一配置)借鑒前輩的代碼。
   b.串口初始化流程   開(kāi)外設(shè)時(shí)鐘->配置引腳(統(tǒng)一配置)->配置參數(shù) ->使能中斷 ->使能串口

void User_Usart_Init(USART_TypeDef* USARTx, u32 BaudRate, u16 WordLength, u16 StopBits, u16 Parity)
{
    USART_InitTypeDef USART_InitStructure;
    USART_ClockInitTypeDef USART_ClockInitStructure ;

    if(USARTx == USART1)
    {
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// Enable USART1使能或者失能APB2外設(shè)時(shí)鐘  高速72MHz
    }
    else if(USARTx == USART2)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//  Enable USART2使能或者失能APB1外設(shè)時(shí)鐘    低速36MHz
    }
    else if(USARTx == USART3)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//  Enable USART3使能或者失能APB1外設(shè)時(shí)鐘    低速36MHz
    }
    else if(USARTx == UART4)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);//  Enable USART4使能或者失能APB1外設(shè)時(shí)鐘    低速36MHz
    }
    else if(USARTx == UART5)
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//  Enable USART5使能或者失能APB1外設(shè)時(shí)鐘    低速36MH
    }

    USART_DeInit(USARTx);

    USART_InitStructure.USART_BaudRate = BaudRate;               //波特率
    USART_InitStructure.USART_WordLength = WordLength;        //數(shù)據(jù)長(zhǎng)度
    USART_InitStructure.USART_StopBits = StopBits;                  //一個(gè)停止位
    USART_InitStructure.USART_Parity = Parity;                         //無(wú)校驗(yàn)
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //禁止硬件流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Receive and transmit enabled
    USART_Init(USARTx, &USART_InitStructure);                        // Configure the USART1
   
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;        //USART Clock disabled
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;            //USART CPOL: Clock is active low
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;         //USART CPHA: Data is captured on the second edge
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;     //USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin
    USART_ClockInit(USARTx, &USART_ClockInitStructure);
    USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                  //允許接收寄存器非空中斷
    USART_Cmd(USARTx, ENABLE);                                                // Enable USARTx
}

三.拓展待完成
    a.關(guān)于不同的芯片串口的數(shù)量不同,此時(shí)可以使用#ifdef和#endif來(lái)解決此問(wèn)題。
    b.以下程序只是測(cè)試使用,代碼較亂,串口中斷部分,文章借用了正點(diǎn)原子的串口中斷部分。
    c.會(huì)分三部記錄串口的日常使用,后兩部分為中斷以及讀書(shū)的記錄,會(huì)在第三部分完善代碼并上傳
    d.第一次發(fā)帖記錄學(xué)習(xí),不恰當(dāng)?shù)牡胤揭黄鹩懻搶W(xué)習(xí)。

代碼下載: 測(cè)試.7z (174.09 KB, 下載次數(shù): 5)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:73435 發(fā)表于 2021-7-29 09:35 | 只看該作者
有很多STM32的例程,官方的庫(kù)也提供了串口示例,看一看例程自己在敲幾遍就會(huì)了,串口配置不是一個(gè)init就可以的,還有時(shí)鐘,io,中斷等相關(guān)的都要配置。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表