前言
? ? ? ? 在此之前,我們已經(jīng)學習了單片機串口通信的原理(江科協(xié)),再寫一遍我個人認知:世界上任何兩個事物如果要進行交流的話,那必然需要兩個東西進行通信的,就像兩個人之間,兩個國人之間用普通話就能夠清楚的交流,但是讓我們中國人和外國人去交流可能會有點費力了,假設一個英國人在那,你要是想和他聊天,那必然是你學英語或者他學漢語才行,這里的你們之間交流用的語言就是單片機中的? 通信協(xié)議? ?。假設漢語是串口通信,英語是I2C通信,那這兩個是不兼容的,所以必須要統(tǒng)一語言,統(tǒng)一協(xié)議才行。所以是說,不同的芯片所用的通信協(xié)議是不一樣的,我們要根據(jù)需要有針對性的選擇學習。
Cubemax配置
? ? ? ? 在B站視頻中我們可以看到老師寫的代碼,看著操作挺多的,如果讓自己寫的話那肯定是大部分人都挺費勁的。但是?。。。∪绻覀冇肅ubemax配置(偷懶神技)的話那就會很輕松了,同樣只需要選擇自己所需要的參數(shù)就能夠完成目的。話不多說,直接看步驟:
注意,在配置的時候,RCC(Reset and Clock Control,即復位和時鐘控制)要配置為外部晶振
?
這里的SYS配置選Serial Wire
然后選擇串口為asynchronous(異步通信),然后下面就會生成波特率,數(shù)據(jù)寬度,停止位,校驗位等,這里一般用默認的就好,因為剛開始學習時接觸的大多數(shù)都是這個配置。
?然后可以根據(jù)自己的需要把中斷或者DMA模式打開。
配置好后別忘了配置時鐘樹,一般只用選擇完紅圈里的東西后點回車就行了。
usart_x264
keil端
生成代碼之后呢,我們就需要知道哪些是我們所需要的代碼了,接下來,我們在keil中打開stm32f1xx_hal_uart.c文件:
? ? ? ? ?在這個文件里我們能看到很多代碼,很多注釋,亂七八糟的,但是我們只需要看我們所需要的就行了,在此之前,你需要積累一些常用的函數(shù)。怎么在左下角可以看到有個Functions,我們點開然后再點串口的文件,可以看到這個文件里所有的函數(shù)都呈現(xiàn)出來了:
其中有幾個最為常用的函數(shù)需要大家熟記(具體函數(shù)的用法以及原理規(guī)則就不跟大家介紹了,網(wǎng)上一查很多):
?舉例
? ? ? ? 給大家舉幾個簡單的例子說明一下:
串口發(fā)送
HAL_UART_Transmit(&huart1,"hello,world",11,HAL_MAX_DELAY);
HAL_UART_Transmit_IT(&huart1,"hello,world",11);
HAL_UART_Transmit_DMA(&huart1,"hello,world",11);
????????這是3種不同的方式發(fā)送數(shù)據(jù) hello,world, 第一種是輪詢模式就是單片機按個去發(fā)送數(shù)據(jù),大家排好隊一個一個來,這種發(fā)送方式比較穩(wěn)定,建議以后大家非必要就用這個發(fā)。
? ? ? ? 第二個是用中斷發(fā)送發(fā)送數(shù)據(jù),這句程序的工作過程是,還是排好隊一個一個發(fā),但是當單片機發(fā)送11個數(shù)據(jù)之后,單片機需要進一次中斷,中斷回調(diào)函數(shù)為:HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart),但是由于是中斷模式,需要進行中斷處理,倘若單片機在進行中斷處理時又一次進入中斷的話,單片機就會出現(xiàn)錯誤,因此中斷發(fā)送不能兩個中斷發(fā)送函數(shù)連著使用,但是需要間隔多長時間呢?有點小復雜,我還沒探究過> <。DMA模式好像也有類似問題,因此前期學系的話只用輪詢就夠了。
串口接收
uint8_t ReBuf[8];
HAL_UART_Receive(&huart1,ReBuf,8,HAL_MAX_DELAY);
HAL_UART_Receive_IT(&huart1,ReBuf,8);
? ? ? ? ?在進行串口接收前,單片機需要知道接收到的數(shù)據(jù)放在哪里,因此就需要接收緩存區(qū):ReBuf。程序種輪詢接收意思是接收依次接收8個數(shù)據(jù)存放在ReBuf中,中斷接收呢是依次接收8個數(shù)據(jù)后進入接收中斷里,串口接收中斷的回調(diào)函數(shù)為:
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
我們可以根據(jù)需要在中斷回調(diào)函數(shù)里進行所需要的操作?;蛘呤窃谥鞒绦蛑胁僮饕彩强梢缘?,可以根據(jù)自己程序的不同邏輯酌情選擇。文章來源:http://www.zghlxwxcb.cn/news/detail-846442.html
? ? ? ? 另外附上我在stm32與openmv進行串口收發(fā)的相關代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-846442.html
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint16_t tempt /*定義臨時變量存放接受的數(shù)據(jù)*/;
if(huart->Instance==USART2)
{
tempt=ReBuff[0];
Openmv_Receive_Data(tempt);
/*調(diào)運數(shù)據(jù)接收處理函數(shù),每次進入中斷都對數(shù)據(jù)進行理處
,由于需要接收器個數(shù)據(jù),因此要進入七次斷理*/
}
HAL_UART_Receive_IT(&huart2,(uint8_t*)&ReBuff,1);/*再次開啟接收中斷*/
}
到了這里,關于STM32--HAl庫串口接收與發(fā)送的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!