STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!
目錄
- 一、stm32串口通信
- 1.1 串口通信協議
- 1.2 通信接口
- 1.3 串口通信分類
- 1.4 STM32串行通信的通信方式
- 1.5 STM32串行通信
- 1.6 功能引腳
- 1.7 數據寄存器
- 2.1 RS-232通信協議
- 2.2 RS-232串口簡介
- 3.1 USB轉串口CH341接線
- 二、STM32的USART串口通信
- 1.1 題目要求
- 1.2 器件準備
- 1.3 USB轉TTL與C8T6相連
- 1.4 CH341驅動安裝
- 三、用寄存器地址實現stm32串口通信
- 四、 用HAL庫的方式
- 4.1 創建工程,配置參數
- 4.2 代碼編寫
- 4.3 燒錄編譯
- 五、總結
- 六、參考鏈接
一、stm32串口通信
1.1 串口通信協議
- 串口是顯控設備與信號處理板之間通信的主要接口,也是顯控設備與其他設備、設備與設備之間的協議數據幀通信傳輸的重要接口。 [2] 串口通信指串口按位(bit)發送和接收字節。盡管比特字節(byte)的串行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。串口通信協議是指規定了數據包的內容,內容包含了起始位、主體數據、校驗位及停止位,雙方需要約定一致的數據包格式才能正常收發數據的有關規范。串口通信協議是基于串口使得通信雙方能夠相互溝通信息的一種約定,其定義了雙方遵循的協議數據幀格式和其傳輸方式。 [2] 在串口通信中,常用的協議包括RS-232、RS-422和RS-485。
1.2 通信接口
1.3 串口通信分類
,n表示低電平有效。如果使能 RTS流控制,當 USART 接收器準備好接收新數據時就會將 nRTS變成低電平;當接收寄存器已滿時, nRTS將被設置為高電平。該引腳只適用于硬件流控制。
nCTS: 清除以發送(Clear To Send),n 表示低電平有效。如果使能 CTS流控制,發送 器在發送下一幀數據之前會檢測 nCTS引腳,如果為低電平,表示可以發送數據,如果為 高電平則在發送完當前數據幀之后停止發送。該引腳只適用于硬件流控制。 SCLK:發送器時鐘輸出引腳。這個引腳僅適用于同步模式。
1.7 數據寄存器
USART 數據寄存器(USART_DR)只有低 9位有效
一般使用 8位數據字長。
USART_DR 包含了已發送的數據或者接收到的數據。
2.1 RS-232通信協議
若是芯片與PC機(或上位機)相連,除了共地之外,就不能這樣直接交叉連接了。
盡管PC機和芯片都有TXD和RXD引腳,但是通常PC機(或上位機)通常使用的都是RS232接口(通常為DB9封裝),因此不能直接交叉連接。
RS232接口是9針(或引腳),通常是TxD和RxD經過電平轉換得到的。因此,要想使得芯片與PC機的RS232接口直接通信,需要也將芯片的輸入輸出端口也電平轉換成rs232類型,再交叉連接。
經過電平轉換后,芯片串口和rs232的電平標準是不一樣的:
單片機的電平標準(TTL電平):+5V表示1,0V表示0;
Rs232的電平標準:+15/+13 V表示0,-15/-13表示1。
RS-232通訊協議標準串口的設備間通訊結構圖如下:
因此,單片機串口與PC串口通信遵循下面的連接方式:
在單片機串口與上位機給出的rs232口之間,通過電平轉換電路,實現TTL電平與RS232電平之間的轉換。
2.2 RS-232串口簡介
RS232接口(封裝D89)
通信過程中只有兩個腳參與通信,電路連接時,連接三個腳即可。
2腳:電腦的輸入RXD
3腳:電腦的輸出TXD 通過2 ,3 腳就可以實現全雙工(可同時收發)的串行異步通信
5腳:接地
PC串口與單片機串口連接方式:
其中,DB91是在電腦上的 DB92是在單片機實驗板上焊接著的
如果電腦沒有rs232口,只有USB口,可以用串口轉接線轉出串口,在電腦上位機上需要安裝驅動程序。
用串口通信比USB簡單,因為串口通信沒有協議,使用方便簡單。
3.1 USB轉串口CH341接線
USB轉串口模塊可以使用5V電壓供電,需要將跳帽按下圖安裝。
USB轉串口模塊可以使用3.3V電壓供電,需要將跳帽按下圖安裝。
可以對USB轉串口模塊進行測試,將USB的電壓引腳用跳帽接上,然后將RXD和TXD兩個引腳用跳帽或者杜邦線接上。
然后打開串口終端,點擊“手動發送”或者“自動發送”,如果在接收區可以接收到數據,說明USB轉串口模塊工作正常,否則需要檢查接線是否正確、電路板元器件是否損壞。
USB轉串口電路板與單片機的接線圖,VCC接線是為了單片機供電,USB轉串口的RXD引腳與單片機的TXD引腳相連,USB轉串口的TXD引腳與單片機的RXD引腳相連,兩者的GND引腳直接相連。
二、STM32的USART串口通信
1.1 題目要求
完成一個STM32的USART串口通訊程序(查詢方式即可,暫不要求采用中斷方式),要求:
(1)設置波特率為115200,1位停止位,無校驗位;
(2)STM32系統給上位機(win10)連續發送“hello windows!”。win10采用“串口助手”工具接收。
(3)在沒有示波器條件下,可以使用Keil的軟件仿真邏輯分析儀功能觀察管腳的時序波形,更方便動態跟蹤調試和定位代碼故障點。 請用此功能觀察串口輸出波形,并分析其波形反映的時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少。
1.2 器件準備
STM32F103C8T6最小核心板
USB轉TTL
CH340驅動(USB串口驅動)_XP_WIN7共用
串口調試助手XCOM V2.3
1.3 USB轉TTL與C8T6相連
連接示意表
實際連接圖如下
1.4 CH341驅動安裝
下載鏈接:
??CH340/CH341
????Windows 驅動鏈接:https://www.wch.cn/download/CH341SER_EXE.html/
打開網頁,點擊下載
下載好后,點擊應用程序,再點擊安裝
在電腦設備管理器處查看有無com端口出現,有即可證明成功。
三、用寄存器地址實現stm32串口通信
建立模板要用到的SYSTEM文件及啟動文件,包括點燈時需要的C8T6數據手冊,以及燒錄用到的FlyMcu,網盤自取。
鏈接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取碼:k4lv
以下步驟都在keil下操作
- 新建工程light
- 將startup_stm32f10x_md.s這個啟動文件復制你所建的工程目錄下,然后雙擊Source Group1添加(add))即可在新建USER和DAIMA文件和復制SYSTEM啟動文件到工程目錄下。
- 點擊Target 1,再點擊Manage Project ltems…
在上面對話框的中間欄,點新建(用紅圈標出)按鈕(也可以通過雙擊下面的空白處實現),新建 USER 和 SYSTEM 兩個組。然后點擊 Add Files 按鈕,把 SYSTEM 文件夾三個子文件夾里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 組中。注意:此時 USER 組下還是沒有任何文件,我們只添加SYSTEM的三個。
- 點擊 OK,退出該界面返回 IDE。
此時界面如圖所示
- 接著,我們新建一個 test.c 文件,并保存在 USER 文件夾下。然后雙擊 USER 組,會彈出加載文件的對話框,此時我們在 USER 目錄下選擇 test.c 文件,加入到 USER 組下。
- 注意編譯之前點擊魔法棒,設置output生成.hex文件,路徑放在OBJ文件里
- 接著,再設置 Listings 文件路徑,在圖 3.2.16 的基礎上,打開 Listing 選項卡→點擊 Select
Folder for Listings→找到 OBJ 文件夾→點擊 OK
注:OBJ自己是新建的文件,用于存放編譯器編譯時后產生的 c/匯編/鏈接的列表清單
生成的.hex文件也放在里面便于尋找和后面燒錄,主要是方便管理和查找。
- 加入sys、delay、usart的include路徑:
在下載的SYSTEM組下,只需修改usart.c和編寫寫test.c文件即可。
在usart.c修改的代碼如下
void uart_init(u32 pclk2,u32 bound) { float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIVmantissa=temp; //得到整數部分fraction=(temp-mantissa)*16; //得到小數部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; //使能PORTA口時鐘 RCC->APB2ENR|=1<<14; //使能串口時鐘 GPIOA->CRH&=0XFFFFF00F;//IO狀態設置GPIOA->CRH|=0X000008B0;//IO狀態設置 RCC->APB2RSTR|=1<<14; //復位串口1RCC->APB2RSTR&=~(1<<14);//停止復位 //波特率設置USART1->BRR=mantissa; // 波特率設置 USART1->CR1|=0X200C; //1位停止,無校驗位. #if EN_USART1_RX //如果使能了接收//使能接收中斷 USART1->CR1|=1<<5; //接收緩沖區非空中斷使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優先級 #endif }在test.c中修改的代碼:
#include "sys.h" #include "usart.h" #include "delay.h" int main(void) { u16 t; u16 len; u16 times=0;Stm32_Clock_Init(9); //系統時鐘設置delay_init(72); //延時初始化uart_init(72,115200); //串口初始化為115200while(1){if(USART_RX_STA&0x8000){ len=USART_RX_STA&0x3FFF;//得到此次接收到的數據長度printf("\r\n Hello Windows! \r\n\r\n");for(t=0;t<len;t++){USART1->DR=USART_RX_BUF[t];while((USART1->SR&0X40)==0);//等待發送結束}printf("\r\n\r\n");//插入換行USART_RX_STA=0;}else{times++;if(times%200==0)printf("Hello Windows!\r\n"); delay_ms(10); }} }-
編譯結果
-
沒有報錯!
那么就可以進行燒錄了。 -
借助Flymou進行燒錄
-
百度云盤資源
鏈接:https://pan.baidu.com/s/1VxMUZFOVvpAf-L_YbATMag
提取碼:fasf
-
用XCOM串口觀察助手
-
打開XCOM串口助手,彈出界面點擊打開串口,即可以接收到C8T6發送的數據Hello Windows!
四、 用HAL庫的方式
4.1 創建工程,配置參數
打開Stm32CubeMX并創建工程
選擇stm32F103C8開發板,開始工程
Mode選擇異步通信(Asynchronous):
勾選Enabled:
配置項目設置(名稱、位置、環境):
生成項目:
4.2 代碼編寫
- Stm32CubeMX設置好后跳轉到keil上
- 在main.c中定義STM32需要給上位機發送的消息:
- 在main.c中定義一個延時函數,來使設置發送的時間間隔:
- 在while循環中調用查詢,并調用延時函數:
- 執行結果
4.3 燒錄編譯
打開FlyMcu 選擇剛剛程序編譯生成的hex文件,并搜索串口并燒錄
打開XCOM串口觀察小助手
五、總結
keil沒有成功build的話,可能是代碼本身問題,也可使魔法棒里的一些設置問題。燒錄沒成功可能是實驗操作時的一些沒有注意到的小問題,一步一步的找出問題,實踐出真知,都能解決的。
六、參考鏈接
https://blog.csdn.net/qq_43328313/article/details/106439088
https://blog.csdn.net/qq_46467126/article/details/120841504?spm=1001.2014.3001.5502
總結
以上是生活随笔為你收集整理的STM32串口通信以寄存器地址和HAL两种方式实验Hello Windows!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驾照新规4月起实施:有驾驶经历者可直接申
- 下一篇: 图像特效之LOMO效果