引言
在 STM32 的應(yīng)用中,SPI 算是用的比較多的外設(shè)了,也是單片機(jī)最常見外設(shè)之一??蛻粽f它執(zhí)行了關(guān)閉 SPI 的代碼,竟然會(huì)導(dǎo)致 Flash 中的 WRPERR 標(biāo)志置位,致使應(yīng)用碰到一些問題。這就奇怪了,SPI 和內(nèi)部 Flash 看起來是風(fēng)馬牛不相及的事情,為什么會(huì)發(fā)生這種事呢?一起來看看吧。
問題
客戶在使用 STM32L072RBT6 的時(shí)候,使用 STM32CubeL0 庫,在程序編寫時(shí),發(fā)現(xiàn)執(zhí)行關(guān)閉 SPI 代碼時(shí),會(huì)導(dǎo)致 Flash 的寫保護(hù)錯(cuò)誤標(biāo)志 WRPERR 置位,導(dǎo)致其后面準(zhǔn)備寫 EEPROM 的時(shí)候,就無法對(duì) EEPROM 寫入了。
問題解決
本來客戶的代碼就沒有必要這么寫,因?yàn)?SPI 都沒初始化,對(duì)它進(jìn)行關(guān)閉并沒有什么意義。
小結(jié)
在用戶代碼中,SpiHandle 只是定義了 SPI_HandleTypeDef 結(jié)構(gòu)體,其各種參數(shù)并還沒有進(jìn)行實(shí)際初始化。在沒有初始化的前提下,對(duì)其進(jìn)行操作是不對(duì)的,也是危險(xiǎn)的,應(yīng)該在寫代碼的時(shí)候引起重視。
使用 HAL 庫的時(shí)候,如果要對(duì)一個(gè)外設(shè)進(jìn)行任何的操作,請(qǐng)務(wù)必記得它是被初始化過的。否則,出了問題可能都不一定知道。