2、閱讀 dma:通過總線而越過 CPU 讀取外設(shè)數(shù)據(jù)
我的理解——通過 DMA 應(yīng)用可以加速單片機(jī)外設(shè)、存儲(chǔ)器之間的數(shù)據(jù)傳輸,并在傳輸期間不影響 CPU 進(jìn)行其他事情。 這對于入門開發(fā)基本功能來說沒有太大必要,這個(gè)內(nèi)容先行跳過。
i. 由于我的需求只跟高電平寬度有關(guān),所以避免了使用 PWM 輸入模式,這樣可以每個(gè)管腳捕捉一路信號。如果
使用 PWM 模式,每一路需要占用兩個(gè)寄存器,所以一個(gè)定時(shí)器只能同時(shí)使用兩路 PWM 輸入。
ii. 由于捕捉需要觸發(fā)啟動(dòng)定時(shí)器,所以 PWM 輸出與捕捉不容易在同一個(gè) TIM 通道上實(shí)現(xiàn)。如果必須的話只能 增加計(jì)數(shù)溢出的相關(guān)代碼。
iii. 有些程序省略了捕捉通道的初始化代碼,這是不對的
iv. 在基本計(jì)時(shí)器初始化代碼里面注意選擇適當(dāng)?shù)挠?jì)數(shù)器長度,最好讓波形長度不要長于一個(gè)計(jì)數(shù)周期,否則需 要增加溢出代碼很麻煩。一個(gè)計(jì)數(shù)周期的長度計(jì)算跟如下幾個(gè)參數(shù)有關(guān):
(1) RCC 初始化代碼里面的 RCC_PCLKxConfig,這是 TIM 的基礎(chǔ)時(shí)鐘源與系統(tǒng)時(shí)鐘的關(guān)系。
(2) TIM 初始化的 TIM_Period,這是計(jì)數(shù)周期的值
(3) TIM 初始化的 TIM_Prescaler,這是計(jì)數(shù)周期的倍頻計(jì)數(shù)器,相當(dāng)于調(diào)節(jié)計(jì)數(shù)周期,可以使 TIM_Period 盡 量大,提高計(jì)數(shù)精度。
STM32筆記之十二:時(shí)鐘不息工作不止,systic 時(shí)鐘應(yīng)用
a) 目的:使用系統(tǒng)時(shí)鐘來進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時(shí)延遲。
b) 初始化函數(shù)定義:
void SysTick_Configuration(void);
c) 初始化函數(shù)調(diào)用:
SysTick_Configuration();
d) 初始化函數(shù):
void SysTick_Configuration(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時(shí)鐘除8
SysTick_SetReload(250000); //計(jì)數(shù)周期長度
Tic_Val++;//變量遞增
vi. 調(diào)用代碼:Tic_Delay(10); //精確延時(shí)
vii. 疑問:如果去掉計(jì)時(shí)行那個(gè)沒用的 printf("");函數(shù)將停止工作,這個(gè)現(xiàn)象很奇怪
STM32筆記之十三:惡搞,兩只看門狗 a) 目的: 了解兩種看門狗(我叫它:系統(tǒng)運(yùn)行故障探測器和獨(dú)立系統(tǒng)故障探測器,新手往往被這個(gè)并不形象的象形名稱搞糊涂)
之間的區(qū)別和基本用法。
b) 相同: 都是用來探測系統(tǒng)故障,通過編寫代碼定時(shí)發(fā)送故障清零信號(高手們都管這個(gè)代碼叫做“喂狗”),告訴它系統(tǒng)運(yùn)行正常。
一旦系統(tǒng)故障,程序清零代碼(“喂狗”)無法執(zhí)行,其計(jì)數(shù)器就會(huì)計(jì)數(shù)不止,直到記到零并發(fā)生故障中斷(狗餓了開始 叫喚),控制 CPU 重啟整個(gè)系統(tǒng)(不行啦,開始咬人了,快跑……)。
c) 區(qū)別:
獨(dú)立看門狗 Iwdg——我的理解是獨(dú)立于系統(tǒng)之外,因?yàn)橛歇?dú)立時(shí)鐘,所以不受系統(tǒng)影響的系統(tǒng)故障探測器。(這條狗是 借來的,見誰偷懶它都咬。┲饕糜诒O(jiān)視硬件錯(cuò)誤。
窗口看門狗 wwdg——我的理解是系統(tǒng)內(nèi)部的故障探測器,時(shí)鐘與系統(tǒng)相同。如果系統(tǒng)時(shí)鐘不走了,這個(gè)狗也就失去作 用了。(這條狗是老板娘養(yǎng)的,老板不干活兒他不管。┲饕糜诒O(jiān)視軟件錯(cuò)誤。
d) 初始化函數(shù)定義:鑒于兩只狗作用差不多,使用過程也差不多初始化函數(shù)栓一起了,用的時(shí)候根據(jù)情況刪減。
STM32筆記之十四:基本問題,來討論一下軟件架構(gòu)
網(wǎng)上大家都在討論和學(xué)習(xí),但是對于架構(gòu)這個(gè)基本問題卻沒幾個(gè)人討論。個(gè)人認(rèn)為有個(gè)好的架構(gòu)是寫好代碼的基礎(chǔ),可 以使后期的調(diào)式工作事半功倍!!
1、 架構(gòu)組成:我的程序代碼分為四種結(jié)構(gòu) a) 順序執(zhí)行代碼 定義:按照順序逐行執(zhí)行的代碼 優(yōu)點(diǎn):是思路簡單,代碼可靠不易被干擾。 缺點(diǎn):占用資源
用途:只用來各種變量、函數(shù)的定義,硬件的初始化程序 位置:main.c 的開始一直到 main 函數(shù)的 while 函數(shù)之前
b) 空閑執(zhí)行代碼
定義:在 CPU 空閑的時(shí)候才執(zhí)行的代碼 優(yōu)點(diǎn):不占用資源 缺點(diǎn):執(zhí)行的實(shí)時(shí)性不能保證
用途:非實(shí)時(shí)任務(wù),調(diào)試信息輸出,不重要的狀態(tài)指示 位置:main.c 的 main 函數(shù)的 while 函數(shù)內(nèi)部
c) 中斷執(zhí)行代碼 定義:由軟硬件事件打斷整個(gè)程序而執(zhí)行的代碼 優(yōu)點(diǎn):可以保證實(shí)時(shí)性,各種中斷可以安排優(yōu)先順序 缺點(diǎn):關(guān)系相對復(fù)雜,互相之間容易干擾 用途:觸發(fā)性的代碼,比如接收數(shù)據(jù),響應(yīng)外部設(shè)備,按鈕的相應(yīng) 位置:stm32f10x_it.c 內(nèi)部
時(shí)鐘不息工作不止,systic 時(shí)鐘應(yīng)用
a) 目的:使用系統(tǒng)時(shí)鐘來進(jìn)行兩項(xiàng)實(shí)驗(yàn)——周期執(zhí)行代碼與精確定時(shí)延遲。
b) 初始化函數(shù)定義:
void SysTick_Configuration(void);
c) 初始化函數(shù)調(diào)用:
SysTick_Configuration();
d) 初始化函數(shù):