您好,如題,我新建一個工程去dump某段Flash的數(shù)據
地址以兩個字節(jié)的方式遞增,兩個字節(jié)的方式讀取沒有任何問題 ,但是以4字節(jié)讀取就會導致MCU重啟,地址以4字節(jié)遞增4字節(jié)讀取也沒有問題,請問這是什么原因?
? ? ? ? ? ? ?
您好,如題,我新建一個工程去dump某段Flash的數(shù)據
地址以兩個字節(jié)的方式遞增,兩個字節(jié)的方式讀取沒有任何問題 ,但是以4字節(jié)讀取就會導致MCU重啟,地址以4字節(jié)遞增4字節(jié)讀取也沒有問題,請問這是什么原因?
? ? ? ? ? ? ?
您好,這邊測試暫時沒遇到你的問題,若方便可將你的工程發(fā)我郵箱(lzs@wch.cn),這邊具體看一下
您好,您代碼里應該讀的是addr地址里的值而不是rdaddr吧?
我的模板是空的,只是加了這些代碼
#define OEM_INF_SIZE? ? ? ? ? ? ? ((uint32_t)0x1000ul)
#define OEM_INF_ADDR? ? ? ? ? ? ? (0x8027000ul)
?Delay_Ms(1000);
? ? ? ? printf("16 Read\r\n");
? ? ? ?for (uint32_t i = 0; i < OEM_INF_SIZE; i += 2)
? ? ? ?{
? ? ? ? ? ?printf("addr:%x? ? data:%x\r\n",(uint32_t*)(OEM_INF_ADDR + i),*((uint16_t*)(OEM_INF_ADDR + i)));
? ? ? ?}
? ? ? ?printf("32 Read\r\n");
? ? ? ?for (uint32_t i = 0; i < OEM_INF_SIZE; i += 2)
? ? ? ?{
? ? ? ? ? ?printf("addr:%x? ? data:%x\r\n",(uint32_t*)(OEM_INF_ADDR + i),*((uint32_t*)(OEM_INF_ADDR + i)));
? ? ? ?}
您好,感謝指出,讀的那地方確實錯了,改過來之后復現(xiàn)你的問題,不停重啟是因為進HardFault了,在HardFault中斷中有系統(tǒng)復位,所以不停重啟,這邊打印看了一下具體原因,如下圖,是由于加載地址不對齊導致進的HardFault,建議32位讀的時候地址每次加4,這樣就不會有問題了。
感謝您的解答,但是我還是不太理解,你的意思是如果我想以4字節(jié)讀取,就必須以4字節(jié)遞增地址,2字節(jié)讀取就必須以2字節(jié)遞增嗎?
我在ST一些系列的芯片中,以任意地址遞增,都可以以任意字節(jié)訪問數(shù)據的,我的代碼就是從ST移植過來發(fā)現(xiàn)這個問題的,請問是V208的內核不支持這種操作嗎?還是說是其他問題?
您好,這個應該跟ARM支持非對齊訪問、RISC-V不支持非對齊訪問有關,不過你可以按照下圖方法試一下解決該問題,我測試應該是沒問題的,如下圖:
感謝解答?。?!這樣確實可以了。