MM32F0020簡介
目錄:
1.MM32F0020簡介
2.初始化MM32F0020 UART1和NVIC中斷
3.編寫MM32F0020 UART1中斷接收函式
4.編寫MM32F0020 UART1傳送位元組和ASCII字元函式
5.編寫MM32F0020 UART1處理中斷接收到的資料函式
6.MM32F0020 UART1傳送UART1中斷接收到的資料到上位機串列埠助手
提要:
學習MM32F0020 UART1中斷接收資料,通過上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0020的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手顯示出來。
內容:
1、MM32F0020簡介:
(1)MM32F0020微控制器是基於 Arm ® Cortex ® -M0核心,最高工作頻率可達48MHz;
(2)供電電壓支援:2.0V - 5.5V;
(3)多達32KB的Flash,2KB的SRAM;
(4)1個I2C;
(5)2個UART;
(6)1個12位的ADC;
(7)1個I2C或I2S;
(8)1個高階定時,1個通用定時器,1個基本定時器。
2.初始化MM32F0020 UART1和NVIC中斷:
MM32F0020 UART1的GPIO初始化,根據MM32F0020的DS資料手冊選擇PA12:UART1_TX,PA3:UART1_RX做為UART1的傳送和接收資料的引腳,具體配置步驟,及其初始化如下所示:
(1)使能GPIOA外設時鐘;
(2)配置IO的管腳;
(3)配置GPIO的輸出速度;
(4)配置IO管腳的工作模式;
(5)根據GPIOA配置的引數整體初始化GPIO各管腳的成員引數。
void Bsp_UART1_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE); //UART initialset GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_1); //UART1_TX GPIOA.12 GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStruct); //UART1_RX GPIOA.3 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStruct); }
MM32F0020 UART1和NVIC中斷優先順序初始化,具體配置步驟,及其初始化如下所示:
(1)使能UART1外設時鐘;
(2)呼叫之前配置的UART1GPIO初始化函式;
(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初始化程式碼如下所示:
void Bsp_UART1_NVIC_Init(u32 baudrate) { UART_InitTypeDef UART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1ENR_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; //UART1 Priority NVIC_InitStruct.NVIC_IRQChannelPriority = 0; //Enable UART1_IRQn NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(& NVIC_InitStruct); UART_Cmd(UART1, ENABLE); }
3.編寫MM32F0020 UART1中斷接收函式:
(1)定義UART1接收和傳送資料相關的的快取,變數如下所示:
//UART1 Recv Bufferu8 gUART1_Rx_Buf[UART1_RXD_LEN]; //UART1 Recv Countu16 gUART1_Rx_Cnt; //UART1 Recv Timing Countu8 gUART1_Rx_TimeCnt = 0;//UART1 Recv Flagbool gUART1_Rx_Flag = false;
(2)標頭檔案宣告與UART1接收和傳送相關的巨集,快取、變數以及函式宣告,如下所示:
//UART1 Baudrate#define UART1_BAUDRATE (115200)//UART1 Recv length#define UART1_RXD_LEN (200) //UART1 Recv Bufferextern u8 gUART1_Rx_Buf[UART1_RXD_LEN]; //UART1 Recv Countextern u16 gUART1_Rx_Cnt; //UART1 Recv Timing Countextern u8 gUART1_Rx_TimeCnt;//UART1 Recv Flagextern bool gUART1_Rx_Flag;//UART1 NVIC Initvoid Bsp_UART1_NVIC_Init(u32 baudrate);//Process UART1 Recv Taskvoid Bsp_UART1_Recv_Task(void);//UART sends a byte datavoid Bsp_UART_SendByte(UART_TypeDef* uart,u8 data);//Send ASCII charactersvoid Bsp_UART_SendASCII(UART_TypeDef* uart,char *str);//UART sends multi-byte datavoid Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len);
(3)編寫UART1中斷接收資料函式,如下所示:
void UART1_IRQHandler(void) { u8 Recv; //Check receive status if(UART_GetITStatus(UART1, UART_IT_RXIEN) == SET) { 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) { gUART1_Rx_Flag = true; } } }
4.編寫MM32F0020 UART1傳送位元組和ASCII字元函式:
(1)MM32F0020 UART1傳送位元組函式如下所示:
void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data) { UART_SendData(uart,data); while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT)); }
(2)MM32F0020 UART1傳送多位元組函式如下所示:
void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len) { while(len--) { Bsp_UART_SendByte(uart,*buf++); } }
(3)MM32F0020 UART1傳送ASCII字串函式如下所示:
void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str) { while(*str) { Bsp_UART_SendByte(uart,*str++); } }
5.編寫MM32F0020 UART1處理中斷接收到的資料函式:
MM32F0020 UART1處理中斷接收到的資料函式如下所示,當上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0020的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手。
Bsp_UART1_Recv_Task( (gUART1_Rx_Flag == = ((gUART1_Rx_Buf[] == ) && (gUART1_Rx_Buf[] == ) && (gUART1_Rx_Buf[] == ) && (gUART1_Rx_Buf[] == ) &&] == ) && (gUART1_Rx_Buf[] == ) && (gUART1_Rx_Buf[] == ) && (gUART1_Rx_Buf[] == = ,
6.MM32F0020 UART1傳送UART1中斷接收到的資料到上位機串列埠助手:
當上位機串列埠助手傳送8位元組的十六進位制資料:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位機MM32F0020的UART1中斷接收到一幀:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8位元組資料後,通過UART1傳送多位元組函式,原樣傳送到串列埠助手。
(1)在main函式中呼叫UART1 NVIC初始化函式;
(2)在main函式的while(1)主迴圈中呼叫UART1處理中斷接收到的資料函式,迴圈檢測UART1的接收中斷是否接收到上位機串列埠助手下發的資料,如有收到就原樣傳送到上位機串列埠助手上顯示出來;
int main(void) { //UART1 NVIC Init Baudrate 115200 Bsp_UART1_NVIC_Init(UART1_BAUDRATE); while(1) { //Process UART1 Recv Task Bsp_UART1_Recv_Task(); } }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12453872/viewspace-2865673/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MM32F0020 GPIO驅動LED燈(MM32F0020 GPIO Toggle)
- 簡介
- Jira使用簡介 HP ALM使用簡介
- BookKeeper 介紹(1)--簡介
- loadsh簡介
- Knative 簡介
- Javascript 簡介JavaScript
- JanusGraph -- 簡介
- Linux簡介Linux
- CSS 簡介CSS
- 反射簡介反射
- CSS簡介CSS
- JUC簡介
- sass簡介
- APIGateway 簡介APIGateway
- Feign簡介
- Django簡介Django
- Virgilio 簡介
- 簡介JSXJS
- LVM : 簡介LVM
- Linux——簡介Linux
- Apache簡介Apache
- JAVA簡介Java
- NATS簡介
- Mybatis簡介MyBatis
- pwa簡介
- SVG簡介SVG
- kafka 簡介Kafka
- AOP簡介
- MySQLInnodbPurge簡介MySql
- Bootstrap 簡介boot
- Fiddler簡介
- HTTP簡介HTTP
- SDL簡介
- JavaParser 簡介Java
- SSHJ 簡介
- Redpanda簡介
- Spring 簡介Spring