GPIO:通用I/O引腳
總引腳數(shù)176個(gè)
I/O引腳144個(gè)
144/16=9組
A組-I組
A組:A0-A15
---------------------------------------------------------------
保護(hù)二極管鉗衛(wèi)作用旬陡,防止電壓過高
復(fù)位0叉寂,置位1
---------------------------------------------------------------
CMOS? ? H高電平2.4V-3.3V? ? L高電平0V-0.7V
施密特觸發(fā)器快速改變電平(2.4V-3.3V)
VSS電源荆隘,VDD接地
---------------------------------------------------------------
MOS管電壓型控制器件
輸入:模擬輸入碗暗;復(fù)用(GPIO->串口)
輸出:推挽(加快高低電平切換)姊舵;開漏(自身截止勤揩,不能輸出高電平帝火,外部上拉電阻提供高電平)
高阻態(tài)介于高低電平之間
內(nèi)部上/下拉電阻改變高低電平
---------------------------------------------------------------
復(fù)位信號(hào)? ? 0x00000000-0xFFFFFFFF(4G) 全0程序從頭開始運(yùn)行
PC程序寄存器? ? 硬件交互數(shù)據(jù)(寄存器之間交互)
---------------------------------------------------------------
.c-.exe
1.預(yù)處理
{
將.h內(nèi)所有內(nèi)容復(fù)制到.c
宏展開
別名替換
枚舉替換等
}
2.編譯
.c-.s(匯編語言)? ? 每一個(gè).c文件對(duì)應(yīng)生成.s文件
3.匯編
將.s文件生成.o文件(目標(biāo)文件)變成機(jī)器語言
每一個(gè).s生成一個(gè).o
4.鏈接
多個(gè).o文件生成.exe(windows).elf(linux).bin/.hex可執(zhí)行文件(燒寫flash)
只抽取使用的函數(shù)庫函數(shù)對(duì)大小沒有影響
---------------------------------------------------------------
可執(zhí)行文件構(gòu)成
.code代碼段? ? 判斷痕貌,循環(huán)等轉(zhuǎn)換成ARM指令
.data數(shù)據(jù)段? ? 全局變量风罩,地址,靜態(tài)變量舵稠,常量
.bss可優(yōu)化? ? 沒有被使用的數(shù)據(jù)
-O0-O3優(yōu)化等級(jí)越來越高
---------------------------------------------------------------
可執(zhí)行文件燒寫到內(nèi)部flash
兩個(gè)儲(chǔ)存器flash(1M)超升,SRAM(256K)
0地址創(chuàng)建棧空間和堆空間
棽富玻空間放局部變量室琢,函數(shù)內(nèi)申請(qǐng)空間
堆空間malloc申請(qǐng)空間
stack size棧大小
_initial sp????按復(fù)位鍵? ? 棧指針
---------------------------------------------------------------
Enable使能
disable失能
SystemInit啟動(dòng)外部時(shí)鐘源
__main微庫
用寄存器方式實(shí)現(xiàn)硬件控制
程序編寫流程:
1.硬件初始化
(a)時(shí)鐘源打開
通過RCC打開GPIOH的時(shí)鐘源
RCC首地址0x40023800
RCC_AHB1ENR----0x100080偏移0x30
(b)外設(shè)初始化
GPIOH首地址0x40021C00
PH10
輸出GPIOH_MODER----0x100000????偏移0x00
推挽GPIOH_OTYPER----0x00000000推挽? ? 偏移0x04
上拉GPIOH_PUPDR----0x100000? ? 偏移0x0C
低速GPIOH_OSPEEDR----0x00000000? ? 偏移0x08
2.硬件控制
高低電平輸出
GPIOH_ODR----偏移0x14
H----0x400
L----0x00000000