STM32單片機學(xué)習(xí)小Tips之?dāng)?shù)據(jù)的保存和毀滅(2)
和以前學(xué)到的有關(guān)數(shù)據(jù)保存不同,這里的數(shù)據(jù)保存還有“保密”之意,即一旦受到意外的侵入,STM32將毀滅數(shù)據(jù)。這是通過Tamper機制來實現(xiàn)的。
以下是數(shù)據(jù)手冊中的有關(guān)說明:
5.3.1 侵入檢測
當(dāng)TAMPER引腳上的信號從0變成1或者從1變成0(取決于備份控制寄存器 BKP_CR的TPAL位),會產(chǎn)生一個侵入檢測事件。侵入檢測事件將所有數(shù)據(jù)備份寄存器內(nèi)容清除。 然而為了避免丟失侵入事件,侵入檢測信號是邊沿檢測的信號與侵入檢測允許位的邏輯與,從而在侵入檢測引腳被允許前發(fā)生的侵入事件也可以被檢測到。
● 當(dāng) TPAL=0 時:如果在啟動侵入檢測TAMPER引腳前(通過設(shè)置TPE位)該引腳已經(jīng)為高電平,一旦啟動侵入檢測功能,則會產(chǎn)生一個額外的侵入事件(盡管在TPE位置’1’后并沒有出現(xiàn)上升沿)。
● 當(dāng) TPAL=1 時:如果在啟動侵入檢測引腳TAMPER前(通過設(shè)置TPE位)該引腳已經(jīng)為低電平,一旦啟動侵入檢測功能,則會產(chǎn)生一個額外的侵入事件(盡管在TPE位置’1’后并沒有出現(xiàn)下降沿)。
設(shè)置BKP_CSR寄存器的TPIE位為’1’,當(dāng)檢測到侵入事件時就會產(chǎn)生一個中斷。
在一個侵入事件被檢測到并被清除后,侵入檢測引腳TAMPER應(yīng)該被禁止。然后,在再次寫入備份數(shù)據(jù)寄存器前重新用TPE位啟動侵入檢測功能。這樣,可以阻止軟件在侵入檢測引腳上仍然有侵入事件時對備份數(shù)據(jù)寄存器進行寫操作。這相當(dāng)于對侵入引腳TAMPER進行電平檢測。
注:當(dāng)V DD電源斷開時,侵入檢測功能仍然有效。為了避免不必要的復(fù)位數(shù)據(jù)備份寄存器,TAMPER引腳應(yīng)該在片外連接到正確的電平。
顯然,Tamper需要硬件與之配合。以上數(shù)據(jù)手冊描述了硬件配置時的一些注意事項。
(1) 可以是把引腳由低電平到高電平認(rèn)為是一次侵入,也可以把引腳從高電平變到低電平認(rèn)為是一次侵入,這通過TPAL來設(shè)置。
?。?) Tamper機制需要被啟動才能起作用。但在啟動之前,如果引腳已處于設(shè)定的狀態(tài),那么一旦啟動,就會產(chǎn)生一次Tamper事件,這需要注意,否則會引起數(shù)據(jù)的意外丟失而不自覺。
(3) 即便芯片上的VDD電源斷開,(只要仍有VBAT),那么Tamper檢測仍是有效的,因此,設(shè)計硬件時必須要小心,如果某設(shè)計是將Tamper引腳通過上拉電阻接VDD,并在這個引腳上接入機械開關(guān)到地。如果開關(guān)導(dǎo)通,那么就是一次Tamper事件,這個沒有問題。但是,如果電源斷開(VDD變低),也會引發(fā)一次Tamper事件,而這往往并不是設(shè)計都的本意。因此,這個引腳的上拉電阻必須接到VBAT而不是接到VDD。
?。?) 總的來說,TAMPER并不復(fù)雜,下面來看一看代碼。
這次是用的STM32庫中的這個例子。
有關(guān)LED的設(shè)置,這里就不再重復(fù)了,和上一篇文章(數(shù)據(jù)的保存與毀滅(1)相同)。
/* Enable write access to Backup domain */
PWR_BackupAccessCmd(ENABLE);
這是打開BKP功能。
/* Clear Tamper pin Event(TE) pending flag */
BKP_ClearFlag();
清除Tamper事件
/* Tamper pin active on low level */
BKP_TamperPinLevelConfig(BKP_TamperPinLevel_Low);
配置Tamper引腳究竟是高電平有效還是低電平有效,這個再研究一下,繼續(xù)跟蹤:
/**
* @brief Configures the Tamper Pin active level.
* @param BKP_TamperPinLevel: specifies the Tamper Pin active level.
* This parameter can be one of the following values:
* @arg BKP_TamperPinLevel_High: Tamper pin active on high level
* @arg BKP_TamperPinLevel_Low: Tamper pin active on low level
* @retval None
*/
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel)
{
/* Check the parameters */
assert_param(IS_BKP_TAMPER_PIN_LEVEL(BKP_TamperPinLevel));
*(__IO uint32_t *) CR_TPAL_BB = BKP_TamperPinLevel;
}
CR_TPAL_BB又是什么呢?
/* Alias word address of TPAL bit */
#define CR_OFFSET (BKP_OFFSET + 0x30)
#define TPAL_BitNumber 0x01
#define CR_TPAL_BB (PERIPH_BB_BASE + (CR_OFFSET * 32) + (TPAL_BitNumber * 4))
要看懂上面有關(guān)CR_TPAL_BB的相關(guān)定義及理解為何這樣寫,恐怕又要涉及到Contex的另一個重要內(nèi)容,即bit-band,這個暫不深究,留待下次學(xué)習(xí)(說句閑話:bit-bank我早就看到,就是沒有興趣深入了解,因為沒覺得什么地方有用到,今天既已知其用途,改日必去改看,,,所以只有動起來,才能學(xué)更多的東西)。這里只管當(dāng)它是能夠直接設(shè)定該平是0或都是1就行了。
即根據(jù)實參決定BKP_CR中的TPAL究竟是0還是1??蛇x參數(shù)為:
#define BKP_TamperPinLevel_High ((uint16_t)0x0000)
#define BKP_TamperPinLevel_Low ((uint16_t)0x0001)
BKP的其他用途:
BKP的寄存器可以用來存儲RTC校驗值的校驗寄存器。
在PC13管腳(當(dāng)該管腳不用于侵入檢測時)上輸出RTC校準(zhǔn)時鐘,RTC鬧鐘脈沖或者秒脈沖
為方便測量,RTC時鐘可以經(jīng)64分頻輸出到侵入檢測引腳TAMPER上。通過設(shè)置RTC校驗寄存器(BKP_RTCCR)的CCO位來開啟這一功能。 通過配置CAL[6:0]位,此時鐘可以最多減慢121ppm。
下面以RTC的那個例子為例,來看一看如何用Tamper(PC13)引腳來送出信號。
/* 打開PWR和KBP模塊的時鐘信號 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/*允許對BKP進行存取*/
PWR_BackupAccessCmd(ENABLE);
/* 禁止引腳的TAMPER功能*/
BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */
/* 允許時鐘信號在TAMPER引腳輸出*/
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
這樣就可以了,也不復(fù)雜。
需要說明的一點是,PC13這個引腳不需要被配置成輸出引腳,但在這一時刻它是起到輸出作用的。
BKP_RTCOutputConfig()這個函數(shù)中所用到的參數(shù)可以有這樣的一些:
BKP_RTCOutputSource_None
不允許在Tamper引腳輸出信號
BKP_RTCOutputSource_CalibClock
在Tamper引腳上輸出RTC時鐘經(jīng)64分頻后的頻率信號
BKP_RTCOutputSource_Alarm
在Tamper引腳上輸出RTC報警信號
RTCOutputSource_Second
在Tamper引腳上輸出秒信號
經(jīng)測試,
(1)在Tamper引腳上輸出的信號,不受復(fù)位的影響!當(dāng)然,這是有條件的,條件是復(fù)位時不會執(zhí)行到操作RTC的相關(guān)代碼。
?。?) 在用J-LINK寫入代碼時,Tamper引腳輸出的信號,不受影響,照樣輸出!
(3)斷電之后再上電,Tamper引腳送出的信號,不受影響,照樣輸出!
?。?) 去掉VBAT供電端的電力供應(yīng),斷電,再上電,Tamper引腳送出的信號消失!
判斷:前面的程序?qū)懙挠嘘P(guān)標(biāo)志被保存在BKP區(qū)域,不斷電不會消失。這是否對電池的壽命有影響呢?畢竟送出波形也會有消耗的。
最后用兩個圖來結(jié)束,分別是運行時的BKP內(nèi)容和POWER,RESET,CLOCK的內(nèi)容。
評論