GPIO 主要特性
● 受控I/O 多達16 個
● 輸出狀態(tài):推挽或開漏+ 上拉/下拉
● 從輸出數(shù)據(jù)寄存器(GPIOx_ODR) 或外設(shè)(復(fù)用功能輸出)輸出數(shù)據(jù)
● 可為每個I/O 選擇不同的速度
● 輸入狀態(tài):浮空、上拉/下拉棋枕、模擬
● 將數(shù)據(jù)輸入到輸入數(shù)據(jù)寄存器(GPIOx_IDR) 或外設(shè)(復(fù)用功能輸入)
● 置位和復(fù)位寄存器(GPIOx_BSRR)悦陋,對GPIOx_ODR 具有按位寫權(quán)限
● 鎖定機制(GPIOx_LCKR),可凍結(jié)I/O 配置
● 模擬功能
● 復(fù)用功能輸入/輸出選擇寄存器(一個I/O 最多可具有16 個復(fù)用功能)
● 快速翻轉(zhuǎn)柴我,每次翻轉(zhuǎn)最快只需要兩個時鐘周期
● 引腳復(fù)用非常靈活,允許將I/O 引腳用作GPIO 或多種外設(shè)功能中的一種
GPIO 8種工作模式(gpio_init.GPIO_Mode)
(1) GPIO_Mode_AIN 模擬輸入
(2) GPIO_Mode_IN_FLOATING 浮空輸入
(3) GPIO_Mode_IPD 下拉輸入
(4) GPIO_Mode_IPU 上拉輸入
(5) GPIO_Mode_Out_OD 開漏輸出
(6) GPIO_Mode_Out_PP 推挽輸出
(7) GPIO_Mode_AF_OD 復(fù)用開漏輸出
(8) GPIO_Mode_AF_PP 復(fù)用推挽輸出
GPIO 寄存器
每組IO口含下面7個寄存器。也就是7個寄存器,一共可以控制一組GPIO的16個IO口盯桦。
GPIOx->CRL :端口配置低寄存器
GPIOx->CRH:端口配置高寄存器
GPIOx->IDR:端口輸入寄存器
GPIOx->ODR:端口輸出寄存器
GPIOx->BSRR:端口位設(shè)置/清除寄存器
GPIOx->BRR :端口位清除寄存器
GPIOx->LCKR:端口配置鎖存寄存器
其中主要寄存器: 輸出數(shù)據(jù)寄存器(GPIOx_ODR) ;輸入數(shù)據(jù)寄存器(GPIOx_IDR); 置位和復(fù)位寄存器(GPIOx_BSRR); GPIOx_MODER 寄存器用于選擇I/O 方向(輸入、輸出渤刃、AF拥峦、模擬); GPIOx_OTYPER 和GPIOx_OSPEEDR 寄存器分別用于選擇輸出類型(推挽或開漏)和速度
外設(shè)復(fù)用功能
對于ADC 和DAC,在GPIOx_MODER 寄存器中將所需I/O 配置為模擬通道
對于其它外設(shè):
— 在GPIOx_MODER 寄存器中將所需I/O 配置為復(fù)用功能
置位復(fù)位寄存器(GPIOx_BSRR) 是一個32 位寄存器卖子,它允許應(yīng)用程序在輸出數(shù)據(jù)寄存器(GPIOx_ODR) 中對各個單獨的數(shù)據(jù)位執(zhí)行置位和復(fù)位操作
輸入配置
對I/O 端口進行編程作為輸入時:
● 輸出緩沖器被關(guān)閉
● 施密特觸發(fā)器輸入被打開
● 根據(jù)GPIOx_PUPDR 寄存器中的值決定是否打開上拉和下拉電阻
● 輸入數(shù)據(jù)寄存器每隔1 個AHB1 時鐘周期對I/O 引腳上的數(shù)據(jù)進行一次采樣
● 對輸入數(shù)據(jù)寄存器的讀訪問可獲取I/O 狀態(tài)
輸出配置
對I/O 端口進行編程作為輸出時:
● 輸出緩沖器被打開:
— 開漏模式:略号,輸出寄存器中的“0”可激活N-MOS而輸出寄存器中的“1”會使端
口保持高組態(tài)(Hi-Z)(P-MOS 始終不激活)。
— 推挽模式:輸出寄存器中的“0”可激活N-MOS洋闽,而輸出寄存器中的“1”可激活
P-MOS玄柠。
● 施密特觸發(fā)器輸入被打開
● 根據(jù)GPIOx_PUPDR 寄存器中的值決定是否打開弱上拉電阻和下拉電阻
● 輸入數(shù)據(jù)寄存器每隔1 個AHB1 時鐘周期對I/O 引腳上的數(shù)據(jù)進行一次采樣
● 對輸入數(shù)據(jù)寄存器的讀訪問可獲取I/O 狀態(tài)
● 對輸出數(shù)據(jù)寄存器的讀訪問可獲取最后的寫入值
復(fù)用功能配置
對I/O 端口進行編程作為復(fù)用功能時:
● 可將輸出緩沖器配置為開漏或推挽
● 輸出緩沖器由來自外設(shè)的信號驅(qū)動(發(fā)送器使能和數(shù)據(jù))
● 施密特觸發(fā)器輸入被打開
● 根據(jù)GPIOx_PUPDR 寄存器中的值決定是否打開弱上拉電阻和下拉電阻
● 輸入數(shù)據(jù)寄存器每隔1 個AHB1 時鐘周期對I/O 引腳上的數(shù)據(jù)進行一次采樣
● 對輸入數(shù)據(jù)寄存器的讀訪問可獲取I/O 狀態(tài)
模擬配置
對I/O 端口進行編程作為模擬配置時:
● 輸出緩沖器被禁止。
● 施密特觸發(fā)器輸入停用诫舅,I/O 引腳的每個模擬輸入的功耗變?yōu)榱阌鹄J┟芴赜|發(fā)器的輸出被
強制處理為恒定值(0)。
● 弱上拉和下拉電阻被關(guān)閉刊懈。
● 對輸入數(shù)據(jù)寄存器的讀訪問值為“0”这弧。
這些位通過軟件寫入,用于配置I/O 輸出速度。
00:2 MHz(低速)
01:25 MHz(中速)
10:50 MHz(快速)
11:30 pF 時為100 MHz(高速)(15 pF 時為80 MHz 輸出(最大速度))
結(jié)構(gòu)體
DMA 簡介
直接存儲器訪問(DMA) 用于在外設(shè)與存儲器之間以及存儲器與存儲器之間提供高速數(shù)據(jù)傳輸痛垛⌒僬觯可以在無需任何CPU 操作的情況下通過DMA 快速移動數(shù)據(jù)。這樣節(jié)省的CPU 資源可供其它操作使用蛋辈。DMA 控制器基于復(fù)雜的總線矩陣架構(gòu)属拾,將功能強大的雙AHB 主總線架構(gòu)與獨立的FIFO 結(jié)合在一起,優(yōu)化了系統(tǒng)帶寬梯浪。兩個DMA 控制器總共有16 個數(shù)據(jù)流(每個控制器8 個)捌年,每一個DMA 控制器都用于管理一個或多個外設(shè)的存儲器訪問請求。每個數(shù)據(jù)流總共可以有多達8 個通道(或稱請求)挂洛。每個通道都有一個仲裁器礼预,用于處理DMA 請求間的優(yōu)先級
DMA 主要特性
DMA 主要特性是:
● 雙AHB 主總線架構(gòu),一個用于存儲器訪問虏劲,另一個用于外設(shè)訪問
● 僅支持32 位訪問的AHB 從編程接口
● 每個DMA 控制器有8 個數(shù)據(jù)流托酸,每個數(shù)據(jù)流有多達8 個通道(或稱請求)
● 每個數(shù)據(jù)流有單獨的4級32 位先進先出存儲器緩沖區(qū)(FIFO),可用于FIFO 模式或直接模式:
FIFO 模式:可通過軟件將閾值級別選取為FIFO 大小的1/4柒巫、1/2 或3/4
— 直接模式
每個DMA 請求會立即啟動對存儲器的傳輸励堡。當(dāng)在直接模式(禁止FIFO)下將DMA請求配置為以存儲器到外設(shè)模式傳輸數(shù)據(jù)時,DMA 僅會將一個數(shù)據(jù)從存儲器預(yù)加載到內(nèi)部FIFO堡掏,從而確保一旦外設(shè)觸發(fā)DMA 請求時則立即傳輸數(shù)據(jù).
● DMA 數(shù)據(jù)流請求之間的優(yōu)先級可用軟件編程(4 個級別:非常高应结、高、中泉唁、低)鹅龄,在軟件優(yōu)先級相同的情況下可以通過硬件決定優(yōu)先級(例如,請求0 的優(yōu)先級高于請求1)
● 每個數(shù)據(jù)流也支持通過軟件觸發(fā)存儲器到存儲器的傳輸(僅限D(zhuǎn)MA2 控制器)
● 要傳輸?shù)臄?shù)據(jù)項的數(shù)目可以由DMA 控制器或外設(shè)管理
— DMA 流控制器:要傳輸?shù)臄?shù)據(jù)項的數(shù)目是1 到65535亭畜,可用軟件編程
— 外設(shè)流控制器:要傳輸?shù)臄?shù)據(jù)項的數(shù)目未知并由源或目標(biāo)外設(shè)控制扮休,這些外設(shè)通過硬件發(fā)出傳輸結(jié)束的信號
● 獨立的源和目標(biāo)傳輸寬度(字節(jié)、半字拴鸵、字):源和目標(biāo)的數(shù)據(jù)寬度不相等時玷坠,DMA 自動封裝/解封必要的傳輸數(shù)據(jù)來優(yōu)化帶寬。這個特性僅在FIFO 模式下可用
DMA 控制器(DMA) RM0090
● 對源和目標(biāo)的增量或非增量尋址
● 支持4 個劲藐、8 個和16 個節(jié)拍的增量突發(fā)傳輸八堡。突發(fā)增量的大小可由軟件配置,通常等于外設(shè)FIFO 大小的一半
● 5 個事件標(biāo)志(DMA 半傳輸聘芜、DMA 傳輸完成兄渺、DMA 傳輸錯誤、DMA FIFO 錯誤厉膀、直接模式錯誤)溶耘,進行邏輯或運算二拐,從而產(chǎn)生每個數(shù)據(jù)流的單個中斷請求
DMA 功能說明
DMA 控制器提供兩個AHB 主端口:AHB 存儲器端口(用于連接存儲器)和AHB 外設(shè)端口(用于連接外設(shè))。但是凳兵,要執(zhí)行存儲器到存儲器的傳輸百新,AHB 外設(shè)端口必須也能訪問存儲器
仲裁器
一個DMA 控制器對應(yīng)8 個數(shù)據(jù)流,數(shù)據(jù)流包含要傳輸數(shù)據(jù)的源地址庐扫、目標(biāo)地址饭望、數(shù)據(jù)等等信息。如果我們需要同時使用同一個DMA 控制器(DMA1 或DMA2)多個外設(shè)請求時形庭,那必然需要同時使用多個數(shù)據(jù)流铅辞,那究竟哪一個數(shù)據(jù)流具有優(yōu)先傳輸?shù)臋?quán)利呢?這就需要仲裁器來管理判斷了萨醒。仲裁器管理數(shù)據(jù)流方法分為兩個階段斟珊。第一階段屬于軟件階段,我們在配置數(shù)據(jù)流時
可以通過寄存器設(shè)定它的優(yōu)先級別富纸,具體配置DMA_SxCR 寄存器PL[1:0]位囤踩,可以設(shè)置為非常高、高晓褪、中和低四個級別堵漱。第二階段屬于硬件階段,如果兩個或以上數(shù)據(jù)流軟件設(shè)置優(yōu)先級一樣涣仿,則他們優(yōu)先級取決于數(shù)據(jù)流編號勤庐,編號越低越具有優(yōu)先權(quán),比如數(shù)據(jù)流2 優(yōu)先級高于數(shù)據(jù)流3好港。
傳輸類型
DMA 傳輸類型有單次(Single)傳輸和突發(fā)(Burst)傳輸愉镰。突發(fā)傳輸就是用非常短時間結(jié)合非常高數(shù)據(jù)信號率傳輸數(shù)據(jù),相對正常傳輸速度媚狰,突發(fā)傳輸就是在傳輸階段把速度瞬間提高岛杀,實現(xiàn)高速傳輸阔拳,在數(shù)據(jù)傳輸完成后恢復(fù)正常速度崭孤,有點類似達到數(shù)據(jù)塊“秒傳”效果。為達到這個效果突發(fā)傳輸過程要占用AHB 總線糊肠,保證要求每個數(shù)據(jù)項在傳輸過程不被分割辨宠,這樣一次性把數(shù)據(jù)全部傳輸完才釋放AHB 總線;而單次傳輸時必須通過AHB 的總線仲裁多次控制才傳輸完成
流配置過程
配置DMA 數(shù)據(jù)流x(其中x 是數(shù)據(jù)流編號)時應(yīng)遵守下面的順序:
1.如果使能了數(shù)據(jù)流货裹,通過重置DMA_SxCR 寄存器中的EN 位將其禁止嗤形,然后讀取此位以確認(rèn)沒有正在進行的數(shù)據(jù)流操作。將此位寫為0 不會立即生效弧圆,因為實際上只有所有當(dāng)前傳輸都已完成時才會將其寫為0赋兵。當(dāng)所讀取EN 位的值為0 時笔咽,才表示可以配置數(shù)據(jù)流。因此在開始任何數(shù)據(jù)流配置之前霹期,需要等待EN 位置0叶组。應(yīng)將先前的數(shù)據(jù)塊DMA 傳輸中在狀態(tài)寄存器(DMA_LISR 和DMA_HISR)中置1 的所有數(shù)據(jù)流專用的位置0,然后才可重新使能數(shù)據(jù)流历造。
2. 在DMA_SxPAR 寄存器中設(shè)置外設(shè)端口寄存器地址甩十。外設(shè)事件發(fā)生后,數(shù)據(jù)會從此地址移動到外設(shè)端口或從外設(shè)端口移動到此地址吭产。
3. 在DMA_SxMA0R 寄存器(在雙緩沖區(qū)模式的情況下還有DMA_SxMA1R 寄存器)中設(shè)置存儲器地址侣监。外設(shè)事件發(fā)生后,將從此存儲器讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入此存儲器臣淤。
4. 在DMA_SxNDTR 寄存器中配置要傳輸?shù)臄?shù)據(jù)項的總數(shù)橄霉。每出現(xiàn)一次外設(shè)事件或每出現(xiàn)一個節(jié)拍的突發(fā)傳輸,該值都會遞減邑蒋。
5. 使用DMA_SxCR 寄存器中的CHSEL[2:0] 選擇DMA 通道(請求)酪劫。
6. 如果外設(shè)用作流控制器而且支持此功能,請將DMA_SxCR 寄存器中的PFCTRL 位置1寺董。
7. 使用DMA_SxCR 寄存器中的PL[1:0] 位配置數(shù)據(jù)流優(yōu)先級覆糟。
8. 配置FIFO 的使用情況(使能或禁止,發(fā)送和接收閾值)遮咖。232
9. 配置數(shù)據(jù)傳輸方向滩字、外設(shè)和存儲器增量/ 固定模式、單獨或突發(fā)事務(wù)御吞、外設(shè)和存儲器數(shù)據(jù)寬度麦箍、循環(huán)模式、雙緩沖區(qū)模式和傳輸完成一半和/ 或全部完成陶珠,和/或DMA_SxCR寄存器中錯誤的中斷挟裂。
10. 通過將DMA_SxCR 寄存器中的EN 位置1 激活數(shù)據(jù)流。
一旦使能了流揍诽,即可響應(yīng)連接到數(shù)據(jù)流的外設(shè)發(fā)出的任何DMA 請求诀蓉。
一旦在AHB 目標(biāo)端口上傳輸了一半數(shù)據(jù),傳輸一半標(biāo)志(HTIF) 便會置1暑脆,如果傳輸一半中斷使能位(HTIE) 置1渠啤,還會生成中斷。傳輸結(jié)束時添吗,傳輸完成標(biāo)志(TCIF) 便會置1沥曹,如果傳輸完成中斷使能位(TCIE) 置1,還會生成中斷。
DMA_ InitTypeDef 初始化結(jié)構(gòu)體
5) DMA_Channel:DMA 請求通道選擇妓美,可選通道0 至通道7僵腺,每個外設(shè)對應(yīng)固定的
通道,具體設(shè)置值需要查表它設(shè)定DMA_SxCR 寄存器的
CHSEL[2:0]位的值壶栋。例如想邦,我們使用模擬數(shù)字轉(zhuǎn)換器ADC3 規(guī)則采集4 個輸入通
道的電壓數(shù)據(jù),查表可知使用通道2委刘。
6) DMA_PeripheralBaseAddr:外設(shè)地址丧没,設(shè)定DMA_SxPAR 寄存器的值;一般設(shè)置
為外設(shè)的數(shù)據(jù)寄存器地址锡移,如果是存儲器到存儲器模式則設(shè)置為其中一個存儲區(qū)
地址呕童。ADC3 的數(shù)據(jù)寄存器ADC_DR 地址為((uint32_t)ADC3+0x4C)。
7) DMA_Memory0BaseAddr:存儲器0 地址淆珊,設(shè)定DMA_SxM0AR 寄存器值夺饲;一般
設(shè)置為我們自定義存儲區(qū)的首地址。我們程序先自定義一個16 位無符號整形數(shù)組
ADC_ConvertedValue[4]用來存放每個通道的ADC 值施符,所以把數(shù)組首地址(直接使
用數(shù)組名即可)賦值給DMA_Memory0BaseAddr往声。
8) DMA_DIR:傳輸方向選擇,可選外設(shè)到存儲器戳吝、存儲器到外設(shè)以及存儲器到存
儲器浩销。它設(shè)定DMA_SxCR 寄存器的DIR[1:0]位的值。ADC 采集顯然使用外設(shè)到
存儲器模式听哭。
9) DMA_BufferSize:設(shè)定待傳輸數(shù)據(jù)數(shù)目慢洋,初始化設(shè)定DMA_SxNDTR 寄存器的值。
這里ADC 是采集4 個通道數(shù)據(jù)陆盘,所以待傳輸數(shù)目也就是4普筹。
10) DMA_PeripheralInc:如果配置為DMA_PeripheralInc_Enable,使能外設(shè)地址自動
遞增功能隘马,它設(shè)定DMA_SxCR 寄存器的PINC 位的值太防;一般外設(shè)都是只有一個數(shù)
據(jù)寄存器,所以一般不會使能該位酸员。ADC3 的數(shù)據(jù)寄存器地址是固定并且只有一
個所以不使能外設(shè)地址遞增蜒车。
11) DMA_MemoryInc:如果配置為DMA_MemoryInc_Enable,使能存儲器地址自動
遞增功能沸呐,它設(shè)定DMA_SxCR 寄存器的MINC 位的值醇王;我們自定義的存儲區(qū)一
般都是存放多個數(shù)據(jù)的呢燥,所以使能存儲器地址自動遞增功能崭添。我們之前已經(jīng)定義
了一個包含4 個元素的數(shù)字用來存放數(shù)據(jù),使能存儲區(qū)地址遞增功能叛氨,自動把每
個通道數(shù)據(jù)存放到對應(yīng)數(shù)組元素內(nèi)呼渣。
12) DMA_PeripheralDataSize:外設(shè)數(shù)據(jù)寬度棘伴,可選字節(jié)(8 位)、半字(16 位)和字(32
位)屁置,它設(shè)定DMA_SxCR 寄存器的PSIZE[1:0]位的值焊夸。ADC 數(shù)據(jù)寄存器只有低16
位數(shù)據(jù)有效,使用半字?jǐn)?shù)據(jù)寬度蓝角。
13) DMA_MemoryDataSize:存儲器數(shù)據(jù)寬度阱穗,可選字節(jié)(8 位)、半字(16 位)和字(32
位)使鹅,它設(shè)定DMA_SxCR 寄存器的MSIZE[1:0]位的值揪阶。保存ADC 轉(zhuǎn)換數(shù)據(jù)也要
使用半字?jǐn)?shù)據(jù)寬度,這跟我們定義的數(shù)組是相對應(yīng)的患朱。
14) DMA_Mode :DMA 傳輸模式選擇鲁僚,可選一次傳輸或者循環(huán)傳輸,它設(shè)定
DMA_SxCR 寄存器的CIRC 位的值裁厅。我們希望ADC 采集是持續(xù)循環(huán)進行的冰沙,所
以使用循環(huán)傳輸模式。
15) DMA_Priority:軟件設(shè)置數(shù)據(jù)流的優(yōu)先級执虹,有4 個可選優(yōu)先級分別為非常高拓挥、高、
中和低袋励,它設(shè)定DMA_SxCR 寄存器的PL[1:0]位的值撞叽。DMA 優(yōu)先級只有在多個
DMA 數(shù)據(jù)流同時使用時才有意義,這里我們設(shè)置為非常高優(yōu)先級就可以了插龄。
16) DMA_FIFOMode:FIFO 模式使能愿棋,如果設(shè)置為DMA_FIFOMode_Enable 表示使
能FIFO 模式功能;它設(shè)定DMA_SxFCR 寄存器的DMDIS 位均牢。ADC 采集傳輸使
用直接傳輸模式即可糠雨,不需要使用FIFO 模式。
17) DMA_FIFOThreshold:FIFO 閾值選擇徘跪,可選4 種狀態(tài)分別為FIFO 容量的1/4甘邀、
1/2、3/4 和滿垮庐;它設(shè)定DMA_SxFCR 寄存器的FTH[1:0]位松邪;DMA_FIFOMode 設(shè)
置為DMA_FIFOMode_Disable,那DMA_FIFOThreshold 值無效哨查。ADC 采集傳輸
不使用FIFO 模式逗抑,設(shè)置改值無效。
18) DMA_MemoryBurst:存儲器突發(fā)模式選擇,可選單次模式邮府、4 節(jié)拍的增量突發(fā)模
式荧关、8 節(jié)拍的增量突發(fā)模式或16 節(jié)拍的增量突發(fā)模式,它設(shè)定DMA_SxCR 寄存
器的MBURST[1:0]位的值褂傀。ADC 采集傳輸是直接模式忍啤,要求使用單次模式。
19) DMA_PeripheralBurst:外設(shè)突發(fā)模式選擇仙辟,可選單次模式同波、4 節(jié)拍的增量突發(fā)模
式、8 節(jié)拍的增量突發(fā)模式或16 節(jié)拍的增量突發(fā)模式叠国,它設(shè)定DMA_SxCR 寄存
器的PBURST[1:0]位的值参萄。ADC 采集傳輸是直接模式,要求使用單次模式煎饼。
中斷和事件
參與了CPU就是外部中斷 CPU沒有參與就是事件
中斷編程
在配置每個中斷的時候一般有3 個編程要點:
1讹挎、使能外設(shè)某個中斷,這個具體由每個外設(shè)的相關(guān)中斷使能位控制吆玖。比如串口有發(fā)送
完成中斷筒溃,接收完成中斷,這兩個中斷都由串口控制寄存器的相關(guān)中斷使能位控制沾乘。
2怜奖、初始化NVIC_InitTypeDef 結(jié)構(gòu)體,配置中斷優(yōu)先級分組翅阵,設(shè)置搶占優(yōu)先級和子優(yōu)先級歪玲,使能中斷請求
嵌套向量中斷控制器(NVIC)
嵌套向量中斷控制器NVIC 配置
代碼清單17-3 NVIC 配置
外部中斷/事件控制器(EXTI)
EXTI 初始化結(jié)構(gòu)體
1) EXTI_Line:EXTI 中斷/事件線選擇,可選EXTI0 至EXTI22掷匠,可參考表17-1 選擇滥崩。
2) EXTI_Mode:EXTI 模式選擇,可選為產(chǎn)生中斷(EXTI_Mode_Interrupt)或者產(chǎn)生事
件(EXTI_Mode_Event)讹语。
3) EXTI_Trigger:EXTI 邊沿觸發(fā)事件钙皮,可選上升沿觸發(fā)(EXTI_Trigger_Rising)、下
降沿觸發(fā)( EXTI_Trigger_Falling) 或者上升沿和下降沿都觸發(fā)
( EXTI_Trigger_Rising_Falling)顽决。
4) EXTI_LineCmd:控制是否使能EXTI 線短条,可選使能EXTI 線(ENABLE)或禁用
(DISABLE)。
喚醒事件管理
STM32F4xx 能夠處理外部或內(nèi)部事件來喚醒內(nèi)核(WFE)才菠。喚醒事件可通過以下方式產(chǎn)生:
● 在外設(shè)的控制寄存器使能一個中斷茸时,但不在NVIC 中使能,同時使能Cortex?-M4F 系統(tǒng)控制寄存器中的SEVONPEND 位赋访。當(dāng)MCU 從WFE 恢復(fù)時可都,需要清除相應(yīng)外設(shè)的中斷掛起位和外設(shè)NVIC 中斷通道掛起位(在NVIC 中斷清除掛起寄存器中)缓待。
● 配置一個外部或內(nèi)部EXTI 線為事件模式。當(dāng)CPU 從WFE 恢復(fù)時汹粤,因為對應(yīng)事件線的掛起位沒有被置位命斧,不必清除相應(yīng)外設(shè)的中斷掛起位或NVIC 中斷通道掛起位田晚。
模數(shù)轉(zhuǎn)換器(ADC)
ADC 簡介
12 位ADC 是逐次趨近型模數(shù)轉(zhuǎn)換器嘱兼。它具有多達19 個復(fù)用通道,可測量來自16 個外部源贤徒、兩個內(nèi)部源和VBAT通道的信號芹壕。這些通道的A/D 轉(zhuǎn)換可在單次、連續(xù)接奈、掃描或不連續(xù)采樣模式下進行踢涌。ADC 的結(jié)果存儲在一個左對齊或右對齊的16 位數(shù)據(jù)寄存器中。ADC 具有模擬看門狗特性序宦,允許應(yīng)用檢測輸入電壓是否超過了用戶自定義的閾值上限或下限
ADC 主要特性
● 可配置12 位睁壁、10 位、8 位或6 位分辨率
● 在轉(zhuǎn)換結(jié)束互捌、注入轉(zhuǎn)換結(jié)束以及發(fā)生模擬看門狗或溢出事件時產(chǎn)生中斷
● 單次和連續(xù)轉(zhuǎn)換模式
● 用于自動將通道0 轉(zhuǎn)換為通道“n”的掃描模式
● 數(shù)據(jù)對齊以保持內(nèi)置數(shù)據(jù)一致性
● 可獨立設(shè)置各通道采樣時間
● 外部觸發(fā)器選項潘明,可為規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換配置極性
● 規(guī)則通道轉(zhuǎn)換期間可產(chǎn)生DMA 請求
輸入通道
外部的16 個通道在轉(zhuǎn)換的時候又分為規(guī)則通道和注入通道,其中規(guī)則通道最多有16路秕噪,注入通道最多有4 路钳降。那這兩個通道有什么區(qū)別?在什么時候使用腌巾?
規(guī)則通道
規(guī)則通道:顧名思意遂填,規(guī)則通道就是很規(guī)矩的意思,我們平時一般使用的就是這個通道澈蝙,或者應(yīng)該說我們用到的都是這個通道吓坚,沒有什么特別要注意的可講。
注入通道
注入灯荧,可以理解為插入凌唬,插隊的意思,是一種不安分的通道漏麦。它是一種在規(guī)則通道轉(zhuǎn)換的時候強行插入要轉(zhuǎn)換的一種客税。如果在規(guī)則通道轉(zhuǎn)換過程中,有注入通道插隊撕贞,那么就要先轉(zhuǎn)換完注入通道更耻,等注入通道轉(zhuǎn)換完成后,再回到規(guī)則通道的轉(zhuǎn)換流程捏膨。這點跟中斷程序很像秧均,都是不安分的主食侮。所以,注入通道只有在規(guī)則通道存在時才會出現(xiàn)目胡。
ADC_InitTypeDef 結(jié)構(gòu)體
ADC_InitTypeDef 結(jié)構(gòu)體定義在stm32f4xx_adc.h 文件內(nèi)锯七,具體定義如下:
ADC_Resolution:配置ADC 的分辨率,可選的分辨率有12 位誉己、10 位眉尸、8 位和6 位。分辨率越高巨双,AD 轉(zhuǎn)換數(shù)據(jù)精度越高噪猾,轉(zhuǎn)換時間也越長;分辨率越低筑累,AD 轉(zhuǎn)換數(shù)據(jù)精度越低袱蜡,轉(zhuǎn)換時間也越短。
ScanConvMode:可選參數(shù)為ENABLE 和DISABLE慢宗,配置是否使用掃描坪蚁。如果是單通道AD 轉(zhuǎn)換使用DISABLE,如果是多通道AD 轉(zhuǎn)換使用ENABLE镜沽。
ADC_ContinuousConvMode:可選參數(shù)為ENABLE 和DISABLE敏晤,配置是啟動自動連續(xù)轉(zhuǎn)換還是單次轉(zhuǎn)換。使用ENABLE 配置為使能自動連續(xù)轉(zhuǎn)換淘邻;使用DISABLE 配置為單次轉(zhuǎn)換茵典,轉(zhuǎn)換一次后停止需要手動控制才重新啟動轉(zhuǎn)換。
ADC_ExternalTrigConvEdge:外部觸發(fā)極性選擇宾舅,如果使用外部觸發(fā)统阿,可以選擇觸發(fā)的極性,可選有禁止觸發(fā)檢測筹我、上升沿觸發(fā)檢測扶平、下降沿觸發(fā)檢測以及上升沿和下降沿均可觸發(fā)檢測。
ADC_ExternalTrigConv:外部觸發(fā)選擇蔬蕊,可根據(jù)項目需求配置觸發(fā)來源结澄。實際上,我們一般使用軟件自動觸發(fā)岸夯。
ADC_DataAlign:轉(zhuǎn)換結(jié)果數(shù)據(jù)對齊模式麻献,可選右對齊ADC_DataAlign_Right 或者左對齊ADC_DataAlign_Left。一般我們選擇右對齊模式猜扮。
ADC_NbrOfChannel:AD 轉(zhuǎn)換通道數(shù)目勉吻。
編程要點
1) 初始化配置ADC 目標(biāo)引腳為模擬輸入模式;
2) 使能ADC 時鐘旅赢;
3) 配置通用ADC 為獨立模式齿桃,采樣4 分頻惑惶;
4) 設(shè)置目標(biāo)ADC 為12 位分辨率,1 通道的連續(xù)轉(zhuǎn)換短纵,不需要外部觸發(fā)带污;
5) 設(shè)置ADC 轉(zhuǎn)換通道順序及采樣時間;
6) 配置使能ADC 轉(zhuǎn)換完成中斷香到,在中斷內(nèi)讀取轉(zhuǎn)換完數(shù)據(jù)鱼冀;
7) 啟動ADC 轉(zhuǎn)換;
8) 使能軟件觸發(fā)ADC 轉(zhuǎn)換养渴。
ADC 轉(zhuǎn)換結(jié)果數(shù)據(jù)使用中斷方式讀取雷绢,這里沒有使用DMA 進行數(shù)據(jù)傳輸
SysTick—系統(tǒng)定時器
SysTick 寄存器介紹
SysTick—系統(tǒng)定時有4 個寄存器泛烙,簡要介紹如下理卑。在使用SysTick 產(chǎn)生定時的時候,
只需要配置前三個寄存器蔽氨,最后一個校準(zhǔn)寄存器不需要使用藐唠。
寄存器名稱寄存器描述
CTRL SysTick 控制及狀態(tài)寄存器
LOAD SysTick 重裝載數(shù)值寄存器
VAL SysTick 當(dāng)前數(shù)值寄存器
TIM6&7—基本定時器
STM32F42xxx 系列控制器有2 個高級控制定時器(1.8)、10 個通用定時器和2 個基本定時器鹉究,(6.7)
還有2 個看門狗定時器
流程過程
基本上定時器TIM6 和TIM7 是一個16 位向上遞增的定時器宇立,當(dāng)我在自動重載寄存器(TIMx_ARR)添加一個計數(shù)值后并使能TIMx,計數(shù)寄存器(TIMx_CNT)就會從0 開始遞增自赔,當(dāng)TIMx_CNT 的數(shù)值與TIMx_ARR 值相同時就會生成事件并把TIMx_CNT 寄存器清0妈嘹,完成一次循環(huán)過程。如果沒有停止定時器就循環(huán)執(zhí)行上述過程绍妨。
時鐘源
定時器要實現(xiàn)計數(shù)必須有個時鐘源润脸,基本定時器時鐘只能來自內(nèi)部時鐘,高級控制定時器和通用定時器還可以選擇外部時鐘源或者直接來自其他定時器等待模式
寄存器
基本定時器計數(shù)過程主要涉及到三個寄存器內(nèi)容他去,分別是計數(shù)器寄存器(TIMx_CNT)毙驯、預(yù)分頻器寄存器(TIMx_PSC)、自動重載寄存器(TIMx_ARR)灾测,這三個寄存器都是16 位有效數(shù)字爆价,即可設(shè)置值為0 至65535。
上溢說明
在TIMx_CNT 遞增至與TIMx_ARR 值相等媳搪,我們叫做為定時器上溢铭段。
影子寄存器
TIMx_ARR 有影子寄存器,可以通過TIMx_CR1 寄存器的ARPE 位控制影子寄存器功能秦爆,如果ARPE 位置1序愚,影子寄存器有效,只有在事件更新時才把TIMx_ARR 值賦給影子寄存器鲜结。如果ARPE 位為0展运,修改TIMx_ARR 值馬上有效
定時器周期計算
經(jīng)過上面分析活逆,我們知道定時事件生成時間主要由TIMx_PSC 和TIMx_ARR 兩個寄存器值決定,這個也就是定時器的周期拗胜。比如我們需要一個1s 周期的定時器蔗候,具體這兩個寄存器值該如何設(shè)置內(nèi)。假設(shè)埂软,我們先設(shè)置TIMx_ARR 寄存器值為9999锈遥,即當(dāng)TIMx_CNT從0 開始計算,剛好等于9999 時生成事件勘畔,總共計數(shù)10000 次所灸,那么如果此時時鐘源周期為100us 即可得到剛好1s 的定時周期。
接下來問題就是設(shè)置TIMx_PSC 寄存器值使得CK_CNT 輸出為100us 周期(10000Hz)的時鐘炫七。預(yù)分頻器的輸入時鐘CK_PSC 為90MHz爬立,所以設(shè)置預(yù)分頻器值為(9000-1)即可滿足 就是90 000 000 HZ? 10000次有4個0 還差 3個0 所以 9000 -1
定時器基本初始化結(jié)構(gòu)體
1 typedef struct {
2 uint16_t TIM_Prescaler; // 預(yù)分頻器
3 uint16_t TIM_CounterMode; // 計數(shù)模式
4 uint32_t TIM_Period; // 定時器周期
5 uint16_t TIM_ClockDivision; // 時鐘分頻
6 uint8_t TIM_RepetitionCounter; // 重復(fù)計算器
7 } TIM_TimeBaseInitTypeDef;
(1) TIM_Prescaler:定時器預(yù)分頻器設(shè)置,時鐘源經(jīng)該預(yù)分頻器才是定時器時鐘万哪,它設(shè)定
TIMx_PSC 寄存器的值侠驯。可設(shè)置范圍為0 至65535奕巍,實現(xiàn)1 至65536 分頻吟策。
(2) TIM_CounterMode:定時器計數(shù)方式,可是在為向上計數(shù)的止、向下計數(shù)以及三種中心對
齊模式檩坚。基本定時器只能是向上計數(shù)诅福,即TIMx_CNT 只能從0 開始遞增匾委,并且無需初
始化。
(3) TIM_Period:定時器周期权谁,實際就是設(shè)定自動重載寄存器的值剩檀,在事件生成時更新到
影子寄存器⊥浚可設(shè)置范圍為0 至65535沪猴。
(4) TIM_ClockDivision:時鐘分頻,設(shè)置定時器時鐘CK_INT 頻率與數(shù)字濾波器采樣時鐘
頻率分頻比采章,基本定時器沒有此功能运嗜,不用設(shè)置。
(5) TIM_RepetitionCounter:重復(fù)計數(shù)器悯舟,屬于高級控制寄存器專用寄存器位担租,利用它可
以非常容易控制輸出PWM 的個數(shù)。這里不用設(shè)置抵怎。
TIM1&8—高級定時器
介紹
高級控制定時器時基單元包含一個16 位自動重載計數(shù)器ARR奋救,一個16 位的計數(shù)器CNT岭参,可向上/下計數(shù),一個16 位可編程預(yù)分頻器PSC尝艘,預(yù)分頻器時鐘源有多種可選演侯,有內(nèi)部的時鐘、外部時鐘背亥。還有一個8 位的重復(fù)計數(shù)器RCR秒际,這樣最高可實現(xiàn)40 位的可編程定時
時鐘源
高級控制定時器有四個時鐘源可選:
?內(nèi)部時鐘源CK_INT
?外部時鐘模式1:外部輸入引腳TIx(x=1,2,3,4)
?外部時鐘模式2:外部觸發(fā)輸入ETR
?內(nèi)部觸發(fā)輸入
寄存器
高級控制定時器時基單元包括四個寄存器,分別是計數(shù)器寄存器(CNT)狡汉、預(yù)分頻器寄存(PSC)娄徊、自動重載寄存器(ARR)和重復(fù)計數(shù)器寄存器(RCR)。其中重復(fù)計數(shù)器RCR 是高級定時器獨有盾戴,通用和基本定時器沒有寄锐。前面三個寄存器都是16 位有效,TIMx_RCR 寄存器是8 位有效捻脖。
重復(fù)計數(shù)器RCR
在基本/通用定時器發(fā)生上/下溢事件時直接就生成更新事件锐峭,但對于高級控制定時器卻不是這樣中鼠,高級控制定時器在硬件結(jié)構(gòu)上多出了重復(fù)計數(shù)器可婶,在定時器發(fā)生上溢或下溢事件是遞減重復(fù)計數(shù)器的值啥刻,只有當(dāng)重復(fù)計數(shù)器為0 時才會生成更新事件冀续。在發(fā)生N+1 個上溢或下溢事件(N 為RCR 的值)時產(chǎn)生更新事件箕肃。
重點掌握增加功能
輸入捕獲和輸出比較功能
輸入捕獲的大概的原理
就是多艇,當(dāng)捕獲到信號的跳變沿的時候馍管,把計數(shù)器CNT 的值鎖存到捕獲寄存器CCR 中骗露,把前后兩次捕獲到的CCR 寄存器中的值相減硅则,就可以算出脈寬或者頻率癞揉。如果捕獲的脈寬的時間長度超過你的捕獲定時器的周期筐赔,就會發(fā)生溢出铣猩,這個我們需要做額外的處理。
PWM 輸入模式茴丰。
PWM 信號由輸入通道TI1 進入达皿,因為是PWM 輸入模式的緣故,信號會被分為兩路贿肩,一路是TI1FP1峦椰,另外一路是TI2FP2。其中一路是周期汰规,另一路是占空比汤功,具體哪一路信號對應(yīng)周期還是占空比,得從程序上設(shè)置哪一路信號作為觸發(fā)輸入溜哮,作為觸發(fā)輸入的哪一路信號對應(yīng)的就是周期滔金,另一路就是對應(yīng)占空比色解。作為觸發(fā)輸入的那一路信號還需要設(shè)置極性,是上升沿還是下降沿捕獲
圖 PWM 輸入模式時序
PWM 信號由輸入通道TI1 進入餐茵,配置TI1FP1 為觸發(fā)信號冒签,上升沿捕獲。當(dāng)上升沿的時候IC1 和IC2 同時捕獲钟病,計數(shù)器CNT 清零萧恕,到了下降沿的時候,IC2 捕獲肠阱,此時計數(shù)器CNT 的值被鎖存到捕獲寄存器CCR2 中票唆,到了下一個上升沿的時候,IC1 捕獲屹徘,計數(shù)器CNT 的值被鎖存到捕獲寄存器CCR1 中走趋。其中CCR2 測量的是脈寬,CCR1 測量的是周期噪伊。從軟件上來說簿煌,用PWM 輸入模式測量脈寬和周期更容易,付出的代價是需要占用兩個捕獲寄存器
PWM 輸出模式
PWM 輸出就是對外輸出脈寬(即占空比)可調(diào)的方波信號鉴吹,信號頻率由自動重裝寄存器ARR 的值決定姨伟,占空比由比較寄存器CCR 的值決定。
USART—串口通訊
功能引腳
TX:發(fā)送數(shù)據(jù)輸出引腳豆励。
RX:接收數(shù)據(jù)輸入引腳夺荒。
數(shù)據(jù)寄存器
USART 數(shù)據(jù)寄存器(USART_DR)只有低9 位有效,并且第9 位數(shù)據(jù)是否有效要取決于USART 控制寄存器1(USART_CR1)的M 位設(shè)置良蒸,當(dāng)M 位為0 時表示8 位數(shù)據(jù)字長技扼,當(dāng)M位為1 表示9 位數(shù)據(jù)字長,我們一般使用8 位數(shù)據(jù)字長嫩痰。
USART_DR 包含了已發(fā)送的數(shù)據(jù)或者接收到的數(shù)據(jù)剿吻。USART_DR 實際是包含了兩個寄存器,一個專門用于發(fā)送的可寫TDR串纺,一個專門用于接收的可讀RDR丽旅。當(dāng)進行發(fā)送操作時,往USART_DR 寫入數(shù)據(jù)會自動存儲在TDR 內(nèi)造垛;當(dāng)進行讀取操作時魔招,向USART_DR讀取數(shù)據(jù)會自動提取RDR 數(shù)據(jù)。
控制器
USART 有專門控制發(fā)送的發(fā)送器五辽、控制接收的接收器办斑,還有喚醒單元、中斷控制等等。
使用USART 之前需要向USART_CR1 寄存器的UE 位置1 使能USART乡翅。發(fā)送或者接收數(shù)
據(jù)字長可選8 位或9 位鳞疲,由USART_CR1 的M 位控制。
在發(fā)送數(shù)據(jù)時蠕蚜,編程的時候有幾個比較重要的標(biāo)志位我們來總結(jié)下尚洽。
在接收數(shù)據(jù)時,編程的時候有幾個比較重要的標(biāo)志位我們來總結(jié)下
USART 初始化結(jié)構(gòu)體
uC/OS II
1. 一個完整的任務(wù)應(yīng)該有如下三部分:
? 任務(wù)代碼(程序)
? 任務(wù)的私有堆棧(用以保護運行環(huán)境)
?任務(wù)控制塊(提供私有堆棧也是虛擬處理器的位置
任務(wù)就緒表
OSRdyGrp=00001011靶累,那么就意味著OSRdyTbl[0]腺毫、OSRdyTbl[1]、OSRdyTbl[3]中有就緒的任務(wù)
舉例:某任務(wù)的優(yōu)先級prio=24挣柬,問該任務(wù)落在就緒表中的哪一位潮酒?
24的二進制位為00011000,D5邪蛔、D4急黎、D3位011,即OSRdyTbl[]的下標(biāo)為3侧到,D2勃教、D1、D0為0匠抗,即優(yōu)先級prio=24的任務(wù)在OSRdyTbl[3]的第0位
獲取最高優(yōu)先級任務(wù)
INT8U? y;
y = OSUnMapTbl[OSRdyGrp]; //最高優(yōu)先級所在的任務(wù)組
OSPrioHighRdy = (INT8U)((y << 3)+OSUnMapTbl[OSRdyTbl[y]]); //最高優(yōu)先級任務(wù)所在的任務(wù)組的位
任務(wù)切換步驟:
1. 獲得待運行就緒任務(wù)控制塊的指針故源;調(diào)度器實施任務(wù)切換之前的主要工作時:獲得待運行任務(wù)的TCB指針和當(dāng)前任務(wù)的TCB指針
2. 對任務(wù)級調(diào)度器OSSched()的解釋
綜上所述
任務(wù)的切換就是斷點數(shù)據(jù)的切換,斷點數(shù)據(jù)的切換也就是CPU堆棧指針的切換戈咳,被中止運行任務(wù)的任務(wù)堆棧指針要保存到該任務(wù)的任務(wù)控制塊中心软。待運行任務(wù)的任務(wù)堆棧指針要由該任務(wù)控制塊轉(zhuǎn)存到CPU的SP中
Void OSCtxSw(void)//任務(wù)切換函數(shù)
{
將R1,R2著蛙,R3及R4推入當(dāng)前堆棧
//正在運行的任務(wù)塊指針-》任務(wù)塊指針
OSTCBCur->OSTCBStkPtr = SP;//把SP保存在中止任務(wù)控制塊中 當(dāng)前任務(wù)的任務(wù)控制塊指針用來保存SP
OSTCBCur = OSTCBHighRdy;//系統(tǒng)獲得待運行控制塊
SP=OSTCBHighRdy->OSTCBStkPtr;
//待運行任務(wù)堆棧指針給SP
將R4耳贬,R3踏堡,R2及R1從新堆棧中彈出
執(zhí)行中斷返回指令
}
I^2C
I^2C總線是PHILIPS公司推出的設(shè)備內(nèi)部串行總線,它由一根數(shù)據(jù)線SDA和一根時鐘線SCL組成咒劲,SDA和SCL都為雙向I/O線顷蟆,通過上拉電阻Rp接+5v電源,總線空閑是皆為高電平
總共有五種工作狀態(tài):
A:總線非忙狀態(tài)
該狀態(tài)時數(shù)據(jù)線(SDA)和時鐘線(SCL)都保持高電平腐魂。
B:啟動狀態(tài)
當(dāng)時鐘線(SCL)為高電平狀態(tài)時帐偎,數(shù)據(jù)線(SDA)由高電平變?yōu)榈碗娖降南陆笛乇徽J(rèn)為是"啟動"信號。
C:停止?fàn)顟B(tài)
當(dāng)時鐘線(SCL)為高電平狀態(tài)時蛔屹,數(shù)據(jù)線(SDA)由低電平變?yōu)楦唠娖降南陆笛乇徽J(rèn)為是"停止"信號削樊。
D:數(shù)據(jù)有效狀態(tài)
在出現(xiàn)"啟動"信號后,在時鐘線(SCL)為高電平狀態(tài)時,數(shù)據(jù)線是穩(wěn)定的漫贞,這時數(shù)據(jù)線的狀態(tài)就是要傳送的數(shù)據(jù)甸箱。數(shù)據(jù)線(SDA)上數(shù)據(jù)的改變必須在時鐘線為低電平期間完成的,每位數(shù)據(jù)占有一個時鐘脈沖迅脐。
E:應(yīng)答信號(Ack)芍殖,EEPROM在接收或發(fā)送一個字節(jié)的數(shù)據(jù)時,通常要發(fā)出或接收一個應(yīng)答信號(Ack)谴蔑。
I^2C總線協(xié)議有明確的規(guī)定:采用7位的尋址字節(jié)(尋址字節(jié)是起始信號后的第一個字節(jié))豌骏。
D7~D1位組成從機的地址。D0位是數(shù)據(jù)傳送方向位隐锭,為“0”時表示主機向從機寫數(shù)據(jù)肯适,為“1”時表示主機由從機讀數(shù)據(jù)。
從機的7位尋址位有4位是固定位成榜,3位是可編程位框舔,這時僅能尋址8個同樣的器件,即可以有8個同樣的器件接入到該I^2C總線系統(tǒng)中
先發(fā)數(shù)據(jù)
SPI
全雙工赎婚;
SPI接口一般使用4條線通信:
MISO主設(shè)備數(shù)據(jù)輸入刘绣,從設(shè)備數(shù)據(jù)輸出;
MOSI主設(shè)備數(shù)據(jù)輸出挣输,從設(shè)備數(shù)據(jù)輸入纬凤;
SCLK:時鐘信號,由主設(shè)備產(chǎn)生
CS:從設(shè)備片選信號撩嚼,由主設(shè)備控制
注意:外設(shè)的寫操作和讀操作是同步完成的停士;如果只進行寫操作,主機只須忽略接受到的字節(jié)完丽;反之恋技,若主機要讀取從機的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機的傳輸
4種工作方式:
根據(jù)外設(shè)工作要求逻族,其輸出串行同步時鐘極性和相位可以配置:
1. CPOL時鐘極性 = 0 串行同步時鐘的空閑狀態(tài)為低電平蜻底;CPHA = 0 在串行同步時鐘的第一個跳變沿數(shù)據(jù)被采樣;
2. CPOL時鐘極性 = 0 串行同步時鐘的空閑狀態(tài)為低電平聘鳞;CPHA = 1 在串行同步時鐘的第二個跳變沿數(shù)據(jù)被采樣薄辅;
3. CPOL時鐘極性 = 1 串行同步時鐘的空閑狀態(tài)為高電平;CPHA = 0 在串行同步時鐘的第一個跳變沿數(shù)據(jù)被采樣抠璃;(常用方式)
4. CPOL時鐘極性 = 0 串行同步時鐘的空閑狀態(tài)為高電平站楚;CPHA = 1 在串行同步時鐘的第二個跳變沿數(shù)據(jù)被采樣;
更多:
中斷向量表首先中斷向量表定義的是什么搏嗡?定義的就是中斷服務(wù)程序的跳轉(zhuǎn)指令窿春,因為每個中斷向量在向量表中只有一個字節(jié)的存儲空間,只能存放一條指令,所以通常存放跳轉(zhuǎn)指令谁尸,使程序跳轉(zhuǎn)到存儲器的其他地方舅踪,再執(zhí)行中斷處理。
舉例中斷服務(wù)函數(shù)名字:
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Stream4_IRQHander
啟動過程
(1)設(shè)置堆棧
(2)初始化PC指針
(3)設(shè)置向量表
(4)跳轉(zhuǎn)到main函數(shù)
STM32的啟動模式由芯片的啟動引腳BOOT0和BOOT1決定:MCU在上電時會讀取BOOT0和BOOT1引腳的電平狀態(tài)并鎖存良蛮,系統(tǒng)根據(jù)電平狀態(tài)來從選擇啟動方式
復(fù)位和時鐘控制(RCC)
復(fù)位
共有三種類型的復(fù)位抽碌,分別為系統(tǒng)復(fù)位、電源復(fù)位和備份域復(fù)位决瞳。
GPIO復(fù)用功能采用GPIO_PinAFConfig函數(shù)货徙,此函數(shù)有3個參數(shù):1.2確定那個引腳(I/O),第三個是復(fù)用為何種功能,在stm32f4xx_gpio.h中有列出來皮胡。