目錄:
1.MM32F0140簡介
2.初始化MM32F0140 UART1和NVIC中斷
3.編寫MM32F0140 UART1使能中斷髮送函式
4.編寫MM32F0140 UART1中斷接收和中斷髮送函式
5.編寫MM32F0140 UART1處理中斷接收和UART1使能中斷髮送函式
6.MM32F0140 UART1中斷髮送UART1中斷接收到的資料到上位機串列埠助手
提要:
學習MM32F0140 UART1中斷接收和UART1中斷髮送資料,通過上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0140的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1中斷髮送函式,把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_InitStruct; //Enable GPIOA Clock RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1); //PA9:UART1_TX GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); //PA10:UART1_RX GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStruct); }
MM32F0140 UART1和NVIC中斷優先順序初始化,具體配置步驟,及其初始化如下所示:
(1)使能UART1外設時鐘;
(2)呼叫之前配置的UART1 GPIO初始化函式;
(3)調配置UART1通訊波特率為115200;
(4)配置UART1字長為8位;
(5)配置UART1收發資料為1位停止位;
(6)配置UART1收發資料為無奇偶校驗位;
(7)配置UART1允許串列埠收發資料;
(8)根據以上配置引數初始化UART1結構體成員;
(9)使能UART1中斷接收功能;
(10)配置UART1的NVIC中斷優先順序為0,並使能和初始化NVIC中斷(優先順序為0-3均可,引數越小優先順序越高)。
根據以上配置引數,初始化UART1並使能UART1,則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); Bsp_UART1_GPIO_Init(); 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); UART_ITConfig(UART1,UART_IT_RXIEN, 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 Tx Buffer u8 gUART1_Tx_Buf[UART1_TXD_LEN] = {0x00}; //UART1 Tx Lenth u8 gUART1_Tx_Lenth = 0; //UART1 Tx Count u8 gUART1_Tx_Real_Cnt = 0; //UART1 Tx OK Flag u8 gUART1_Tx_OK_Flag = 0;
(2)根據以上步驟(1)中定義,編寫MM32F0140 UART1使能中斷髮送函式,程式碼如下所示:
void Bsp_UART1_Interrupt_Send_Data(UART_TypeDef* Uart, u8 *pBuf,u8 data_lenth) { gUART1_Tx_Real_Cnt = 0; gUART1_Tx_Lenth = data_lenth; memcpy(gUART1_Tx_Buf,pBuf,data_lenth); UART_ITConfig(Uart, UART_IT_TXIEN, ENABLE ); }
4.編寫MM32F0140 UART1中斷接收和中斷髮送函式:
MM32F0140 UART1中斷接收和中斷髮送函式程式碼如下所示,當UART1中斷髮送完資料後需失能中斷髮送,當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(gUART1_Rx_Cnt == 8) { UART1_Rx_Flag = true; } } if(UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET) { UART_ClearITPendingBit(UART1, UART_IT_TXIEN); if(gUART1_Tx_Real_Cnt < gUART1_Tx_Lenth) { UART_SendData(UART1,(u8)gUART1_Tx_Buf[gUART1_Tx_Real_Cnt]); gUART1_Tx_Real_Cnt++; } else { UART_ITConfig(UART1, UART_IT_TXIEN, DISABLE); gUART1_Tx_OK_Flag = 1; } } }
5.編寫MM32F0140 UART1處理中斷接收和UART1使能中斷髮送函式:
MM32F0140 UART1處理中斷接收和使能中斷髮送資料函式如下所示,當上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0140的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1使能中斷髮送函式,原樣傳送UART1中斷接收到的資料到串列埠助手,程式碼如下所示:
void Bsp_UART1_Recv_Task(void) { if(UART1_Rx_Flag == true) { UART1_Rx_Flag = false; if((gUART1_Rx_Buf[0] == 0xAA) && (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] == 0x55)) { Bsp_UART1_Interrupt_Send_Data(UART1,gUART1_Rx_Buf,gUART1_Rx_Cnt); } gUART1_Rx_Cnt = 0; memset(gUART1_Rx_Buf,0,sizeof(gUART1_Rx_Buf)); } }
6.MM32F0140 UART1中斷髮送UART1中斷接收到的資料到上位機串列埠助手:
當上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0140的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1使能中斷髮送函式,採用UART1中斷髮送函式原樣傳送UART1中斷接收到的資料到串列埠助手顯示。
(1)在main函式中呼叫UART1 NVIC初始化函式;
(2)在main函式的while(1)主迴圈中呼叫UART1處理中斷接收到的資料函式,迴圈檢測UART1的接收中斷是否接收到上位機串列埠助手下發的資料,如有收到就呼叫UART1使能中斷髮送函式,原樣傳送UART1中斷接收到的資料到上位機串列埠助手上顯示出來,程式碼如下所示,串列埠助手傳送和接收資料如下圖1所示:
int main(void) { //UART1 NVIC Init Baudrate:115200 Bsp_UART1_NVIC_Init(UART1_BAUDRATE); while(1) { //Test UART1 RX TX Bsp_UART1_Recv_Task(); } }
圖1
總結:
學習MM32F0140 UART1中斷接收和UART1中斷髮送資料,通過上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0140的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1中斷髮送函式,把UART1中斷接收到的資料原樣傳送到串列埠助手顯示出來。資料傳送和接收的資料幀長度使用者可根據實際應用自行編寫應用邏輯。
注意事項:
(1)MM32F0140每個外設都有自己獨立的時鐘,需使能UART1 傳送和接收引腳的GPIO時鐘;
(2)使能UART1外設時鐘;
(3)配置GPIOA的 PA9和PA10複用成UART1功能
(4)使能UART1接收中斷;
(5)使能UART1 NVIC中斷;
(6)使用UART1中斷髮送時,需使能UART1中斷髮送,資料傳送完成需失能UART1中斷髮送,表示一幀資料傳送完成,當UART1需再次中斷髮送資料時使能UART1中斷髮送即可。
(7)UART2和UART3的操作方法與UART1的方法一樣,可參考以上UART1的中斷接收和中斷髮送,把對應的UART1引數改成UART2或UART3,使能相應外設時鐘和中斷即可。