最近在搞430的FLASH的自定義法(利用串口)程序燒寫,燒寫完成后斷電復位,reset按鍵就可以運行新的程序。但是和學長交流了一下,這種方法不夠好,希望有一種軟復位的方式。于是百度了一下,都是些對看門狗進行寫入特殊值使得430的cpu復位。反正個人是沒有采用。
因為在搞程序的燒寫下載,所以看了一下430的BSL。看到里面有一段話,關于從C代碼中啟動BSL的方法。如下:
從一個外部應用中啟動BSL
將程序計數器設定到內存為位置0x1000 來啟動BSL。堆棧一直被復位,而RAM 被清空。應該注意的是,GIE 位未被禁用,所以如果不需要中斷的話,這一步應該通過調用應用來完成,并且如果它們被使用的話,這一步應該從“返回BSL”返回。
由于堆棧被復位,位置0x1000 也可以被作為一個C 功能進行調用,示例代碼如下:
((void (*)())0x1000)()
于是想到,既然可以從C里面跳轉到0x1000,那么也可以跳轉到其他地址,比如復位地址了。
以6638為例。430的復位中斷矢量地址是0xFFFE,里面存儲了將要跳轉的物理地址。6638的代碼區起始地址是0x8000,正常復位是先進入復位中斷,然后PC指針導入地址0x8000,然后從0x8000開始執行代碼。那么軟復位則是,執行((void (*)())0x8000)(),直接PC指針被導入0x8000的地址,而這個地址正好是6638的代碼區起始地址,于是軟復位了。個人分析一下這個指令,如有錯誤敬請大神們指正。
從代碼上講,(void (*)()是一個指向空函數的指針,((void (*)())0x8000)()是將0x8000強制轉換為函數指針后進行函數調用,于是0x8000便被送入了PC指針。
對于其他的430單片,去查其數據手冊FLASH段,弄清其代碼區的開始地址,也可以用這個方法軟復位了。
實測,IAR,CCS下編譯、實踐通過。