本人使用的是正點原子的ministm32
本次實驗用到的暫存器仍然是之前學過的那幾個,但是在用法上卻更深入一些,本次實驗的難點個人認為有兩個,一是理解按鍵捕獲的原理,二是理解按鍵捕獲的實現方法。
按鍵捕獲的原理:
定時器向上計數,定時器被設定為上公升沿捕捉,當按鍵被按下時,捕捉到上公升沿,於是記錄此時的計數值為t1,然後立刻設為下降沿捕獲,並且將計數值清0,再次向上計數,直到t2發生下降沿捕獲時,記錄此時的計數值為ccrx2。通過這個資料我們可以計算出按鍵按下的時間,即高電平持續時間。但是注意,我們的定時器是有時間限制的,一旦超過定時器的最大時間就會清0重新計時(溢位),所以我們計算高電平持續時間的時候應該這樣計算:
溢位次數n*一次計時最大值arr+ccrx2
按鍵捕獲的實現方法這個等**列出來之後再解釋把
main函式
#include
"sys.h"
#include
"usart.h"
#include
"delay.h"
#include
"led.h"
#include
"timer.h"
#include
"into.h"
extern u8 tim2ch1_capture_sta;
//輸入捕獲狀態
extern u16 tim2ch1_capture_val;
//輸入捕獲值
intmain()
}}
into.c
#include
"into.h"
#include
"led.h"
void
tim2_cap_init
(u16 arr,u16 psc)
u8 tim2ch1_capture_sta=0;
//輸入捕獲狀態
u16 tim2ch1_capture_val;
//輸入捕獲值
void
tim2_irqhandler
(void
)else}}
if(tsr&
0x02
)else}}
tim2->sr=0;
//清除中斷標誌位
}
into.h
#ifndef _into_h
#define _into_h
#include
"sys.h"
void
tim2_cap_init
(u16 arr,u16 psc)
;#endif
其他timer函式的內容可以移步上篇csdn,主要說明一下into.c的**邏輯 前面的配置先不多說了,重點是tim2_irqhandler,tim2的中斷函式
我們定義了乙個八位的變數tim2ch1_capture_sta
bit5~0:捕獲高電平後定時器溢位的次數
bit6:捕獲到高電平的標誌
bit 7:捕獲完成的標誌
tim2ch1_capture_val
記錄捕獲到下降沿時tim2_cnt的值
首先我們設定為上公升沿捕獲,當上公升中斷捕獲到來時,如果tim2ch1_capture_sta的第六位還不是1,那我們先消除一切配置,將tim2ch1_capture_sta,tim2ch1_capture_val和tim2->cnt清0,然後再手動把tim2ch1_capture_sta的第六位置1,意為捕捉到了高電平,然後再設定位下降沿捕獲,如果高電平持續時間過長,那就會發生溢位,在tim2ch1_capture_sta中對溢位進行記數,當最大溢位次數來臨(0~5位都滿了),就強制捕獲完成,把tim2ch1_capture_sta第七位置為1,標記成功捕獲了一次高電平,讀取定時器的捕獲值到tim2ch1_capture_val中,最後再設定為上公升沿捕獲,回到初始狀態。
STM32暫存器與輸入捕獲
以下來至原子教程 輸入捕獲模式可以用來測量脈衝寬度或者測量頻率。stm32 的定時器,除了 tim6 和 tim7,其他定時器都有輸入捕獲功能。stm32 的輸入捕獲,簡單的說就是通過檢測 timx chx 上的 邊沿訊號,在邊沿訊號發生跳變 比如上公升沿 下降沿 的時候,將當前定時器的值 timx...
STM32蜂鳴器 暫存器
這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...
STM32暫存器對映
1.對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,2.各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到 3.想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能 4.stm32底層實際是先定義出外設基位址,然...