一、概述 1、UART簡介 UART:通用同步/異步串行接收/發(fā)送器,由時鐘發(fā)生器、數(shù)據(jù)發(fā)送器和接收器三大部分組成。UART是一個全雙工通用同步/異步串行收發(fā)模塊,該接口是一個高度靈活的串行通信設(shè)備。STM32F407IGT6具有6個UART收發(fā)器,可使用相應(yīng)的代碼使能后使用。 2、UART特點(diǎn) - 全雙工操作(相互獨(dú)立的接收數(shù)據(jù)和發(fā)送數(shù)據(jù))。
- 同步操作時,可主機(jī)時鐘同步,也可從機(jī)時鐘同步。
- 支持8和9位數(shù)據(jù)位,1或2位停止位的串行數(shù)據(jù)楨結(jié)構(gòu)。
- 由硬件支持的奇偶校驗位發(fā)生和檢驗。
- 數(shù)據(jù)溢出檢測。
- 幀錯誤檢測。
- 包括錯誤起始位的檢測噪聲濾波器和數(shù)字低通濾波器。
- 三個完全獨(dú)立的中斷,TX發(fā)送完成、TX發(fā)送數(shù)據(jù)寄存器空、RX接收完成。
- 支持多機(jī)通信模式。
- 支持倍速異步通信模式。
3、UART時序 圖4_0 UART時序 空閑位:高電平。 啟動位:一個低電平。 字符數(shù)據(jù):可以選擇8和9位數(shù)據(jù)位。 奇偶校驗位:根據(jù)需要選擇是否進(jìn)行校驗。 停止位:一個高電平。 4、TTL、RS232、RS485、RS422通信 TTL、RS232、RS485都是指電平信號,USART可使用相應(yīng)的電平轉(zhuǎn)換芯片,實現(xiàn)這三種通信。 - TTL:電平信號數(shù)據(jù)表示采用二進(jìn)制規(guī)定,+5V等價于邏輯“1”,0V等價于邏輯“0”。通訊方式為全雙工通信。
- RS232:232中任何一條信號線的電壓均為負(fù)邏輯關(guān)系。即:邏輯“1”為-3到-15V;邏輯“0”為+3到+15V。通訊方式為全雙工,通訊距離15m,RS-232的數(shù)據(jù)最高傳輸速率為20Kbps。
- RS485:RS485采用差分信號負(fù)邏輯,邏輯"1”以兩線間的電壓差為-(2~6)V表示;邏輯"0"以兩線間的電壓差為+(2~6)V表示。通訊方式為半雙工,通訊距離1200m,RS-485的數(shù)據(jù)最高傳輸速率為10Mbps。
- RS422:RS422采用兩對差分線傳輸數(shù)據(jù),電平與RS485相同。通訊方式為全雙工,通訊距離1200m,RS-422的數(shù)據(jù)最高傳輸速率為10Mbps。
二、硬件電路
圖4_1UART引腳圖 本試驗使用的芯片STM32F407IGT6,使用UART為UART_4,引腳位PA0和PA1,經(jīng)過串口轉(zhuǎn)USB芯片CH340轉(zhuǎn)換后,可通過USB接口與計算機(jī)通訊。 三、 實驗原理 計算機(jī)安裝 CH340 驅(qū)動后,可通過串口工具來接收串口發(fā)送的數(shù)據(jù)和向串口發(fā)送給數(shù)據(jù)。用串口工具打開iCore3對應(yīng)的端口,波特率設(shè)為115200,發(fā)送相應(yīng)的命令,便可以控制ARM LED的亮滅情況。串口命令如下表: 表4_1: 串口控制命令 四、源代碼 1.USART初始化結(jié)構(gòu)體介紹 - typedefstruct
- {
- uint32_tUSART_BaudRate;
- uint16_tUSART_WordLength;
- uint16_tUSART_StopBits;
- uint16_tUSART_Parity;
- uint16_tUSART_Mode;
- uint16_tUSART_HardwareFlowControl;
- } USART_InitTypeDef;
復(fù)制代碼2.主函數(shù) - /*
- * Name : main
- * Description : ---
- * Author : ysloveivy.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * --------------------
- */
- int main(void)
- {
- inti;
- char buffer[20];
- led.initialize();
- usart4.initialize(9600);
- usart4.printf("hello! I am iCore3!\r\n"); //串口4輸出
- while(1){
- if(usart4.receive_ok_flag){ //接收完成
- usart4.receive_ok_flag = 0;
- for(i = 0;i <20;i++){
- buffer[i] = tolower(usart4.receive_buffer[i]);
- }
- //比較接收信息
- if(memcmp(buffer,"led_red_on",strlen("led_red_on")) == 0){
- LED_RED_ON;
- usart4.printf("ok!\r\n");
- }
- if(memcmp(buffer,"led_red_off",strlen("led_red_off")) == 0){
- LED_RED_OFF;
- usart4.printf("ok!\r\n");
- }
- if(memcmp(buffer,"led_green_on",strlen("led_green_on")) == 0){
- LED_GREEN_ON;
- usart4.printf("ok!\r\n");
- }
- if(memcmp(buffer,"led_green_off",strlen("led_green_off")) == 0){
- LED_GREEN_OFF;
- usart4.printf("ok!\r\n");
- }
- if(memcmp(buffer,"led_blue_on",strlen("led_blue_on")) == 0){
- LED_BLUE_ON;
- usart4.printf("ok!\r\n");
- }
- if(memcmp(buffer,"led_blue_off",strlen("led_blue_off")) == 0){
- LED_BLUE_OFF;
- usart4.printf("ok!\r\n");
- }
- }
- }
- }
復(fù)制代碼3.USART初始化及相關(guān)配置 - /*
- * Name : initialize_usart4
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- staticint initialize_usart4(unsignedlongintbaudrate)
- {
- GPIO_InitTypeDefGPIO_InitStructure;
- USART_InitTypeDefUSART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); // GPIO時鐘使能
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0為復(fù)用推挽輸出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1為浮空輸入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_UART4); //PA0引腳復(fù)用為UART4
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_UART4); //PA1引腳復(fù)用為UART4
- USART_DeInit(UART4);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); //UART4時鐘使能
- USART_InitStructure.USART_BaudRate = baudrate; //波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8個數(shù)據(jù)位
- USART_InitStructure.USART_StopBits = USART_StopBits_1; //1個停止位
- USART_InitStructure.USART_Parity = USART_Parity_No ; //無奇偶校驗位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
- USART_Init(UART4, &USART_InitStructure); //初始化UART4
- USART_Cmd(UART4, ENABLE); //使能UART4
- USART_ITConfig(UART4,USART_IT_PE,ENABLE);
- USART_ITConfig(UART4,USART_IT_RXNE,ENABLE); //打開UART4的中斷
- NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- return0;
- }
- /*
- * Name : send_buffer4
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- staticint
- send_buffer4(void * buf,intlen)
- {
- char *p = (char *)buf;
- if(len<= 0)return -1;
- while(len --){
- send_byte_to_usart4(*p);
- p ++;
- }
- return0;
- }
- /*
- * Name : send_byte_to_usart4
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- staticint
- send_byte_to_usart4(char data) //TTL通信
- {
- while(!(USART_GetFlagStatus(UART4,USART_FLAG_TC) == 1)); //等待發(fā)送數(shù)據(jù)完成
- USART_SendData(UART4,data); //將數(shù)據(jù)寫入數(shù)據(jù)寄存器中
- return0;
- }
- /*
- * Name : send_string_to_usart4
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- staticint
- send_string_to_usart4(char * str)
- {
- while(*str!='\0'){
- while(!(USART_GetFlagStatus(UART4,USART_FLAG_TC) == 1));
- USART_SendData(UART4,*str++);
- }
- return0;
- }
- /*
- * Name : UART4_IRQHandler
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- int
- UART4_IRQHandler(void)
- {
- while(USART_GetFlagStatus(UART4,USART_FLAG_RXNE) == 0);
- usart4.receive_buffer[usart4.counter++]=USART_ReceiveData(UART4); //接收數(shù)據(jù)
- if(usart4.receive_buffer[usart4.counter - 1] == '\n'&& usart4.receive_buffer[usart4.counter - 2] == '\r'){
- usart4.receive_buffer[usart4.counter-1]=0;
- usart4.counter=0;
- usart4.receive_ok_flag=1;
- return0;
- }
- /*
- * Name : printf
- * Description : ---
- * Author : XiaomaGee
- *
- * History
- * -------------------
- * Rev : 0.00
- * Date : 11/21/2015
- *
- * create.
- * -------------------
- */
- staticint
- my_printf4(constchar * fmt,...) //串口4輸出
- {
- __va_listarg_ptr;
- charbuf[UART_BUFFER_SIZE];
- memset(buf,'\0',sizeof(buf));
- va_start(arg_ptr,fmt);
- vsprintf(buf,fmt,arg_ptr);
- va_end(arg_ptr);
- send_string_to_usart4(buf);
- return0;
復(fù)制代碼五、 實驗現(xiàn)象 通過串口調(diào)試工具輸入相應(yīng)的命令,可以看到iCore3執(zhí)行相應(yīng)的明命令,LED按控制命令亮滅。 |