找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2701|回復(fù): 3
收起左側(cè)

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

[復(fù)制鏈接]
ID:689247 發(fā)表于 2021-8-12 14:15 | 顯示全部樓層 |閱讀模式
本帖最后由 cpu小白白 于 2021-8-12 14:33 編輯

一.串口結(jié)構(gòu)體    a.使能串口中斷后,串口在接收到數(shù)據(jù)后會(huì)進(jìn)入中斷函數(shù),中斷函數(shù)就是我們要對數(shù)據(jù)進(jìn)行整理的地方。(中斷函數(shù)中不能寫大量代碼,有可能導(dǎo)致,下次中斷來之前,數(shù)據(jù)還未處理完成,所以數(shù)據(jù)分析在后文)。
    b.stm32的串口數(shù)量很多,因此將每個(gè)串口在運(yùn)行中所需要的變量整合寫進(jìn)一個(gè)結(jié)構(gòu)體中,相對更加方面快捷。按照本人經(jīng)常使用的數(shù)據(jù),寫出的結(jié)構(gòu)體如下:

#define SBUF_SIZE 255                 //數(shù)據(jù)緩沖區(qū)大小
#define RBUF_SIZE 255

typedef struct
{
    u8 sbuf[SBUF_SIZE];                   //發(fā)送數(shù)組
    u8 rbuf[RBUF_SIZE];                   //接收數(shù)組
    u8 temporary_buf[RBUF_SIZE];  //接收臨時(shí)存儲(chǔ)buf
    u16 sbuf_head;                            //需要發(fā)送數(shù)據(jù)的位置
    u16 sbuf_tail;                            //需要發(fā)送數(shù)據(jù)的結(jié)束位置
    u16 rbuf_head;                            //需要發(fā)送數(shù)據(jù)的位置
    u16 rbuf_tail;                            //需要發(fā)送數(shù)據(jù)的結(jié)束位置
    u8 com_already;                           //接收到數(shù)據(jù)
    u32 com_timeout;                          //接收到數(shù)據(jù)到處理數(shù)據(jù)間延時(shí)
    uint32_t rc;                              //計(jì)數(shù)
}UART_InformationType;

extern UART_InformationType  UART1_Information;  //創(chuàng)建串口1的結(jié)構(gòu)體
extern UART_InformationType  UART2_Information;
extern UART_InformationType  UART3_Information;



二.串口中斷
    a.串口中斷來對接受的數(shù)據(jù)進(jìn)行整理,如果串口處理數(shù)據(jù)的方法相差不是太大,都可以使用此中斷函數(shù)來整理接收的數(shù)據(jù)。
    b.串口數(shù)據(jù)整理的思想,以數(shù)據(jù)接受為例:
        1.開辟兩個(gè)256字節(jié)的數(shù)組,用來存放接受或者發(fā)送的數(shù)據(jù)。
        2.給256個(gè)字節(jié)設(shè)數(shù)據(jù)頭尾,每當(dāng)進(jìn)入一次中斷,有一個(gè)數(shù)據(jù)傳入就把數(shù)據(jù)寫到結(jié)構(gòu)體中,同把數(shù)據(jù)頭+1,當(dāng)數(shù)據(jù)頭超過數(shù)據(jù)緩沖區(qū)大小時(shí)清零。
        3.有數(shù)據(jù)傳入就把標(biāo)志位 com_already 置1,處理完數(shù)據(jù)后清0。
        4.數(shù)據(jù)頭尾的作用:剛上電時(shí)都為0,傳入8個(gè)字節(jié)正確的數(shù)據(jù),先將8個(gè)字節(jié)的數(shù)據(jù)保存在結(jié)構(gòu)體中,同時(shí)每傳入一個(gè)字節(jié)數(shù)據(jù)頭加1。置1標(biāo)志位等待數(shù)據(jù)處理函數(shù)。 數(shù)據(jù)處理函數(shù)處理完成數(shù)據(jù)后將數(shù)據(jù)尾加8等于數(shù)據(jù)頭。(此時(shí)假設(shè)數(shù)據(jù)都是正確的情況)
    c.中斷函數(shù)中只寫了數(shù)據(jù)的接受,對于stm32來說,數(shù)據(jù)發(fā)送直接封裝為函數(shù)更加簡單方便。
/********************************************************************
*函數(shù)描述:usart1中斷
*入口說明:無
*返回說明:無
**********************************************************************/
void USART1_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART1,&UART1_Information);
}

/*********************************************************************
*函數(shù)描述:usart1中斷
*入口說明:無
*返回說明:無
**********************************************************************/
void USART2_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART2,&UART2_Information);
}

/*********************************************************************
*函數(shù)描述:usart1中斷
*入口說明:無
*返回說明:無
**********************************************************************/
void USART3_IRQHandler(void)
{
    Dispose_USART_IRQHandler(USART3,&UART3_Information);
}

/*********************************************************************
*函數(shù)描述:usart中斷,處理接受的數(shù)據(jù)
*入口說明:USART_TypeDef* USARTx   UART_InformationType* USARTx_Information
                        中斷的串口                         對應(yīng)串口的結(jié)構(gòu)體
*返回說明:無
**********************************************************************/
void Dispose_USART_IRQHandler(USART_TypeDef* USARTx,UART_InformationType* USARTx_Information)
{
    if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)   //接收數(shù)據(jù)
    {
        USARTx_Information->rbuf[USARTx_Information->rbuf_head++] = (u8)USARTx->DR;
        if(USARTx_Information->rbuf_head == SBUF_SIZE)
        {
            USARTx_Information->rbuf_head = 0;
        }
        USARTx_Information->com_already = USART_SBUF_NO_EMPTY;
       // USARTx_Information->com_timeout = Timer_1ms;          //更新空閑計(jì)時(shí)
    }
}

/*********************************************************************
*函數(shù)描述:usart發(fā)送數(shù)據(jù)
*入口說明:USARTx:選擇USART通道      
                data:發(fā)送的數(shù)據(jù)
                data_long:數(shù)據(jù)長度
*返回說明:無
**********************************************************************/
void Send_Usart_data(USART_TypeDef* USARTx,u8* data,u16 data_long)
{
    u16 a;
    for(a = 0;a < data_long;a++)
    {
           USART_SendData(USARTx,*data);                      //發(fā)送一位數(shù)據(jù)
           data++;                                                         //指向下一個(gè)發(fā)送的數(shù)據(jù)
           USART_ITConfig(USARTx, USART_IT_TC, ENABLE);
    }

}


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:584195 發(fā)表于 2021-8-14 09:21 | 顯示全部樓層
寫得非常好,樓主歷害呀!
回復(fù)

使用道具 舉報(bào)

ID:689247 發(fā)表于 2021-8-17 08:33 | 顯示全部樓層
還有最后一個(gè)章節(jié),這幾天有空總結(jié)完會(huì)把所有代碼整合到一起。
回復(fù)

使用道具 舉報(bào)

ID:584195 發(fā)表于 2021-8-19 15:57 | 顯示全部樓層
能不能把DMA也寫得通俗易懂一些的文章!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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