剛開始接觸cc2530nv時,我查的協議棧api函式,結果發現怎麼也使用不對nv函式,我就開始各種測試,終於在我不懈努力下,弄清楚了nv操作,而且更重要的是,協議棧api函式說明對讀者有誤,在此我跟正一下。
nv就是nonvolatile的縮寫,即為非易失性儲存器,也就是斷電後也不會擦除。在cc2530微控制器中這儲存器稱為flash儲存器。下面我隆重介紹一下這三個api函式。
1. osal_nv_item_init(uint16 id,uint16len,void *buf)
說明:這是nv條目初始化函式,在協議棧中使用nv儲存器是將該儲存器分成很多條目,每個條目都有乙個id號,我是用的是z-stack home 1.2.2a。該協議棧留給使用者的id條目是在zcondef.h檔案中,從0x0401 —0x0fff。
uint16 id:即為你巨集定義0x0401的條目。
uint16 len: 這個是你想儲存在nv裡的資料長度。這個很關鍵!!!如:你要儲存uint8 nv_buff[n],則這個引數即為n,這是協議棧api函式沒有說清楚的地方。
void *buf:這個毫無意義,在接下來的兩個函式中會用到,在這個初始化函式中其值為空,所以null。
2. osal_nv_write(uint16 id, uint16ndx,uint16 len,void *buf)
說明:這是nv寫入函式,就是想要把你的資料寫到nv儲存器中。
uint16 id:還是和你初始化時的條目一樣如0x0401。
uint16 len: 這個是你要寫入資料的長度,很明顯即為nv_buff[n],即為n。
void *buf:這個是你要寫入nv儲存器資料的指標,所以這個引數即為&nv_buff。
3. osal_nv_read(uint16 id,uint16ndx,uint16 len,void *buf)
說明:這是nv讀函式,即將nv儲存器中該id條目下的資料讀取出來,然後存放在*buf中。
id,ndx,len和寫函式一致,但是void*buf的值,你需要建立乙個和nv_buff[n]一樣型別一樣長度的陣列,(假如:uint8 nv_txt[n])則該引數為&nv_txt。
最重要的要來了,試問,怎樣在終端上電後,就能讀取nv條目然後按照上一次儲存在nv儲存器中的引數執行呢?
你需要定義乙個標誌位,在程式燒入進去的時候,你將標誌位寫乙個0,然後終端上電後讀取nv標誌位,如果是0則沒有寫入nv儲存器按照定義的引數執行即可,一旦有新的引數過來,你把引數儲存在nv順便將標誌位賦乙個中間數,也寫入到nv中。如果發生斷電,上電後,終端再次讀取nv中的標誌位時已經不是0了,所以將nv條目下所有的資料讀取出來,按照這個引數執行,即可。
ZStack CC2530 斷電儲存 NV 方法
寫了很久的cc2530 終於要用到斷電儲存功能了。比如,我希望斷電之後,重新上電能把我上次採集的溫度資訊儲存下來。其實很簡單。第一 不要預定義什麼,你只需要看看你的 裡有沒有用到 osal nv init null 來進行nv初始化就好了。查詢位置 zmain.c檔案中的main 函式,如果有就可以...
ZStack CC2530 斷電儲存 NV 方法
寫了很久的cc2530 終於要用到斷電儲存功能了。比如,我希望斷電之後,重新上電能把我上次採集的溫度資訊儲存下來。其實很簡單。第一 不要預定義什麼,你只需要看看你的 裡有沒有用到 osal nv init null 來進行nv初始化就好了。查詢位置 zmain.c檔案中的main 函式,如果有就可以...
外部中斷 CC2530
中斷在計算機組成中都有詳細介紹。中斷分為外部中斷和內部中斷。對於cc2530片上系統來說,通用i o引腳設定為輸出時候,可以用於產生中斷,可以設定為外部訊號的上公升或下降沿出發。p0,p1,p2都有中斷使能位。對於ien1 2暫存器內的埠所有的位都是公共的。此外還包括其他很多態別的中斷 除了公共中斷...