串口通信小試牛刀
嵌入式系統第6周作業2(暨第7周實驗)一. 了解串口協議和RS-232標準,以及RS232電平與TTL電平的區別;了解"USB/TTL轉232"模塊(以CH340芯片模塊為例)的作業原理, 二. 安裝 stm32CubeMX,配合Keil,分別嘗試使用暫存器地址方式(匯編或C,不限) 和HAL庫這兩種方式,完成下列任務: 1、重做上一個LED流水燈作業,即用GPIO埠完成3只LED紅綠燈的周期閃爍, 2、完成一個STM32的USART串口通訊程式(查詢方式即可,暫不要求采用中斷方式),要求: 1)設定波特率為115200,1位停止位,無校驗位; 2)STM32系統給上位機(win10)連續發送“hello windows!”,win10采用“串口助手”工具接收, 三. 在沒有示波器條件下,可以使用Keil的軟體仿真邏輯分析儀功能觀察管腳的時序波形,更方便動態跟蹤除錯和定位代碼故障點, 請用此功能觀察第1題中3個GPIO埠的輸出波形,和第2題中串口輸出波形,并分析時序狀態正確與否,高低電平轉換周期(LED閃爍周期)實際為多少,
目錄
- 串口通信小試牛刀
- 一、串口通信協議:RS-232
- 1.串口通信協議
- 2. RS-232
- 3.RS232電平與TTL電平的區別
- 4.USB/TTL轉232模塊(以CH340芯片模塊為例)的作業原理
- 1.模塊介紹
- 2.模塊用途
- 3.硬體設計
- 二、stm32CubeMX的安裝
- 1.配置環境變數
- 2.安裝STM32CubeMX
- 3.初始化代碼
- 4.修改代碼并點亮流水燈
- 三、STM32的USART串口通訊程式
- 1.USART介紹
- 2.USART配置:
- 3.匯編實作
- 4.hel庫實作
- 1.SRM32CubeMX
- 2.Keil
- 三、總結
- 四、參考文獻
一、串口通信協議:RS-232
1.串口通信協議
串口通信指串口按位(bit)發送和接收位元組,盡管位元位元組(byte)的串行通信慢,但是串口可以在使用一根線發送資料的同時用另一根線接收資料,串口通信協議是指規定了資料包的內容,內容包含了起始位、主體資料、校驗位及停止位,雙方需要約定一致的資料包格式才能正常收發資料的有關規范,在串口通信中,常用的協議包括RS-232、RS-422和RS-485,
2. RS-232
RS-232標準介面(又稱EIA RS-232)是常用的串行通信介面標準之一,它是由美國電子工業協會(EIA)聯合貝爾系統公司、調制解調器廠家及計算機終端生產廠家于1970年共同制定,其全名是“資料終端設備( DTE)和資料通信設備(DCE)之間串行二進制資料交換介面技術標準”,1
RS-232(ANSI/EIA-232標準)是IBM-PC及其兼容機上的串行連接標準,可用于許多用途,比如連接滑鼠、列印機或者Modem,同時也可以接工業儀器儀表,用于驅動和連線的改進,實際應用中RS-232的傳輸長度或者速度常常超過標準的值,RS-232只限于PC串口和設備間點對點的通信,RS-232串口通信最遠距離是50英尺,
3.RS232電平與TTL電平的區別
-
TTL電平標準:
- 輸出L:<0.8V;H:>2.4V,
- 輸入L:<1.2V;H:>2.0V,
- TTL器件輸出低電平要小于0.8V,高電平要大于2.4V,輸入,低于1.2V就認為是0,高于2.0就認為是1,于是TTL電平的輸入低電平的噪聲容限就只有(0.8-0)/2=0.4V,高電平的噪聲容限為(5-2.4)/2=1.3V,
-
RS232標準:
- 邏輯1的電平為-3~-15V,邏輯0的電平為+3~+15V,注意電平的定義反相了一次,RS232可做到雙向傳輸,全雙工通訊,為異步資料傳輸方式,最高傳輸速率可達到20Kbps,
-
RS232電平與TTL電平的區別:
- 電平的上限和下限定義不一樣,CMOS具有更大的抗噪區域, 同是5伏供電的話,ttl一般是1.7V和3.5V的樣子,CMOS一般是2.2V,2.9V的樣子,不準確,僅供參考,
- 電流驅動能力不一樣,ttl一般提供25毫安的驅動能力,而CMOS一般在10毫安左右,
- 需要的電流輸入大小也不一樣,一般ttl需要2.5毫安左右,CMOS幾乎不需要電流輸入,
- 很多器件都是兼容TTL和CMOS的,datasheet會有說明,如果不考慮速度和性能,一般器件可以互換,但是需要注意有時候負載效應可能引起電路作業不正常,因為有些ttl電路需要下一級的輸入阻抗作為負載才能正常作業,
4.USB/TTL轉232模塊(以CH340芯片模塊為例)的作業原理
1.模塊介紹
-
模塊特點
CH340C USB轉TTL模塊以CH340C芯片為核心,內部自帶晶振,最高波特率可達2Mbps,軟體兼容CH341驅動,過流保護,引出相應的通訊介面與電源介面,通訊介面帶有指示燈指示作業狀態,通訊穩定,體積小,- 全速USB驅動,兼容USB2.0
- 硬體全雙工串口,內置收發緩沖區
- 支持波特率50bps~2Mbps
- 輸出TTL電平3.3V,兼容5V的IO電平
-
模塊介面引腳
| Symbol(符號) | Type (型別) | Deion(描述) |
|---|---|---|
| TXD | 輸出 | 串行資料輸出口 |
| RXD | 輸入 | 串行資料輸出口 |
| GND | 電源 | 接地引腳 |
| 3V3 | 電源 | 3.3V電源輸出引腳(最高250mA) |
| 5V | 電源 | 3.3V電源輸出引腳(最高250mA) |
| DTS | 輸出 | MODEM聯絡輸出信號,請求發送 |
| DTR | 輸出 | MODEM聯絡輸出信號,資料終端就緒 |
輸入輸出介面引腳均帶有LED指示燈
電源介面引腳中,5V的介面引腳帶有LED指示燈
2.模塊用途
電腦USB端是USB電平,單片機的信號是TTL電平,兩者的電平不同是無法進行通訊的,需要通過轉換才能實作相互通訊,CH340C USB 轉TTL模塊就是實作USB電平與TTL電平相互轉換的模塊,
- USB:采用VCC、GND、D+、D-傳輸,電腦上的插口就是USB介面,
- TTL:一般指單片機的邏輯電平,不同單片的供電的系統TTL的電平不一樣,3.3V單片的TTL電平就是:高電平3.3V(邏輯1),低電平0V(邏輯0),
- 單片機與上位機的通訊
在除錯單片機程式的時候,想了解程式的執行情況或相關資訊,一般簡單的做法就是用串口把資訊發送給電腦,電腦接收到再通過上位機(串口除錯助手)顯示出來,但是單片機串口發送的信號是TTL電平,電腦能接收到的信號是USB電平,兩者無法直接通訊,USB轉TTL模塊可以把串口發送的TTL信號轉換成USB信號再發送給電腦,電腦就可以接收到單片機發送過來的信號并在上位機(串口除錯助手)上顯示出來, - 單片機的ISP串口程式下載
大部分單片機都可以使用串口的方式通過相應的上位機軟體來下載程式,但是電腦的USB出來的信號是USB信號,單片機是無法識別USB信號的,需要通過USB轉TTL模塊把USB信號轉換成TTL信號才能將程式下載到單片機中, - MODEMD的韌體升級
有些MODEM可以使用串口升級韌體,在模塊中也引出了RTS,DTR兩個MODEM信號輸出介面,并帶有相應的指示燈指示狀態,
3.硬體設計
硬體電路設計主要介紹以CH340C芯片為核心,設計出一個USB轉TTL的模塊(也就是該模塊),主要包括電源的設計、功能的設計等,其中選用的器件規格型號可以參考產品手冊的BOM表,- CH340C芯片引腳功能表
| 引腳序號 | 引腳名稱 | 型別 | 引腳說明 |
|---|---|---|---|
| 1 | GND | 電源 | 公共接地端,直接連到USB總線的地線 |
| 3 | RXD | 輸入 | 串行資料輸入 |
| 4 | V3 | 電源 | 在3.3V電源電源電壓時連接VCC輸入外部電源 ; 在5V電源電壓時外接容量為0.1uF退藕電容 |
| 5 | D+ | USB信號 | 直接連接到USB總線的D+資料線 |
| 6 | D- | USB信號 | 直接連接到USB總線的D-資料線 |
| 7 | XI | 輸入 | CH340C內部自帶晶振,必須懸空 |
| 8 | XO | 輸出 | CH340C內部自帶晶振,必須懸空 |
| 9 | CTS# | 輸入 | MODEM聯絡輸入信號,清除發送,低(高)有效 |
| 10 | 輸入 | 輸入 | MODEM聯絡輸入信號,資料裝置就緒,低(高)有效 |
| 11 | RI# | 輸入 | MODEM聯絡輸入信號,振鈴提示,低(高)有效 |
| 12 | DCD# | 輸入 | MODEM聯絡輸入信號,載波檢測,低(高)有效 |
| 13 | DCD# | 輸出 | MODEM聯絡輸入信號,資料終端就緒,低(高)有效 |
| 14 | RTS# | 輸出 | MODEM聯絡輸入信號,請求發送,低(高)有效 |
| 15 | R232 | 電源 | 輔助RS232使能,高有效,內置下拉 |
| 16 | VCC | 電源 | 正電源輸入端,需外接0.1uF電源退藕電容 |
- 模塊的電源設計
- 在CH340C的引腳功能表中紅色部分是電源相關的引腳,對于不同電壓供電系統的TTL電平是不一樣的,大部分的系統是5V或3.3V供電,一般5V的系統是兼容3.3V的TTL電平的,但是3.3V系統是不兼容5V的,為了是能兼容3.3V與5V的系統,模塊的電源使用3.3V電源供電,
- 電腦的USB介面電源輸出時5V,最大電流是500mA,在電路中為了防止意外的誤操作,在5V的電源端加了一個0.5A,6V的保險絲F1,當電壓超過6V或電流超過0.5A保險絲就會斷開對電路進行保護,
- USB輸出的電壓是5V,而CH340C的芯片采用3.3V供電,為了使模塊的供電為3.3V,在電路中加入了一個LDO(低壓差線性穩壓器)U2,它可以把5V穩壓成3.3V,然后對CH340C進行供電(根據手冊要求V3引腳也要接3.3V的電源),每一個電源的輸入端都會加上一個0.1uF的濾波電容,
在模塊引出的介面中: - 5V:USB的電源輸出,電壓為5V,電流最大可達500mA
- 3V3:5V經過LDO穩壓后得到的3.3V電壓,電流最大可達25mA
- GND:USB的GND
- 模塊的USB轉TTL電路設計
在CH340C的引腳功能表中藍色部分是信號相關的引腳,黑色部分的與設計無關的引腳,全部懸空,CH340C芯片的D-,D+與USB的D-,D+連接到一起作為USB電平的信號連接,同時引出TTL電平信號的介面TXD與RXD,還有兩個MODEM輸出信號介面RTS與DTR, - 模塊的指示燈電路設計
為了檢測模塊是否通電正常,在5V的輸入端設計了一個指示燈LED1(紅色),該等亮表示模塊已經上電,通訊時需要了解資料的收發情況,在TXD,RXD資料介面中分別接入了LED2(藍色),LED3(綠色)指示燈,當模塊到資料時,RXD的指示燈就會亮;模塊發送資料時TXD的指示燈就會亮,另外引出的RTS與DTR信號介面也設計了LED4(黃色),LED5(綠色)指示燈,
因為TXD,RXD,RTS,DTR介面都是從CH340C芯片管腳印出來的,CH340C是3.3V供電,所以設計對應的指示燈的電源應該選擇3.3V,TXD與RXD在CH340C中空閑時(沒有發生資料傳輸)是高電平的,對應的指示燈狀態時滅的,只有發生資料傳輸時指示燈才會亮,RTS與DTR介面時CH340C的MODEM輸出信號介面,對應的指示燈在用不同的上位機軟體它們的亮滅是不確定的,
二、stm32CubeMX的安裝
1.配置環境變數
云盤下載:這里使用了這個博客提供的云盤地址
https://blog.csdn.net/Brendon_Tan/article/details/107685563
但是需要Java環境支撐,去官網 https://www.java.com/zh_CN/download/windows-64bit.jsp下載之后遇到了
的問題,搜索之后發現中文版的官網只支持32位的下載,這里需要把中文版網址的zh_CN改成en,訪問英文版的官網點擊download
找到
選擇x64的版本
就可以安裝STM32CubeMX了,
2.安裝STM32CubeMX
- 打開 SetupSTM32CubeMX-6.0.0.exe 檔案
- 點擊 Next
- 勾選 I accpt,點擊 Next
- 勾選第一個,點擊 Next

- 可以自己修改安裝路徑,點擊 Next

- Yes

- Next


- Next

- Done

- 成功
但是還需要安裝依賴包



完成!
3.初始化代碼
- File-New Project

- 之后會在線下載一些東西

- 選擇型號STM32F103C8,選中之后點擊start project

- System Core-SYS-debug-Serial Wire

- System Core-RCC-High Speed Clock-Crystal/Ceramic Resonator

- 勾選Clock Condigiguration-PLLCLK

- Pinout ViewPA0,PB9,PC15設定GPIO_Output

- Project Manager- Project -Toolchain / IDE-MDK-ARM

- Project Manager- Code Generator-Generated files-勾選第一個

- Generator Code

- Open Project

4.修改代碼并點亮流水燈
- 打開main.c檔案,在while函式里面添加實作功能的代碼
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15
HAL_Delay(1000);//1s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15
HAL_Delay(1000);//1s
- 編譯,沒有錯誤

- 在debug里修改Diog.dll和Parameter
debug輸出波形圖

- 打開McuFly,運行

三、STM32的USART串口通訊程式
1.USART介紹
- 百度百科:
- (Universal Synchronous/Asynchronous Receiver/Transmitter)
- 通用同步/異步串行接收/發送器
- USART是一個全雙工通用同步/異步串行收發模塊,該介面是一個高度靈活的串行通信設備,
- 主要特點
- 全雙工操作(相互獨立的接收資料和發送資料);
- 同步操作時,可主機時鐘同步,也可從機時鐘同步;
- 獨立的高精度波特率發生器,不占用定時/計數器;
- 支持5、6、7、8和9位資料位,1或2位停止位的串行資料幀結構;
- 由硬體支持的奇偶校驗位發生和檢驗;
- 資料溢位檢測;
- 幀錯誤檢測;
- 包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;
- 三個完全獨立的中斷,TX發送完成、TX發送資料暫存器空、RX接收完成;
- 支持多機通信模式;
- 支持倍速異步通信模式,
- 功能引腳
| 引腳 | 功能 |
|---|---|
| TX | 發送資料輸出引腳 |
| RX | 接收資料輸入引腳 |
| SW_RX | 資料接收引腳,只用于單線和智能卡模式,屬于內部引腳,沒有具體外部引腳, |
| nRTS | 請求以發送(Request To Send), n 表示低電平有效,如果使能 RTS 流控制,當USART 接收器準備好接收新資料時就會將 nRTS 變成低電平;當接收暫存器已滿時,nRTS 將被設定為高電平,該引腳只適用于硬體流控制, |
| USART | 接收器準備好接收新資料時就會將 nRTS 變成低電平;當接收暫存器已滿時,nRTS 將被設定為高電平,該引腳只適用于硬體流控制, |
| nRTS | 將被設定為高電平,該引腳只適用于硬體流控制, |
| nCTS | 清除以發送(Clear To Send), n 表示低電平有效,如果使能 CTS 流控制,發送器在發送下一幀資料之前會檢測 nCTS 引腳,如果為低電平,表示可以發送資料,如果為高電平則在發送完當前資料幀之后停止發送,該引腳只適用于硬體流控制, |
| SCLK | 發送器時鐘輸出引腳,這個引腳僅適用于同步模式, |
2.USART配置:
- STM32在只有一個中斷的情況下,仍然需要配置優先級,其作用是使能某條中斷的觸發通道,STM32的中斷有至多兩個層次,分別是搶占優先級(主優先級)和子優先級(從優先級),而整個優先級設定引數的長度為4位,因此需要首先劃分搶占優先級位數和子優先級位數,通過
NVIC_PriorityGroupConfig()實作; - 特定設備的中斷優先級NVIC的屬性包含在結構體NVIC_InitTypeDef中,其中欄位
NVIC_IRQChannel包含了設備的中斷向量,保存在啟動代碼中;欄位NVIC_IRQChannelPreemptionPriority為主優先級,NVIC_IRQChannelSubPriority為從優先級,取值的范圍應根據位數劃分的情況而定;最后NVIC_IRQChannelCmd欄位是是否使能,一般置為ENABLE,最后通過NVIC_Init()來使能這一中斷向量,
3.匯編實作
-
打開Keil-Project-new peoject

-
新建檔案

-
芯片依舊選擇STM32F103C8

- 新建main.s


代碼
;RCC暫存器地址映像
RCC_BASE EQU 0x40021000
RCC_CR EQU (RCC_BASE + 0x00)
RCC_CFGR EQU (RCC_BASE + 0x04)
RCC_CIR EQU (RCC_BASE + 0x08)
RCC_APB2RSTR EQU (RCC_BASE + 0x0C)
RCC_APB1RSTR EQU (RCC_BASE + 0x10)
RCC_AHBENR EQU (RCC_BASE + 0x14)
RCC_APB2ENR EQU (RCC_BASE + 0x18)
RCC_APB1ENR EQU (RCC_BASE + 0x1C)
RCC_BDCR EQU (RCC_BASE + 0x20)
RCC_CSR EQU (RCC_BASE + 0x24)
;AFIO暫存器地址映像
AFIO_BASE EQU 0x40010000
AFIO_EVCR EQU (AFIO_BASE + 0x00)
AFIO_MAPR EQU (AFIO_BASE + 0x04)
AFIO_EXTICR1 EQU (AFIO_BASE + 0x08)
AFIO_EXTICR2 EQU (AFIO_BASE + 0x0C)
AFIO_EXTICR3 EQU (AFIO_BASE + 0x10)
AFIO_EXTICR4 EQU (AFIO_BASE + 0x14)
;GPIOA暫存器地址映像
GPIOA_BASE EQU 0x40010800
GPIOA_CRL EQU (GPIOA_BASE + 0x00)
GPIOA_CRH EQU (GPIOA_BASE + 0x04)
GPIOA_IDR EQU (GPIOA_BASE + 0x08)
GPIOA_ODR EQU (GPIOA_BASE + 0x0C)
GPIOA_BSRR EQU (GPIOA_BASE + 0x10)
GPIOA_BRR EQU (GPIOA_BASE + 0x14)
GPIOA_LCKR EQU (GPIOA_BASE + 0x18)
;GPIO C口控制
GPIOC_BASE EQU 0x40011000
GPIOC_CRL EQU (GPIOC_BASE + 0x00)
GPIOC_CRH EQU (GPIOC_BASE + 0x04)
GPIOC_IDR EQU (GPIOC_BASE + 0x08)
GPIOC_ODR EQU (GPIOC_BASE + 0x0C)
GPIOC_BSRR EQU (GPIOC_BASE + 0x10)
GPIOC_BRR EQU (GPIOC_BASE + 0x14)
GPIOC_LCKR EQU (GPIOC_BASE + 0x18)
;串口1控制
USART1_BASE EQU 0x40013800
USART1_SR EQU (USART1_BASE + 0x00)
USART1_DR EQU (USART1_BASE + 0x04)
USART1_BRR EQU (USART1_BASE + 0x08)
USART1_CR1 EQU (USART1_BASE + 0x0c)
USART1_CR2 EQU (USART1_BASE + 0x10)
USART1_CR3 EQU (USART1_BASE + 0x14)
USART1_GTPR EQU (USART1_BASE + 0x18)
;NVIC暫存器地址
NVIC_BASE EQU 0xE000E000
NVIC_SETEN EQU (NVIC_BASE + 0x0010)
;SETENA暫存器陣列的起始地址
NVIC_IRQPRI EQU (NVIC_BASE + 0x0400)
;中斷優先級暫存器陣列的起始地址
NVIC_VECTTBL EQU (NVIC_BASE + 0x0D08)
;向量表偏移暫存器的地址
NVIC_AIRCR EQU (NVIC_BASE + 0x0D0C)
;應用程式中斷及復位控制暫存器的地址
SETENA0 EQU 0xE000E100
SETENA1 EQU 0xE000E104
;SysTick暫存器地址
SysTick_BASE EQU 0xE000E010
SYSTICKCSR EQU (SysTick_BASE + 0x00)
SYSTICKRVR EQU (SysTick_BASE + 0x04)
;FLASH緩沖暫存器地址映像
FLASH_ACR EQU 0x40022000
;SCB_BASE EQU (SCS_BASE + 0x0D00)
MSP_TOP EQU 0x20005000
;主堆疊起始值
PSP_TOP EQU 0x20004E00
;行程堆疊起始值
BitAlias_BASE EQU 0x22000000
;位帶別名區起始地址
Flag1 EQU 0x20000200
b_flas EQU (BitAlias_BASE + (0x200*32) + (0*4))
;位地址
b_05s EQU (BitAlias_BASE + (0x200*32) + (1*4))
;位地址
DlyI EQU 0x20000204
DlyJ EQU 0x20000208
DlyK EQU 0x2000020C
SysTim EQU 0x20000210
;常數定義
Bit0 EQU 0x00000001
Bit1 EQU 0x00000002
Bit2 EQU 0x00000004
Bit3 EQU 0x00000008
Bit4 EQU 0x00000010
Bit5 EQU 0x00000020
Bit6 EQU 0x00000040
Bit7 EQU 0x00000080
Bit8 EQU 0x00000100
Bit9 EQU 0x00000200
Bit10 EQU 0x00000400
Bit11 EQU 0x00000800
Bit12 EQU 0x00001000
Bit13 EQU 0x00002000
Bit14 EQU 0x00004000
Bit15 EQU 0x00008000
Bit16 EQU 0x00010000
Bit17 EQU 0x00020000
Bit18 EQU 0x00040000
Bit19 EQU 0x00080000
Bit20 EQU 0x00100000
Bit21 EQU 0x00200000
Bit22 EQU 0x00400000
Bit23 EQU 0x00800000
Bit24 EQU 0x01000000
Bit25 EQU 0x02000000
Bit26 EQU 0x04000000
Bit27 EQU 0x08000000
Bit28 EQU 0x10000000
Bit29 EQU 0x20000000
Bit30 EQU 0x40000000
Bit31 EQU 0x80000000
;向量表
AREA RESET, DATA, READONLY
DCD MSP_TOP ;初始化主堆疊
DCD Start ;復位向量
DCD NMI_Handler ;NMI Handler
DCD HardFault_Handler ;Hard Fault Handler
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD 0
DCD SysTick_Handler ;SysTick Handler
SPACE 20 ;預留空間20位元組
;代碼段
AREA |.text|, CODE, READONLY
;主程式開始
ENTRY
;指示程式從這里開始執行
Start
;時鐘系統設定
ldr r0, =RCC_CR
ldr r1, [r0]
orr r1, #Bit16
str r1, [r0]
;開啟外部晶振使能
;啟動外部8M晶振
ClkOk
ldr r1, [r0]
ands r1, #Bit17
beq ClkOk
;等待外部晶振就緒
ldr r1,[r0]
orr r1,#Bit17
str r1,[r0]
;FLASH緩沖器
ldr r0, =FLASH_ACR
mov r1, #0x00000032
str r1, [r0]
;設定PLL鎖相環倍率為7,HSE輸入不分頻
ldr r0, =RCC_CFGR
ldr r1, [r0]
orr r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)
orr r1, #Bit10
str r1, [r0]
;啟動PLL鎖相環
ldr r0, =RCC_CR
ldr r1, [r0]
orr r1, #Bit24
str r1, [r0]
PllOk
ldr r1, [r0]
ands r1, #Bit25
beq PllOk
;選擇PLL時鐘作為系統時鐘
ldr r0, =RCC_CFGR
ldr r1, [r0]
orr r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14)
orr r1, #Bit10
orr r1, #Bit1
str r1, [r0]
;其它RCC相關設定
ldr r0, =RCC_APB2ENR
mov r1, #(Bit14 :OR: Bit4 :OR: Bit2)
str r1, [r0]
;PA9串口0發射腳
ldr r0, =GPIOA_CRH
ldr r1, [r0]
orr r1, #(Bit4 :OR: Bit5)
;PA.9輸出模式,最大速度50MHz
orr r1, #Bit7
and r1, #~Bit6
;10:復用功能推挽輸出模式
str r1, [r0]
ldr r0, =USART1_BRR
mov r1, #0x271
str r1, [r0]
;配置波特率-> 115200
ldr r0, =USART1_CR1
mov r1, #0x200c
str r1, [r0]
;USART模塊總使能 發送與接收使能
;71 02 00 00 2c 20 00 00
;AFIO 引數設定
;Systick 引數設定
ldr r0, =SYSTICKRVR
;Systick裝初值
mov r1, #9000
str r1, [r0]
ldr r0, =SYSTICKCSR
;設定,啟動Systick
mov r1, #0x03
str r1, [r0]
;切換成用戶級執行緒式模式
ldr r0, =PSP_TOP
;初始化執行緒堆疊
msr psp, r0
mov r0, #3
msr control, r0
;初始化SRAM暫存器
mov r1, #0
ldr r0, =Flag1
str r1, [r0]
ldr r0, =DlyI
str r1, [r0]
ldr r0, =DlyJ
str r1, [r0]
ldr r0, =DlyK
str r1, [r0]
ldr r0, =SysTim
str r1, [r0]
;主回圈
main
ldr r0, =Flag1
ldr r1, [r0]
tst r1, #Bit1
;SysTick產生0.5s,置位bit 1
beq main ;0.5s標志還沒有置位
;0.5s標志已經置位
ldr r0, =b_05s
;位帶操作清零0.5s標志
mov r1, #0
str r1, [r0]
mov r0, #'H'
bl send_a_char
mov r0, #'e'
bl send_a_char
mov r0, #'l'
bl send_a_char
mov r0, #'l'
bl send_a_char
mov r0, #'o'
bl send_a_char
mov r0, #' '
bl send_a_char
mov r0, #'W'
bl send_a_char
mov r0, #'i'
bl send_a_char
mov r0, #'n'
bl send_a_char
mov r0, #'d'
bl send_a_char
mov r0, #'o'
bl send_a_char
mov r0, #'w'
bl send_a_char
mov r0, #'\n'
bl send_a_char
b main
;子程式 串口1發送一個字符
send_a_char
push {r0 - r3}
ldr r2, =USART1_DR
str r0, [r2]
b1
ldr r2, =USART1_SR
ldr r2, [r2]
tst r2, #0x40
beq b1
;發送完成(Transmission complete)等待
pop {r0 - r3}
bx lr
;例外程式
NMI_Handler
bx lr
HardFault_Handler
bx lr
SysTick_Handler
ldr r0, =SysTim
ldr r1, [r0]
add r1, #1
str r1, [r0]
cmp r1, #500
bcc TickExit
mov r1, #0
str r1, [r0]
ldr r0, =b_05s
;大于等于500次 清零時鐘滴答計數器 設定0.5s標志位
;位帶操作置1
mov r1, #1
str r1, [r0]
TickExit
bx lr
ALIGN
;通過用零或空指令NOP填充,來使當前位置與一個指定的邊界對齊
EN
-
build


這里又有錯誤,是版本問題,修改一下就好

忘了生成.hex檔案


-
McuFly

-
除錯

成功 -
觀察波形
debug修改相關設定
點開波形圖添加暫存器


4.hel庫實作
1.SRM32CubeMX
-
File-New Project,選擇型號STM32F103C8,選中之后點擊start project



-
System Core-RCC-High Speed Clock-Crystal/Ceramic Resonator

-
A->Z-USART1-Asynchronous

-
勾選Clock Condigiguration-PLLCLK

-
新建檔案名
Project Manager- Project -Toolchain / IDE-MDK-ARM
Application Structure-Basic

-
Project Manager- Code Generator-Generated files-勾選第一個

-
Generator Code
-
Open Project

2.Keil
- 在main.c檔案的while函式中添加代碼
char data[]="hello windows!\n";
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
HAL_Delay(1000);

- build

- McuFly

- 除錯

- 分析波形
- debug

- setup

- 波形圖

- debug
三、總結
這次作業我學習了解串口協議和RS-232標準,以及RS232電平與TTL電平的區別,以及USB/TTL轉232的作業原理,通過后面的實驗匯編語言和STM32CubeMX做兩個專案,我了解了STM32CubeMX的基本操作方法,如何建立.hex檔案等,比起匯編語言實作,它要方便快捷很多,了解了如何使用Keil波形圖分析,當然實驗程序中也遇到了很多問題,在自己查閱資料和同學的幫助下都成功地解決了,
四、參考文獻
http://www.elecfans.com/emb/jiekou/20171101573461.html
https://www.sohu.com/a/168891691_669755
https://blog.csdn.net/Mark_md/article/details/108597911
https://blog.csdn.net/qq_43279579/article/details/112233696
https://blog.csdn.net/vic_to_ry/article/details/110451036
https://www.cnblogs.com/yangguang-it/p/7070787.html
李永忠主編.現代微機原理與介面技術:西安電子科技大學出版社,2013.10 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336365.html
標籤:其他
