日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32F1笔记(三)UART/USART

發布時間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F1笔记(三)UART/USART 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UART:Universal Asynchronous Receiver/Transmitter(通用異步收/發器)

USART:Universal Synchronous/Asynchronous Receiver/Transmitter(通用同步/異步串行收/發器)

從命名即可看出USART就是UART的基礎上添加了同步功能。通常把UART/USART稱為串口。

串口包含TLL電平和232的串口,485等電氣特性的串口。232、485通常應用于工業。

串口配置的一般步驟可以參考正點原子的總結:

1、串口時鐘使能,GPIO時鐘使能;

2、串口復位;(我不知道這一步的意義,去掉似乎也沒影響,求大神指點)

3、GPIO端口模式的配置;

4、串口參數初始化;

5、初始化NVIC并開啟中斷;

6、使能串口;

7、編寫中斷服務函數。

配置示例:

void Usart3_Init(unsigned int BaudRate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);USART_DeInit(USART3);//USART3_TX GPIOB.10GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);//USART3_RX GPIOB.11GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate = BaudRate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_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;USART_Init(USART3, &USART_InitStructure);USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);USART_Cmd(USART3, ENABLE); }

注意:在此示例中GPIO的速率配置為50M,其實沒必要那么高,可降低至2M。速率越高,噪聲越大,功耗越高。

在配置代碼中,開啟了接收中斷。在日常串口使用中,都會規定通信協議。通信協議的解析,通常在中斷服務函數里進行。

通信協議通常由幀頭,數據,幀尾三部分組成。

幀頭不正確,不繼續處理后續接收到的內容。

幀尾不正確,對數據不進行處理。

示例:

幀頭由兩部分組成,校驗信息和數據長度。示例中斷校驗信息,賦值給unsigned char的變量,相加后為0。這是特殊的幀頭。

unsigned char chr = 0;chr += (0xAA + 0xBB + 0xCC + 0xDD + 0xEE + 0x04);printf("chr=%X\n", chr);

數據長度通常只指數據的長度,不包含幀頭校驗信息和幀尾的長度。

幀尾可以是CRC等校驗方式。可包含長度也可不包含,計算數據的CRC。目的是確保數據的一致性。

串口中斷服務函數示例:

void USART3_IRQHandler(void) { if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET){USART_ClearITPendingBit(USART3, USART_IT_RXNE);g_usart3_recv_data = USART_ReceiveData(USART3);switch(g_usart3_recv_state){case USART3_RECV_FIRST_FRAME_HEAD:if(MKLM_FIRST_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_SECOND_FRAME_HEAD; }else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD; }break;case USART3_RECV_SECOND_FRAME_HEAD:if(MKLM_SECOND_FRAME_HEAD == g_usart3_recv_data){g_usart3_recv_state = USART3_RECV_FIRST_LENGTH;}else{g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD; }break;case USART3_RECV_FIRST_LENGTH:g_Usart3_recv_struct.length = g_usart3_recv_data;g_Usart3_recv_struct.length <<= 8;g_usart3_recv_state = USART3_RECV_SECOND_LENGTH; break;case USART3_RECV_SECOND_LENGTH:g_Usart3_recv_struct.length |= g_usart3_recv_data;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_ADDRESS; break;case USART3_RECV_ADDRESS:g_Usart3_recv_struct.address = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ORDER;break;case USART3_RECV_ORDER:g_Usart3_recv_struct.order = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_ACTION; break;case USART3_RECV_ACTION:g_Usart3_recv_struct.action = g_usart3_recv_data;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_FIRST_CRC;break;case USART3_RECV_FIRST_CRC:g_Usart3_recv_struct.crc16 = g_usart3_recv_data;g_Usart3_recv_struct.crc16 <<= 8;g_usart3_recv_length++;g_usart3_recv_state = USART3_RECV_SECOND_CRC;break;case USART3_RECV_SECOND_CRC:g_Usart3_recv_struct.crc16 |= g_usart3_recv_data;g_usart3_recv_length++;if(g_usart3_recv_length == g_Usart3_recv_struct.length){g_recv_status = RECEIVE_OK;}else {g_recv_status = RECEIVE_LENGTH_ERROR;}g_usart3_recv_flag = USART3_RECV_SECCESS;g_usart3_recv_length = 0;g_usart3_recv_state = USART3_RECV_FIRST_FRAME_HEAD;break;default:break;}} }

STM32使用printf的方法。

在魔術棒里勾選Use MicroLIB(默認是不勾選的)

如果不勾選會出現在BEAB BKPT 0xAB 死循環,如下圖

?

以串口2為例,在串口2相關.c里(可在任何位置,為防混亂放在需要配置給printf的串口文件里)

加入以下代碼(別忘了添加包含頭文件stdio.h)

#include <stdio.h>int fputc(int ch, FILE* stream) {while (!(USART2->SR & USART_FLAG_TXE));USART_SendData(USART2, (uint8_t)ch);return ch; }

就可以調用printf了,調用前別忘了相關串口要初始化。

Uart2_Init(9600); while(1) {printf("Hello World!\r\n");delay_ms(100); }

通過串口助手可以看到現象

總結

以上是生活随笔為你收集整理的STM32F1笔记(三)UART/USART的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。