目錄
一.串口通信和RS-232標準
1.串口通信
波特率
資料位
停止位
奇偶校驗
2.RS-232標準
二.安裝STM32CubeMX,搭建STM32的開發環境
1.安裝jdk
2.安裝STM32CubeMX
3.安裝韌體庫
三.LED流水燈
1.新建工程
2.main.c
3.實驗效果
四.USART串口通訊程式
1.新建工程
2.匯編代碼
3.燒錄
五.用keil觀察時序波形
1 .環境設定
2.觀測三個GPIO埠的輸出波形
3.串口輸出波形
六.總結
參考文獻:
一.串口通信和RS-232標準
1.串口通信
串口是資料通信介面,其功能是作為 CPU 和串行設備間的編碼轉換器,當資料從 CPU 經過串行埠發送出去時,位元組資料轉換為串行的位;在接收資料時,串行的位被轉換為位元組資料,
串口通信指串口按位發送和接收位元組,在串口通信中,常用的協議包括RS-232、RS-422和RS-485,串口通信最重要的引數是波特率、資料位、停止位和奇偶校驗,

波特率
這是一個衡量符號傳輸速率的引數,指的是信號被調制以后在單位時間內的變化,即單位時間內載波引數變化的次數,
資料位
這是衡量通信中實際資料位的引數,當計算機發送一個資訊包,實際的資料往往不會是8位的,標準的值是6、7和8位,如何設定取決于你想傳送的資訊,
停止位
用于表示單個包的最后一位,典型的值為1,1.5和2位,由于資料是在傳輸線上定時的,并且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步,因此停止位不僅僅是表示傳輸的結束,并且提供計算機校正時鐘同步的機會,適用于停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率同時也越慢,
奇偶校驗
奇校驗要求有效資料和校驗位中“1”的個數為奇數,比如一個8位長的有效資料為:01101001,此時共有4個“1”,為達到奇校驗效果,校驗位為“1”,最后傳輸的是8位有效資料加1位校驗位,共9位,偶校驗剛好相反,要求有效資料和校驗位的“1”數量為偶數,則此時為達到偶校驗效果,校驗位為“0”,而0校驗則無論有效資料中是什么資料內容,校驗位總是為“0”,1校驗校驗位總是為“1”,
2.RS-232標準
RS-232標準介面是常用的串行通信介面標準之一,RS232標準采用的介面是9針或25針的D型插頭,常用的一般是9針插頭,
RS-232標準在-12~3V邏輯為1,在+3V~+15V邏輯為0,
TTL器件輸出低電平要小于0.8V,高電平要大于2.4V,輸入,低于1.2V就認為是0,高于2.0就認為是1,
由于 RS-232電平標準的信號不能直接被 控制器直接識別,所以這些信號會經過一個“電平轉換芯片”轉換成控制器能識別的 “TTL 標準”的電平信號,才能實作通訊,
二.安裝STM32CubeMX,搭建STM32的開發環境
1.安裝jdk
由于STM32CubeMX是Java實作的,需要安裝jdk環境,
jdk官網下載鏈接:Java Downloads | Oracle
選Windows的下載:

這個安裝很簡單,跟著安裝步驟一步一步安裝下去就可以了,由于我已經安裝完成了,所以就不截圖具體步驟了,
2.安裝STM32CubeMX
下載鏈接:
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
2.1以管理員身份運行并安裝 SetupSTM32CubeMX-4.27.0.exe ,進入下面這個界面后,點擊Next


2.2點擊"I accept the terms of this license agreement",接著選擇Next
2.3選擇安裝位置,安裝位置不要出現中文,不然可能出現問題,選擇好安裝位置后,點擊next

2.4 繼續下一步,點擊next
2.5然后等待安裝完成

3.安裝韌體庫
3.1打開STM32cubemx,選擇 Help->Magne 安裝韌體庫

3.2選擇F1系列下的安裝包,點擊Install Now

3.3等待下載,下載完成后會出現綠框,

三.LED流水燈
1.新建工程
1.1點擊new project

1.2選擇STM32F103C8芯片
1.3點擊System Core,雙擊SYS,在Debug里選Serial Wire

1.4點擊System Core,雙擊RCC,在High Speed Clock(HSE)里選Crystal/Ceramic Resonator

1.5將Clock Configuration從HSI設為PLLOCK,選擇時鐘頻率為72M,輸入完成后按回車鍵,
1.6在Pinout&Configuration中,單擊PA12,PB1,PC14引腳,選擇GPIO_Output,配置引腳,

1.7點擊Pinout&Configuration在System Core GPIO下找到剛配置的三個引腳,GPIO output level:有low和high兩種選擇,一般選擇low,

1.8建立專案,在Project Manager–Project下,輸入專案名稱和專案地址(不要有中文路徑!!不然可能會出錯),在Toolchain/IDE選擇MDK-ARM,

1.9點擊code generate,選擇生成初始化.c/.h檔案,

1.10點擊generate code生成代碼并打開檔案,


2.main.c
打開main.c,在while回圈中加入亮燈熄燈代碼,STM32CubeMX生成的工程中添加代碼要在 /* USER CODE BEGIN /和/ USER CODE END*/之間添加代碼,這樣STM32CubeMX重新生成代碼時不會將自己添加的代碼洗掉掉,
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);//PA12熄燈
HAL_Delay(500);//延時0.5s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);//PA12亮燈
HAL_Delay(500);//延時0.5s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET);//PB1熄燈
HAL_Delay(500);//延時0.5s
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);//PB1亮燈
HAL_Delay(500);//延時0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄燈
HAL_Delay(500);//延時0.5s
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮燈
HAL_Delay(500);//延時0.5s

編譯并生成hex檔案


程式檔案選擇剛剛生成的hex檔案
接線與上篇博客相同,再次就不贅述了,但是需要強調的是,燈的負極接地時,要把線接在LED燈所處的那5組孔內,不然燈就不會亮,
3.實驗效果

四.USART串口通訊程式
1.新建工程

匯編代碼不需要勾選Startup和CORE

添加源檔案
2.匯編代碼
;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, #'o'
bl send_a_char
mov r0, #'r'
bl send_a_char
mov r0, #'l'
bl send_a_char
mov r0, #'d'
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填充,來使當前位置與一個指定的邊界對齊
END
勾選生成hex檔案!

編譯檔案


3.燒錄
在boot0為1情況下燒錄,然后將boot0置為0,然后斷電再通電,開串口除錯助手,打開剛剛生成的hex檔案,再點擊發送檔案,埠號改為
,波特率默認是115200,點擊打開串口即可接收到hello world.

五.用keil觀察時序波形
1 .環境設定
1.1選擇外部晶振,設定為8.0

1.2設定除錯的引數,
1.3進入除錯模式,打開邏輯分析功能,點擊setup,創建引腳,設定引腳名稱和展示資料型別為bit,


1.4運行程式

2.觀測三個GPIO埠的輸出波形


根據波形圖來看,波形反映的時序狀態正確,三個引腳的高電平以周期為0.5s的交替出現,從而實作流水燈的閃爍,
3.串口輸出波形
3.1環境配置和前面步驟相同,在創建引腳時不同,

3.2運行程式觀測波形
根據波形圖可得出燒錄的hello world程式的周期為0.5s,每隔0.5s改變高低電平,波形反映的時序狀態正確,
六.總結
這是第一次使用STMCubeMX,這個設定好芯片引腳等后,就可以自動生成部分代碼,減少了我們手動寫代碼的時間準確度也高,然后途中遇到的問題主要就是路徑問題,以后最好保存檔案等都不要含有中文,容易報錯,
參考文獻:
基于stm32CubeMX(Hal庫)的stm32串口通信_Laul Ken-Yi的博客-CSDN博客STM32CubeMX環境搭建及使用_星&&河的博客-CSDN博客搭建STM32開發環境——STM32CubeMX,Keil5_Harriet的博客-CSDN博客stm32之串口通信_星&&河的博客-CSDN博客搭建STM32開發環境——STM32CubeMX,Keil5_Harriet的博客-CSDN博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336308.html
標籤:其他

