1 STM32 基礎知識綜述#
1.1 STM32 簡介#
STM32 是 ST 公司基於 ARM Cortex-M 內核開發的 32 位微控制器
M
是Microcontroller
的意思
STM32 常應用在嵌入式領域,如智能車、無人機、機器人、無線通信、物聯網、工業控制、娛樂電子產品等
STM32 功能強大、性能優異、片上資源豐富、功耗低,是一款經典的嵌入式微控制器
1.2 ARM 簡介#
ARM 既指 ARM 公司,也指 ARM 處理器內核
ARM 公司是全球領先的半導體知識產權(IP)提供商,全世界超過 95% 的智能手機和平板電腦都採用 ARM 架構
ARM 公司設計 ARM 內核,半導體廠商完善內核周邊電路並生產芯片
1.3 STM32F103C8T6 簡介#
系列:主流系列 STM32F1
內核:ARM Cortex-M3
主頻:72MHz
RAM:20K(SRAM)
ROM:64K(Flash)
供電:2.0~3.6V(標準 3.3V)
封裝:LQFP48
1.4 片上資源 / 外設 (Peripheral)#
STM32 可以加入操作系統,例如 FreeRTOS、UCOS 等,如果使用了這些操作系統則需要SysTick
提供定時來進行任務切換功能。
UART
是異步串口的意思,而STM32
的USART
既支持異步串口也支持同步串口,異步串口使用相對較多
英文縮寫 | 名稱 | 英文縮寫 | 名稱 |
---|---|---|---|
NVIC | 嵌套向量中斷控制器 | CAN | CAN 通信 |
SysTick | 系統滴答定時器 | USB | USB 通信 |
RCC | 復位和時鐘控制 | RTC | 實時鐘 |
GPIO | 通用 IO 口 | CRC | CRC 校驗 |
AFIO | 復用 IO 口 | PWR | 電源控制 |
EXTI | 外部中斷 | BKP | 備份寄存器 |
TIM | 定時器 | IWDG | 獨立看門狗 |
ADC | 模數轉換器 | WWDG | 窗口看門狗 |
DMA | 直接內存訪問 | DAC | 數模轉換器 |
USART | 同步 / 異步串口通信 | SDIO | SD 卡接口 |
I2C | I2C 通信 | FSMC | 可變靜態存儲控制器 |
SPI | SPI 通信 | USB OTG | USB 主機接口 |
1.5 芯片命名規範#
1.6 系統結構#
Cortex-M3
內核引出三條總線,ICode
指令總線,DCode
數據總線,System
系統總線
ICode
總線和DCode
總線主要是用來連接Flash
閃存的
Flash
裡面存儲的是我們編寫的程序
ICode
指令總線用來加載程序指令
DCode
數據總線用來加載數據,例如常量和調試數據等
System
系統總線連接到SRAM
,FSMC
SRAM
用於存儲程序運行時的變量數據
AHB
系統總線用於掛載主要的外設,AHB 的意思是先進高性能總線,掛載的一般是最基本的或者性能比較高的外設,例如復位和時鐘控制這些最基本的電路,還有SDIO
也是掛載在AHB
上的
APB1
APB2
兩個外設總線,APB
的意思是先進外設總線,用於連接一般的外設,
因為AHB
和APB
的總線協議,總線速度,數據傳送格式的差異,所以中間需要加兩個橋接來完成數據的轉換和緩存,AHB
的整體性能比APB
高一些,其中APB2
的性能又比APB1
的性能高一些,APB2
一般和AHB
同頻率,都是 72MHz,APB1
一般是 36MHz, 所以APB2
連接的一般都是外設中稍微重要的部分,如GPIO
端口還有一些外設的 1 號選手 (USART1
,SPI1
,TIM1
,TIM8
等),TIM8
和TIM1
一樣也是高級定時器,所以也是重要的外設,ADC
,EXTI
,AFIO
也是接在APB2
上面的;其他的像 2,3,4,5 號外設,DAC、PWR、BPK 等次要一點的外設都會分配到APB1
上去;當然在使用時,個人一般感覺不到APB2
和APB1
的性能差異,只需要知道這個外設是掛載到哪個總線上的就可以了
DMA
可以當做內核 CPU 的小秘書,比如大量數據搬運的活,讓 CPU 來幹就太浪費時間了,DMA
主要幹這些簡單且反復要幹的事情,DMA
通過DMA
總線連接到總線矩陣上,他擁有和 CPU 一樣的總線控制權,用於訪問這些外設,當需要DMA
搬運數據時,外設就會通過請求線發送DMA
請求,DMA
就會獲得總線控制權,訪問並轉運數據,整個過程不需要 CPU 的參與,省下了 CPU 的時間用來幹其他的事情
1.7 引腳定義#
紅色的是電源相關的引腳
藍色的是最小系統相關的引腳
綠色的是 IO 口、功能口這些引腳
S
類型代表電源
I
類型代表輸入
O
類型代表輸出
IO
類型代表輸入輸出
FT
代表這個引腳能容忍5V
的電壓,沒有FT
的只能容忍3.3V
的電壓
STM32
內部採用分區供電的方式,供電口較多,使用時VSS
都接GND
,VDD
都接3.3V
STM32
支持SWD
和JTAG
兩種調試方式
SWD
需要兩根線,分別是SWDIO
和SWCLK
JTAG
需要 5 根線,分別是JTMS
,JTCK
,JTDI
,JTDO
,NJTRST
STLINK
使用的是SWD
的方式下載調試程序,所以只需要佔用PA13
和PA14
這兩個IO
口
使用SWD
方式下載時,PA15
PB3
PB4
可以切換為普通IO
口來使用,但是需要在程序中進行配置,不配置的話默認是不會用作 IO 口的
引腳號 | 引腳名稱 | 引腳定義 | 主功能 |
---|---|---|---|
1 | VBAT | 备用电池供电引脚,此引脚可外接一个 3V 电池,当系统电源断电时,备用电池可以给内部的 RTC 时钟和备份寄存器提供电源 | VBAT |
2 | PC13-TAMPER-RTC | I/O 口或侵入检测或 RTC,IO 口可以根据程序输出或读取高低电平,侵入检测可以用来做安全保障的功能,RTC 可以用来输出 RTC 校准时钟、RTC 闹钟脉冲或秒脉冲 | PC13 |
3、4 | PC14-OSC32_IN/PC15-OSC32_OUT | IO 口或者接 32.768KHz 的 RTC 晶振 | PC14/PC15 |
5、6 | OSC_IN/OSC_OUT | 接系统的主晶振,一般是 8MHz,芯片内部有锁相环电路,可以对这个 8MHz 的频率进行倍频,最终产生 72MHz 的频率作为系统的主时钟 | OSC_IN/OSC_OUT |
7 | NRST | 系统复位引脚,N 表示低电平复位 | NRST |
8,9 | VSSA/VDDA | 内部模拟部分的电源,如 ADC、RC 振荡器等;VSS 是负极接是 GND,VDD 是正极接 3.3V | VSSA/VDDA |
10 | PA0-WKUP | IO 口兼具 WKUP 功能,可以唤醒处于待机模式的 STM32 | PA0 |
11-19 | PA1、PA2、PA3、PA4、PA5、PA6、PA7、PB0、PB1 | IO 口 | PA1-PB1 |
20 | PB2 | IO 口或 BOOT1 引脚,BOOT 引脚用来配置启动模式 | PB2/BOOT1 |
21,22 | PB10、PB11 | IO 口 | PB10,PB11 |
23,24 | VSS_1/VDD_1 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_1/VDD_1 |
25-33 | PB12、PB13、PB14、PB15、PA8、PA9、PA10、PA11、PA12 | IO 口 | PB12、PB13、PB14、PB15、PA8、PA9、PA10、PA11、PA12 |
34 | PA13 | IO 口或调试端口 | JTMS/SWDIO |
35,36 | VSS_2/VDD_2 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_2/VDD_2 |
37-40 | PA14/PA15/PB3/PB4 | IO 口或调试端口 (用来调试和下载程序) | JTCK_SWCLK/JTDI/JTDO/NJTRST |
41-43 | PB5/PB6/PB7 | IO 口 | PB5/PB6/PB7 |
44 | BOOT0 | 与 BOOT1 一样也是用来做启动配置的 | BOOT0 |
45,46 | PB8/PB9 | IO 口 | PB8/PB9 |
47,48 | VSS_3/VDD_3 | 系统主电源口,VSS 是负极,VDD 是正极 | VSS_3/VDD_3 |
1.8 啟動配置#
啟動配置的作用是指定程序開始運行的位置,一般情況下程序都是在 Flash 程序存儲器開始執行,但是在某些情況下我們也可以讓程序在別的地方開始執行,用來完成特殊的功能
BOOT1
=0 BOOT0
=1 模式用來做串口下載,系統存儲器存的就是STM32
中的一段BootLoader
程序,BootLoader
程序的作用就是接收串口的數據然後刷新到主閃存中,這樣就可以使用串口下載程序了,一般我們需要串口下載程序的時候會配置到這個模式上
BOOT0
=0 啟動模式為主閃存存儲器的模式,主閃存存儲器被選為啟動區域,此時正常執行 Flash 閃存裡面的程序,這個模式是最常用的模式,一般情況下都是這個配置
BOOT1
=1 BOOT0
=1 配置的是SRAM
啟動,這個模式主要用於程序調試,現階段使用較少
BOOT
引腳的值是在上電復位的一瞬間有效的,之後就隨意了
1.9 最小系統電路#
OSC32
是 32.768KHz 晶振的意思,32768 是 2 的 15 次方,內部 RTC 電路經過 2 點 15 次方分頻就可以生成 1s 的時間信號了,
RTC
晶振是 32.768KHz 晶振