嵌入式系统开发10——STM32串口通信
本文主要介紹利用stm32CubeMX+Keil,在STM32F103C8T6上,嘗試使用寄存器地址方式和HAL庫這兩種方式,實現及串口通信,還涉及到Keil5編譯器V5的安裝。由于篇幅太長,本篇文章主要介紹實踐操作,理論知識寫在我之前的一篇帖子 嵌入式系統開發09——串口通信 里。
目錄
- 一、任務要求
- 二、環境搭建
- 1、硬件環境
- 2、軟件環境
- 三、寄存器方式實現串口通信
- 1、創建工程
- 2、代碼編寫
- 3、V5編譯器安裝
- 4、編譯
- 5、燒錄
- 6、實現效果
- 四、HAL庫方式實現串口通信
- 1、創建工程
- 2、代碼編寫
- 3、編譯
- 4、燒錄
- 5、實現效果
- 五、仿真邏輯分析儀的使用
- 六、總結
一、任務要求
安裝 stm32CubeMX,配合Keil,分別嘗試使用寄存器地址方式(匯編或C,不限) 和HAL庫這兩種方式,完成下列任務:
1、完成一個STM32的USART串口通訊程序(查詢方式即可,暫不要求采用中斷方式),要求:
1)設置波特率為115200,1位停止位,無校驗位;
2)STM32系統給上位機(win10)連續發送“hello windows!”。win10采用“串口助手”工具接收。
2、在沒有示波器條件下,可以使用Keil的軟件 仿真邏輯分析儀 功能觀察管腳的時序波形,更方便動態跟蹤調試和定位代碼故障點。 請用此功能觀察第1題中串口輸出波形,并分析時序狀態正確與否,高低電平轉換周期實際為多少。
二、環境搭建
1、硬件環境
-
STM32F103C8T6核心板
-
USB轉TTL
-
面包板一塊
-
杜邦線(公對公、母對母)若干
-
連接方法:
| GND | G |
| 3V3 | 3V3 |
| RXD | PA9 |
| TXD | PA10 |
注意將核心板上的BOOT0設置為1,BOOT1設置為0
2、軟件環境
-
MDK5、stm32CubeMX、虛擬邏輯分析儀的安裝與使用可以參考本人的另外兩篇帖子。
1、嵌入式系統開發05——MDK5的安裝、匯編語言編程入門實踐以及Hex文件的分析
2、嵌入式系統開發08——stm32CubeMX+HAL庫實現流水燈以及虛擬邏輯分析儀的使用 -
CH340驅動(USB串口驅動)
安裝好之后,將 USB轉TTL 和 STM32F103C8T6 連接到電腦上后可以看到端口處連接有一個 USB-SERIAL CH340
-
FlyMcu 燒錄助手
-
串口通信助手(SSCOM)
三、寄存器方式實現串口通信
1、創建工程
-
可以按照我之前的帖子來創建工程:
嵌入式系統開發05——MDK5的安裝、匯編語言編程入門實踐以及Hex文件的分析 -
可以直接利用下面的工程模板來建立(建議使用這種方法)
鏈接:https://pan.baidu.com/s/1TN_MMYkEdkv1R7TAUwIJEw?pwd=plt3
提取碼:plt3 -
建立模板之后點擊魔術棒,點擊 Device,將芯片選擇為 STM32F103C8
-
點擊 C/C++,將 Define 里面的 STM32F10X_HD 改為 STM32F10X_MD
2、代碼編寫
- (1)在 SYSTEM 組下雙擊 usart.c,其中的 uart_init 函數,代碼如下
先計算得到 USART1->BRR 的內容。然后開始初始化串口引腳,然后設置波特率和奇偶校驗等。
這里需要注意一點,因為我們使用到了串口的中斷接收,必須在 usart.h 里面設置 EN_USART1_RX 為 1(默認設置就是 1 的)。該函數才會配置中斷使能,以及開啟串口 1 的 NVIC 中斷。這里我們把串口 1 中斷放在組 2,優先級設置為組 2 里面的最低。
- (2)在 test.c 中編寫如下代碼
其中 while((USART1->SR&0X40)==0),表示就是我們在寫了一個字節在 USART1->DR 之后,要檢測這個數據是否已經被發送完成了,通過檢測 USART1->SR 的第 6 位,是否為 1 來決定是否可以開始第二個字節的發送。
3、V5編譯器安裝
這里點擊編譯,我最開始編譯時,會報很多錯
這里是以為編譯器選擇錯誤,V6編譯器無法兼容部分代碼
此時應該選擇V5編譯器,但是當選擇 Missing:Compiler Version 5 進行編譯時,提示:
這里是因為 KEIl5 新版本,官方不再默認安裝V5編譯器,需要自己安裝V5編譯器。安裝方法如下:
(1)下載文件
鏈接:https://pan.baidu.com/s/1hDvFC3oyAPte5H6A9R5CFg?pwd=2022
提取碼:2022
(2)解壓到 Keil5 的 ARM 文件夾下(這里需要找到自己的 Keil5 的安裝路徑,我這里顯示的是解壓后的文件夾內容)
(3)解壓完成后,以管理員身份運行Keil5,點擊打開 File Extensions, Books and Environment…
(4)選擇 Folders/Extensions,點擊 …
(5)選擇 Add another ARM Compiler Version to List…
(6)選擇 ARMCC 的安裝路徑,點擊確定
(7)如下圖,我們可以看到,ARMCC 已經添加成功了,點擊 Close ->OK
(8)最后回到 Keil5 主界面,打開 Option for target,到這一步,我們就可以選擇使用compiler version 5了
4、編譯
點擊魔術棒,在 Output 下勾選 Create HEX File
在 Debug 下勾選 Use Simulator,將 Dialog DLL:改為DARMSTM.DLL;Parameter:改為 -pSTM32F103C8
否則調試的時候使用虛擬邏輯分析儀觀察輸出波形時,會提示錯誤
在 Target 下,將 ARM Compiler:改為 Use default compiler version 5
點擊編譯,發現編譯成功
5、燒錄
按照硬件環境部分將硬件連接到電腦串口上,打開 FlyMcu燒錄軟件
找到生成的 hex 文件,點擊打開
搜索串口
設置波特率為115200bps
點擊開始編程,進行燒錄
6、實現效果
打開串口調試助手 SSCOM,打開串口設置
配置串口設置
點擊打開串口
觀察結果
用 Keil5 的虛擬邏輯分析儀觀察輸出波形
四、HAL庫方式實現串口通信
1、創建工程
-
打開STM32CubeMX,點擊 ACCESS TO MCU SELECTOR
-
選擇 STM32F103C8
-
設置RCC,設置高速外部時鐘HSE,選擇外部時鐘源
-
點擊 Connectivity,選擇 USART1 ,Mode 設置為 Asynchronous(異步通信)
-
波特率為115200,1位停止位,無校驗位(這里不需要改,默認就是這樣)
-
NVIC Settings 一欄使能接收中斷,勾選Enabled
-
時鐘設置,將HCLK設置為 72MHz
-
項目設置,設置項目的名稱、位置、環境
-
生成項目
2、代碼編寫
(1)打開工程,點擊 Open Project,找到 main.c
(2)在 main.c 中用一個數組存儲 STM32 需要給上位機發送的消息
uint8_t data[]="hello windows!\n";(3)在while循環中調用查詢,并調用延時函數
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);HAL_Delay(100); //延時100ms3、編譯
點擊魔術棒,在 Output下勾選 Create HEX File
在 Target 下將編譯器版本改為 V6.18
在Debug里面選擇 Use Simulator,將 Dailog DLL設置為DARMSTM.DLL,Parameter設置為-pSTM32F103C8;
點擊OK,點擊編譯
4、燒錄
按照硬件環境部分將硬件連接到電腦串口上,打開 FlyMcu燒錄軟件
找到生成的 hex 文件,點擊打開
搜索串口
設置波特率為115200bps
點擊開始編程,進行燒錄
5、實現效果
打開串口調試助手 SSCOM,打開串口設置
配置串口設置
點擊打開串口
觀察結果
五、仿真邏輯分析儀的使用
(1)在KEIL5中打開調試
(2)打開邏輯分析儀
(3)添加需要觀察的引腳USART1_SR,調為Bit模式,點擊關閉
(4)點擊Run ,開始運行
(5)分析波形
發送信息時高電平的持續時間為 0.458us
發送信息時低電平的持續時間為 87us
延時100ms
六、總結
本文主要介紹利用stm32CubeMX+Keil,在STM32F103C8T6上,嘗試使用寄存器地址方式和HAL庫這兩種方式,實現串口通信。通過實驗發現,stm32CubeMX的可視化操作可以使得寄存器的初始化配置操作變得非常簡單、便捷;HAL庫函數則封裝了許多stm32的常用函數,相較于寄存器方式,HAL庫函數stm32的學習和使用更加容易上手。希望能夠給各位讀者幫助,同時也希望各位讀者能夠自己嘗試去實驗,實踐是檢驗真理的唯一標準,只有通過實驗才能夠真正熟知和掌握知識。若博客中有不足或者缺漏,望各位指出。
參考列表:
1.搭建STM32開發環境——STM32CubeMX,Keil5
2.STM32實現LED閃爍——基于HAL庫
3.基于 MDK 創建 STM32 匯編程序:串口輸出 Hello world
4.STM32最小核心板F103串口通信USART
總結
以上是生活随笔為你收集整理的嵌入式系统开发10——STM32串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RGB彩色空间和YIQ、灰度等的转化
- 下一篇: 利用GSensor让屏幕实现360度旋转