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