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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

嵌入式系统开发10——STM32串口通信

發布時間:2023/12/16 windows 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式系统开发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

  • 面包板一塊

  • 杜邦線(公對公、母對母)若干

  • 連接方法:

USB轉TTLSTM32F103C8T6
GNDG
3V33V3
RXDPA9
TXDPA10

注意將核心板上的BOOT0設置為1,BOOT1設置為0


2、軟件環境

  • MDK5、stm32CubeMX、虛擬邏輯分析儀的安裝與使用可以參考本人的另外兩篇帖子。
    1、嵌入式系統開發05——MDK5的安裝、匯編語言編程入門實踐以及Hex文件的分析
    2、嵌入式系統開發08——stm32CubeMX+HAL庫實現流水燈以及虛擬邏輯分析儀的使用

  • CH340驅動(USB串口驅動)
    安裝好之后,將 USB轉TTLSTM32F103C8T6 連接到電腦上后可以看到端口處連接有一個 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 函數,代碼如下
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 }

先計算得到 USART1->BRR 的內容。然后開始初始化串口引腳,然后設置波特率和奇偶校驗等。
這里需要注意一點,因為我們使用到了串口的中斷接收,必須在 usart.h 里面設置 EN_USART1_RX 為 1(默認設置就是 1 的)。該函數才會配置中斷使能,以及開啟串口 1 的 NVIC 中斷。這里我們把串口 1 中斷放在組 2,優先級設置為組 2 里面的最低。

  • (2)在 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); }} }


其中 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)解壓到 Keil5ARM 文件夾下(這里需要找到自己的 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,選擇 USART1Mode 設置為 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); //延時100ms

3、編譯

點擊魔術棒,在 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串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。

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