MM32F0140 UART1空閒中斷接收

Armny發表於2022-03-14

目錄:

1.MM32F0140簡介

2.初始化MM32F0140 UART1空閒中斷和NVIC中斷

3.編寫MM32F0140 UART1中斷接收和空閒中斷函式

4.編寫MM32F0140 UART1傳送位元組和ASCII字元函式

5.編寫MM32F0140 UART1處理空閒中斷接收資料函式

6.MM32F0140 UART1傳送UART1空閒中斷接收到的資料到上位機串列埠助手

提要:

  學習MM32F0140 UART1空閒中斷接收資料,通過上位機串列埠助手傳送8位元組的十六進位制資料:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位機MM32F0140的UART1空閒中斷接收到一幀:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手顯示出來。

內容:

1、MM32F0140簡介

  (1)MM32F0140微控制器是基於Arm® Cortex®-M0核心,最高工作頻率可達72MHz;

  (2)供電電壓支援:2.0V - 5.5V;

  (3)多達64KB的Flash,8KB的SRAM;

  (4)1個I2C;

  (5)3個UART;

  (6)1個12位共13通道的ADC;

  (7)2個I2C或I2S;

  (8)1個16位高階定時,1個16位和1個32位的通用定時器,3個16位的基本定時器;

  (9)1個FlexCAN介面;

  (10)1個IWDG和1個WWDG看門狗。

2.初始化MM32F0140 UART1空閒中斷和NVIC中斷:

  MM32F0140 UART1的GPIO初始化,根據MM32F0140的DS資料手冊選擇PA9:UART1_TX,PA10:UART1_RX為UART1的傳送和接收資料的引腳,具體配置步驟,及其初始化如下所示:

(1)使能GPIOA外設時鐘;

(2)配置IO管腳GPIO_AFx複用為UART1功能;

(3)配置UARTx IO的管腳;

(4)配置GPIO的輸出速度;

(5)配置IO管腳的工作模式;

(6)根據GPIOA配置的引數整體初始化GPIO各管腳的成員引數。

static void Bsp_UART1_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    //Enable GPIOA Clock
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
    //PA9 and PA10 AF UART1 Rx and Tx
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

    //UART1_TX   GPIOA.9
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //UART1_RX    GPIOA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

  MM32F0140 UART1和NVIC中斷優先順序初始化,並使能UART1空閒中斷功能,具體配置步驟,及其初始化如下所示:

(1)使能UART1外設時鐘;

(2)呼叫之前配置的UART1GPIO初始化函式;

(3)調配置UART1通訊波特率為115200;

(4)配置UART1字長為8位;

(5)配置UART1收發資料為1位停止位;

(6)配置UART1收發資料為無奇偶校驗位;

(7)配置UART1允許串列埠收發資料;

(8)根據以上配置引數初始化UART1結構體成員;

(9)使能UART1中斷接收UART1空閒中斷功能;

(10)配置UART1的NVIC中斷優先順序為0,並使能和初始化NVIC中斷(優先順序為0-3均可,引數越小優先順序越高)。

  根據以上配置引數,則UART1初始化程式碼如下所示:

void Bsp_UART1_NVIC_Init(u32 baudrate)
{
    UART_InitTypeDef UART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
    //Enable UART1 Clock
    RCC_APB2PeriphClockCmd(RCC_APB2ENR_UART1,ENABLE);
    //UART1 GPIO Init
    Bsp_UART1_GPIO_Init();
    
    //Baud rate
    UART_StructInit(&UART_InitStruct);
    UART_InitStruct.BaudRate = baudrate;
    //The word length is in 8-bit data format.
    UART_InitStruct.WordLength = UART_WordLength_8b;
    UART_InitStruct.StopBits = UART_StopBits_1;
    //No even check bit.
    UART_InitStruct.Parity = UART_Parity_No;
    //No hardware data flow control.
    UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
    UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx;
    UART_Init(UART1, &UART_InitStruct);
    //Enable RXIEN and RXIDLE
    UART_ITConfig(UART1,UART_IT_RXIEN | UART_IER_RXIDLE, ENABLE);
    
    //UART1 NVIC
    NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    
    UART_Cmd(UART1, ENABLE);
}

3.編寫MM32F0140 UART1中斷接收和空閒中斷函式:

(1)定義UART1空閒中斷接收和傳送資料相關的的快取,變數以及空閒中斷標誌,程式碼如下所示:

//UART1 Recv Buffer
u8 gUART1_Rx_Buf[UART1_RXD_LEN] = {0};
//UART1 Recv Count
u8 gUART1_Rx_Cnt = 0;
//UART1 IDLE Flag
u8 gUART1_IDLE_Flag = 0;

(2)標頭檔案宣告與UART1空閒中斷接收和傳送相關的巨集,快取、變數以及函式宣告等,如下所示:

//UART1 Recv length
#define UART1_RXD_LEN   (255)
//UART1 Baudrate
#define UART1_BAUDRATE  (115200)

//UART1 Recv Buffer
extern u8 gUART1_Rx_Buf[UART1_RXD_LEN];
//UART1 Recv Count
extern u8 gUART1_Rx_Cnt;
//UART1 IDLE Flag
extern u8 gUART1_IDLE_Flag;
    
//UART1 NVIC Init
void Bsp_UART1_NVIC_Init(u32 baudrate);
//Process UART1 Recv Task
void Bsp_UART1_Recv_Task(void);
//UART sends a byte data
void Bsp_UART_Send_Byte(UART_TypeDef* uart,u8 data);
//Send ASCII characters
void Bsp_UART_SendASCII(UART_TypeDef* uart,char* str);
//UART sends multi-byte data
void Bsp_UART_SendBytes(UART_TypeDef* uart,u8* buf, u16 len);

(3)編寫UART1中斷接收資料和空閒中斷函式,如下所示:

void UART1_IRQHandler(void)
{
    u8 Recv;

    if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET) 
    {
        UART_ClearITPendingBit(UART1, UART_IT_RXIEN);

        Recv = UART_ReceiveData(UART1);
        
        gUART1_Rx_Buf[gUART1_Rx_Cnt] = Recv;
        
        if(gUART1_Rx_Cnt < UART1_RXD_LEN-1)
        {
            gUART1_Rx_Cnt++;
        }
        else
        {
            gUART1_Rx_Cnt = 0;        
        }   
    }
    if(UART_GetITStatus(UART1, UART_IER_RXIDLE) != RESET)
    {
        UART_ClearITPendingBit(UART1, UART_IER_RXIDLE);
        gUART1_IDLE_Flag = 1;
    }    
}

4.編寫MM32F0140 UART1傳送位元組和ASCII字元函式:

(1)MM32F0140 UART1傳送位元組函式如下所示:

void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
{
    UART_SendData(uart, data);
    while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT));
}

(2)MM32F0140  UART1傳送多位元組函式如下所示:

void Bsp_UART_SendBytes(UART_TypeDef* uart,u8* buf, u16 len)
{
    while(len--)
    {
       Bsp_UART_SendByte(uart,*buf++);
    }
}

(3)MM32F0140  UART1傳送ASCII字串函式如下所示:

void Bsp_UART_SendASCII(UART_TypeDef* uart,char* str)
{
    while(*str)
    {
        Bsp_UART_SendByte(uart,*str++);
    }
}

5.編寫MM32F0140 UART1處理空閒中斷接收資料函式

  MM32F0140 UART1處理空閒中斷接收到的資料函式如下所示,當上位機串列埠助手傳送8位元組的十六進位制資料:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位機MM32F0140的UART1中斷接收到一幀:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手。

void Bsp_UART1_Recv_Task(void)
{
    //UART1 IDLE Flag
    if(gUART1_IDLE_Flag == 1)
    {
        gUART1_IDLE_Flag = 0;
        
        if((gUART1_Rx_Buf[0] == 0x55) && (gUART1_Rx_Buf[1] == 0x01) && (gUART1_Rx_Buf[2] == 0x02) && (gUART1_Rx_Buf[3] == 0x03) && \
            (gUART1_Rx_Buf[4] == 0x04) && (gUART1_Rx_Buf[5] == 0x05) && (gUART1_Rx_Buf[6] == 0x06) && (gUART1_Rx_Buf[7] == 0x07))
        {
            LED1_TOGGLE();
            Bsp_UART_SendBytes(UART1,gUART1_Rx_Buf,8);
        }
        gUART1_Rx_Cnt = 0;        
        memset(gUART1_Rx_Buf,0,sizeof(gUART1_Rx_Buf));          
    }    
}

6.MM32F0140 UART1傳送UART1空閒中斷接收到的資料到上位機串列埠助手

  當上位機串列埠助手傳送8位元組的十六進位制資料:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位機MM32F0140的UART1空閒中斷接收到一幀:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手。

(1)在main函式中呼叫UART1 NVIC空閒中斷使能初始化函式;

(2)在main函式的while(1)主迴圈中呼叫UART1處理空閒中斷接收到的資料函式,迴圈檢測UART1的空閒中斷接收是否接收到上位機串列埠助手下發的資料,如有收到就原樣傳送到上位機串列埠助手上顯示出來;

int main(void)
{
    //UART1 Init Baudrate:115200
    Bsp_UART1_NVIC_Init(UART1_BAUDRATE);
    
    while(1) 
    {
        //Test UART1 Recv IDLE
        Bsp_UART1_Recv_Task();
    }
}

(3)上位機串列埠助手傳送8位元組16進位制資料:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,下位機MM32F0020 UART1空閒中斷接收到一幀資料後原樣把接收到的資料傳送到上位機上顯示出來,如下圖1所示:

                圖1

總結:

  學習MM32F0140 UART1空閒中斷接收資料,通過上位機串列埠助手傳送8位元組的十六進位制資料:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位機MM32F0140的UART1空閒中斷接收到一幀:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手顯示出來。

注意事項:

  (1)MM32F0140每個外設都有自己獨立的時鐘,需使能UART1 傳送和接收引腳的GPIO時鐘;

  (2)使能UART1外設時鐘;

  (3)配置GPIOA的 PA9和PA10複用成UART1功能

  (4)使能UART1接收中斷和空閒中斷接收;

  (5)使能UART1 NVIC中斷,使能UART1;

  (6)UART2和UART3空閒中斷接收資料的操作方法與UART1的方法一樣,可參考以上UART1把對應的UART1引數改成UART2或UART3,使能相應外設時鐘即可。

 

相關文章