第一章 計算機體系結構(了解)
后續在板子上開發的時候,需要考慮是否有操作系統?
- 方式一:有操作系統,通過c庫通過os api操作硬件
- 方式二:無操作系統,?通過c庫通過固件庫操作硬件
第二章 STM32開發板概述
板子/開發板:pcb版,把眾多元器件集中到一個板子上面管理
1. 基礎概念
????????Cortex-M系列是ARM針對微控制器應用推出的內核,STM32系列芯片是STMicroelectronics(意法半導體)公司推出的32位ARM Cortex-M微控制器系列產品
????????STM32系列芯片基于ARM Cortex-M內核,包括Cortex-M0、M0+、M3、M4和M7等多種類型。這些內核提供了不同的性能級別,以滿足從低功耗設備到高性能應用的各種需求
2.?產品分類
STM32F0系列
-
定位:入門級微控制器,適合初學者和簡單嵌入式應用。
-
性能:基于ARM Cortex-M0內核,主頻范圍為20-64MHz,提供實時性能和低功耗。
-
應用場景:家居自動化、小型設備控制等。
STM32F1系列
-
定位:經典中堅力量,廣泛應用的系列。
-
性能:采用Cortex-M3內核,主頻可達72MHz,性能穩定。
-
應用場景:消費電子、小型設備等。
STM32F2系列
-
定位:高性能與低功耗的結合。
-
性能:基于Cortex-M3內核,主頻高達120MHz,平衡了高性能和低功耗。
-
應用場景:通信設備、物聯網設備等。
STM32F3系列
-
定位:高度集成數字模擬功能。
-
性能:搭載Cortex-M4內核,最高主頻可達72MHz,具有豐富的數字模擬外設資源。
-
應用場景:電源管理、電機控制等需要高度集成模擬功能的應用。
STM32F4系列
-
定位:高性能數字信號處理之選。
-
性能:基于Cortex-M4內核,主頻可高達180MHz,具備硬件浮點單元(FPU),支持DSP指令集,適合處理復雜數字信號和高速數據流。
-
應用場景:航空航天、工業自動化等。
STM32F7系列
-
定位:引領行業新標準。
-
性能:采用Cortex-M7內核,最高主頻達到216MHz,具備高級的緩存架構和雙精度浮點單元(FPU)。
-
應用場景:高性能圖形顯示、多媒體處理等領域。
STM32H7系列
-
定位:頂級性能系列。
-
性能:基于Cortex-M7內核,最高主頻可達480MHz,是STM32家族中性能最高的系列。具備豐富的存儲資源和高速接口。
-
應用場景:運行復雜的實時操作系統(RTOS)和高級圖形界面。
3.?STM32芯片命名與規則
? ? ? ? 比如等下會介紹的:STM32F103C8T6
?4.?嵌入式操作系統
4.1?為什么需要操作系統
????????有的嵌入式系統沒有操作系統。只能調用芯片產品提供一下私有庫文件來操作。
????????優點:性能高, 缺點:通用性非常差。
有操作系統,就有操作系統封裝了硬件的不一致。 只需要調用操作系統的api就OK了
4.2 嵌入式操作系統的分類????????
手機平臺: android,ios,鴻蒙等
其他平臺:
- rtos(實時操作系統): freertos,rtthread,uccos,qnx等 芯片不是很強
- 通用性: 嵌入式linux(經過裁剪),鴻蒙
5.?外設與硬件接口
5.1?常見的外設
傳感器 ?執行器?顯示屏?通信接口 ?存儲設備 ?輸入設備 ?音頻設備 ?ADC/DAC
ADC/DAC:模擬數字轉換器(ADC)和數字模擬轉換器(DAC)在模擬和數字信號之間進行轉換,這在嵌入式系統中非常有用,特別是當需要處理模擬信號時
5.2?芯片的硬件接口
????????嵌入式系統中的硬件接口是連接微控制器或其他處理器與外部設備的橋梁,它們允許數據和控制信號的傳輸
?通信的概念
- 通信指的是CPU和外部設備之間或者計算機與計算機之間的數據交互 ?
通信的種類 ?
并行通信
- 傳輸原理:數據各個位同時進行傳輸(以字節或字節的倍數進行傳輸)
- 優點:傳輸速度快
- 缺點:占用引腳資源、傳輸成本高、傳輸距離近、抗干擾能力弱(串擾)
- 應用領域:一般大量數據傳輸,并且傳輸距離較近 如計算機總線
串行通信
- 傳輸原理:數據按位依次順序傳輸(每一位都占據固定的時間長度)
- 優點:節約引腳資源(最少一根線)、傳輸成本低、傳輸距離遠
- 缺點:傳輸速度慢
- 應用領域:一般用于工控設備、測量設備、少部分通信設備 USB COM
?第三章?STM32F103C8T6開發板認識
1.?核心參數
STM32F103C8T6是一款基于ARM Cortex-M3 內核STM32系列的32位的微控制器,程序存儲器容量是64KB,需要電壓2V~3.6V,工作溫度為-40°C ~ 85°C。
STM32F103C8T6芯片的基本參數:
- 類別:集成電路(IC);
- 家族:嵌入式-微控制器;
- 總線寬度:32-位;
- 速度:72MHz;
- 外圍設備:DMA,電機控制PWM,PWM,溫度傳感器;
- 輸入/輸出數:37;
- 程序存儲器容量:64KB (64K x 8);
- 程序存儲器類型:FLASH;
- RAM容量:20K x 8;
- 電壓-電源(Vcc/Vdd):2 V ~ 3.6 V;
- 模數轉換器:A/D 10x12b;
- 振蕩器型:內部;
- 工作溫度:-40°C ~ 85°C;
- 封裝/外殼:48-LQFP。
?2. 安裝驅動
判斷安裝完成 ?
3.?普中 STM32F103C8T6啟動方式
STM32三種啟動模式對應的存儲介質均是芯片內置的,它們是:
- 用戶閃存=芯片內置的Flash。
- SRAM=芯片內置的RAM區,就是內存啦。
- 系統存儲器=芯片內部一塊特定的區域,芯片出廠時在這個區域預置了一段Bootloader,就是通常說的ISP程序。這個區域的內容在芯片出廠后沒有人能夠修改或擦除,即它是一個ROM區。
?BOOT1=xBOOT0=0從用戶閃存啟動,這是正常的工作模式
BOOT1=0BOOT0=1從系統存儲器啟動,這種模式啟動的程序功能由廠家設置。 BOOT1=1BOOT0=1從內置SRAM啟動,這種模式可以用于調試
第四章 環境搭建
? ? ? ? 之后我們就要在這個STM32F103C8T6開發板,燒錄程序,就需要先搭建各種環境
1.?KEIL5 軟件安裝
?
?
2.?安裝 STM32 芯片包
3. 破解KEIL5 軟件?
KEIL5 安裝到這里電腦桌面上會有一個快捷方式,如下所示: 首先以管理員模式打開 KEIL5 軟件
?
- 之后再把得到的序列號,拷貝回去就可以了?
?4.?固件庫的使用
STM32的開發方式有三種:寄存器開發 + 函數庫開發 + 圖形界面開發
????????寄存器開發: STM32屬于32位的MCU,STM32內部的資源十分豐富,就導致寄存器的數量和復雜度都增大了,就要求開發人員對底層的知識掌握的非常扎實。
????????函數庫開發:相比于寄存器開發,使用庫函數開發的程序的運行效率稍微低一些,大概低10%~15%左右,但是對于一些實時性要求不高的產品來說,可以忽略不計。ST公司針對STM32開發了兩套庫(標準外設庫 + HAL庫),國內大多數的公司還是在采用標準外設庫開發(更穩定、資料更多、容易維護)。
????????圖形界面開發:圖形界面開發使用了STM32CubeMX工具
我們學習的事主流的開發方式,使用標準固件庫,也就是函數庫開發
4.1 CMSIS 標準
????????什 么 是 CMSIS 標 準 ? CMSIS 標 準 英 文 全 稱 是 Cortex MicroControllerSoftware Interface Standard,翻譯為中文意思就是ARM Cortex 微控制器軟件接口標準。由于基于 Cortex 核的芯片廠商很多,不只是ST 公司,為了解決不同廠家的 Cortex 核芯片軟件兼容的問題,ARM 和這些廠家就建立了這套CMSIS標準。
????????我們可以通過一個基于 CMSIS 標準的應用程序框圖來看其重要性。如下圖所示:
?4.2 建立模塊工程
step1:?創建模版工程存放路徑
step2: 建立三個文件夾(User、Lib、Obj) ?
Obj 文件夾:用于存放編譯產生的 c/匯編/鏈接的列表清單、調試信息、hex文件、預覽信息、封裝庫等文件。
User 文件夾:用于存放用戶編寫的 main.c、stm32f10x.h 頭文件、stm32f10x_conf.h配置文件、stm32f10x_it.c和stm32f10x_it.h中斷函數文件。
Lib 文件夾:用于存放 CMSIS 標準和 STM32 外設驅動文件
step3:?建立自己原始的Lib文件庫?
?
- 注意:startup_stm32f10x_md.s根據我們使用芯片來決定(c8t6屬于中等容量,所以使用_md.s) ?
step4: User: 根據固件庫的模板添加?
4.3 創建工程
4.4?配置工程文件夾
使用工程管理圖標(Manager Project Items)添加文件夾,添加文件 ?
說明一下:
- User下面添加Main.c入口程序,以及中斷文件stm32f10x_it.c,后面還可以添加我們的功能性文件;
- Startup添加啟動文件,startup_stm32f10x_md.s,(找不到可能是因為文件類型)
- StdPeriph_Driver標準庫外設驅動文件,一般先添加常用的外設驅動文件(gpio常用外設、rcc時鐘相關文件)
- CMSIS添加兩個內核文件
4.5?工程參數設置
4.6 啟動測試
- 走到這里就表示都配置完了,之后使用就通過每次的
5. 燒錄程序到板子上
開始燒錄程序
說明一下:?
- 這個TestLED.hex是一個控制這個板子上燈的程序
- 這一排燈會從左向右的,依次閃爍
說明一下:
- ?st-lib.hex 就是我們剛才寫的生成,什么都沒做,就是一個死循環
- 由于重新燒錄了一遍,所以原來的那個燈又被覆蓋了
?第五章 第一個LED燈- D2(重點)
1. 找到物理位置
2. 找到電路位置
? ? ? ? 剛才我們已經看到了LED燈的物理位置,且這個版在核心版上叫D2, 接下來就是要看一下核心版的原理圖
?說明一下:
- 在原理圖中D2的左邊有個電阻和一個VCC3.3,這個VCC3.3表示電源為3.3V的正電壓
- 而想要一個元件通電,就必須要有電流通過這個元件,而電流的形成又需要通過電勢差,電勢差又需要從高電壓到低電壓,
- 簡單來說,PC13這根必須表示為負電壓(說人話是這樣的)
- 專業一定是讓這個芯片給PC13引腳輸出一個信號,然后讓它形成低電壓
3.?STM32 芯片的 GPIO
????????在 STM32 芯片中,GPIO 是 General Purpose Input/Output 的縮寫,中文叫做“通用輸入輸出口”。它是 STM32 微控制器上用來與外部設備(如按鈕、LED、傳感器、繼電器等)進行通信的基本接口之一?
4.?PC13引腳
PC13 是 STM32 微控制器中端口 C 的第 13 號 GPIO 引腳,常用于控制板載 LED
引腳是微控制器(如 STM32)與外部世界進行電氣連接的金屬腳位,用于輸入輸出信號?
在 STM32 微控制器中,所有的 GPIO 引腳都有一個命名規則,比如:
-
P 代表 Port(端口)
-
C 是端口的字母名(Port C)
-
13 是該端口上的第 13 個引腳
????????所以,PC13 就是 端口 C 的第 13 個引腳。
????????STM32 通常有多個 GPIO 端口(A、B、C、D 等),每個端口包含若干個引腳,比如 PA0、PB5、PC13 等。
? ? ? ? 對了我這個STM32F103C8T6是有48組引腳
5.? step1:給APB2 GPIO C進行時鐘使能
5.1?時鐘使能
????????時鐘使能就是給某個外設通電并啟動它的工作時鐘,讓它能正常運行。
在 STM32 中,比如你要用 GPIOC,就必須先“時鐘使能”,也就是打開 GPIOC 的時鐘,不然它就不會工作
- STM32 的時鐘來自內部振蕩器或外部晶振,經過 RCC 分配,你必須手動“打開”才能讓外設工作
5.2?GPIO C - PC
GPIOC 是一個端口,PC13 是它的一個引腳(第13號)?
簡單對比:
-
GPIOC:表示整個 C 端口,包括 PC0 ~ PC15 共 16 個引腳。
-
PC13:是 GPIOC 中的第 13 個引腳,是 GPIOC 的一部分。
5.3 APB2
? ? ? ? 要說這個東西,又要看參考手冊中的系統架構 ,去看看內部的線路是怎么走的
- APB2 是 STM32 芯片內部的一個外設總線,GPIOC 就掛載在這條總線上。
詳細但簡潔地說:
STM32 內部有多個總線(像交通道路),負責把時鐘和數據傳給各個外設,常見的有:
總線名 | 全稱 | 掛載的外設 |
---|---|---|
AHB | Advanced High Bus | 內存、DMA、FSMC 等 |
APB1 | Advanced Peripheral Bus 1 | 比如 USART2、TIM2、I2C1 等 |
APB2 | Advanced Peripheral Bus 2 | GPIOA/B/C、AFIO、USART1、ADC1等 |
5.4 參考手冊6.2?RCC寄存器描述
? ? ? ? 我這個板子是STM32,32就是32個bit位,每一個bit位的功能都不一樣,
說明一下:?
- 保留的意思是這個bit位還沒有用(這里是始終為0),也就是0,不啟動
- 如果要開啟某個功能,就設置為1?
每個bit位的功能?
5.5 參考手冊 6.3.4 APB2 外設復位寄存器 (RCC_APB2RSTR)
? ? ? ? ?首先明確目標:我們在這一步要做的是開啟APB2 GPIOC的時鐘使能
????????這個IOPCRST就是GPIOC,把這個bit位打開了,就是把PC那個一堆引腳都打開了,其中自然就有PC13
? ? ? ? ?所以接下來我們把這個寄存器中的第四個bit位置成1就可以了,也就是0....10000(二進制) = 16(十進制) , 這時我們就得到了一個關鍵數字16
? ? ? ? ?接下來就需要思考,這個16給誰能,換句話說16給那個地址呢
5.6 參考手冊?2.3 存儲器映像
? ? ? ? 所有寄存器的起始地址如下:
?
起始地址?
? ? ? ? 而我們想要的其實是這個:AHB總線上的-> 復位和時鐘控制(RCC) -> 0x4002 1000
5.6 參考手冊6.3.11 RCC寄存器地址映像
偏移量
說明一下?
- ?IOPCEN就是GPIOC,GPIOC其中就有PC13
- 這時,我們就得到了一個重要數字018h,也就是0x18(十六進制)
5.7 最終代碼
????????此時我們有了寄存器起始地址(0x4002 1000),寄存器偏移量(0x18),還有個值(16),則最終代碼如下:
//1.給APB2 GPIO C進行時鐘使能
*(uint32_t *)(0x40021000+0x18)=16;
6. step2 : 找GPIOC 第13個引腳 輸出一個低電平
6.1 參考手冊 8.1 GPIO功能描述
? ? ? ? 我們需要思考GPIOC的第13根線,怎么工作,也就是選擇那個工作模式?
要考慮的東西有點多,直接說結論: 選擇推挽輸出
?6.2 推挽輸出模式
簡單來說:就是輸入輸出模式
說明一下:?
- ?VDD是正,VSS是負
- 當我們給輸出控制為1時,表示接通VDD,此時里面為正,外面為負,電流從內到外,推模式
- 當我們給輸出控制為0時,表示接通VSS,此時里面為負,外面為正,電流從外到內,挽模式
6.3?參考手冊 8.2.2 端口配置高寄存器(GPIOx_CRH) (x=A..E)
?????????每個端口配置需要用4個bit位,但要16根線,一共需要64位,則STM32中的32bit位是不夠的,其實端口配置是分了低寄存器,和高寄存器的,每個8根線
? ? ? ? ?其實這里是有2個寄存器的,但我們這里就只看高寄存器,也就是后面8根線
為什么用4個bit為才能搞定這件事呢??
?
說明一下:
- 后2個bit位標識MODE8[1:0],也就是0和1的組合
- 前2個bit為標識CNFy[1:0]?,也是0和1的組合
- 當我們將第是三根線上的MODEy[1:0]設置為11時,表示最大速率wei50MHZ的輸出模式
- 而我們選擇的工作模式是推挽輸出模式,且此時的MODEy[1:0]>00,則CNFy[1:0]為00
則這個寄存器中的二進制為 0000 0000 0011 0000?0000 0000 0000 0000 也就是
這時我們得到了一個數字0x300000(十六進制)
?6.4?參考手冊?2.3 存儲器映像
? ? ? ? 在這一步中,我們也需要到GPIOC的起始地址,偏移量,然后才能把剛才那個數字存到寄存器中
?起始地址
?
- 此時我們得到了GPIOC的起始地址為0x4001 1000?
?偏移量
- 通過查詢手冊,我們可發現這個寄存器的偏移地址為0x04?
6.5 最終代碼?
?????????此時我們有了寄存器起始地址(0x4001 1000),寄存器偏移量(0x04?),還有個值(0x300000),則最終代碼如下:
//2. 設置模式-推挽輸出模式 50mhz
*(uint32_t *)(0x40011000+0x04)=0x300000;
7. step3: 給PC13輸出一個低電平
? ? ? ? 簡單來說:就是找到對應的端口13引腳 賦值為0 低電平
7.1 參考手冊?8.5 GPIO 和AFIO寄存器地址映象
? ? ? ? 每一組引腳有16根線,GPIOA有16根線,GPIOB有16根線,所以一組數據用不到高16位,則保留
說明一下:
- ?我們要做的就是讓PC這個根線上的第13位設置為0,其他為1
? ? ? ? 所以:我們要讓PC13輸出一個低電平,就是給它一個值為0xDFFF
ODR的偏移量?
- 通過查詢手冊發現這個偏移量為0x0c?
?ODR的起始地址
- 這個寄存器的起始地址和上面那個相同都是0x4001 1000,就只是偏移量不同?
7.2 最終代碼
?????????此時我們有了寄存器起始地址(0x4001 1000),寄存器偏移量(0x0C?),還有個值(0xDFFF),則最終代碼如下:
//3.給PC13輸出一個低電平
*(uint32_t *)(0x40011000+0x0C)=0xDFFF;
8. 完整代碼
#include "stm32f10x.h"
#include "led.h"
int main()
{//1.給APB2 GPIO C進行時鐘使能*(uint32_t *)(0x40021000+0x18)=16;//2. 設置模式-推挽輸出模式 50mhz*(uint32_t *)(0x40011000+0x04)=0x300000;//3.給PC13輸出一個低電平*(uint32_t *)(0x40011000+0x0C)=0xDFFF;while(1){}return 0;
}