CH32V103的IAP問(wèn)題(跳轉(zhuǎn)及中斷向量表重定位)

現(xiàn)在在做CH32F103到CH32V103的移植,原先程序有做IAP。但是切換到RISC-V之后指令不知如何轉(zhuǎn)換:

1、跳轉(zhuǎn):RISC-V沒(méi)有__set_MSP指令,如何處理?跳轉(zhuǎn)地址要+4嗎?

? ? Jump_To_Application = (pFunction)(*(vu32*)(APP_BASE + 4));

? ? __set_MSP(*(vu32*)APP_BASE);?

? ? Jump_To_Application();


2、中斷向量重新映射:RISC-V沒(méi)有這條指令,如何處理呢?

? ? ?NVIC_SetVectorTable(。。。)


3、ld文件中ROM起始地址0x00000000,改成0x08000000是否也可以,我看規(guī)格書(shū)說(shuō)兩個(gè)程序的啟動(dòng)地址一樣?


icon_rar.gif軟復(fù)位進(jìn)IAP_CH32V103.zip

你好,CH32V103 IAPdemo可見(jiàn)附件,LD文件中FLASH起始地址需設(shè)置成0,編譯器會(huì)自動(dòng)加0x08000000.


好的感謝。不過(guò)關(guān)于LD中起始地址設(shè)置為0問(wèn)題,那么我在程序中要擦除FLASH地址20K后的刪除。程序中的地址指針我是要設(shè)置成0x08005000還是x00005000?


另外CH32V的沒(méi)有USBD,只有USBHD,但是我發(fā)現(xiàn)USB喚醒中斷USBWakeUp_IRQHandler仍然保留,USBHD喚醒時(shí)也能響應(yīng)此中斷嗎?


你好,如果在程序中要擦除FLASH地址20K后的數(shù)據(jù),地址應(yīng)該設(shè)置為0x08005000,關(guān)于USBWakeUp_IRQHandler函數(shù),USBHD喚醒能響應(yīng)該中斷


我碰到到同樣的問(wèn)題:中斷向量重新映射?

2、中斷向量重新映射:RISC-V沒(méi)有這條指令,如何處理呢?

? ? ?NVIC_SetVectorTable(。。。) //RISC-V沒(méi)有這條指令

CH32V103 IAPdemo附件中,? USERCODE部分沒(méi)有處理中斷的實(shí)例代碼, 如果加入中斷,中斷入口基地址如何設(shè)定??
不設(shè)定是不是跳到 BOOT的中斷入口?


我實(shí)際使用的芯片是CH32V307VCT6 ,在數(shù)據(jù)手冊(cè)中找一個(gè)異常入口基地址寄存器(MTVEC)

專(zhuān)用CSR 寄存器

但在CH32V307VCT6 EVT中找不到它的定義,也不知如何使用,提示需要系統(tǒng)在機(jī)器模式下才能訪(fǎng)問(wèn)。

手冊(cè)中也沒(méi)有解答,何為機(jī)器模式,如何進(jìn)入,如何退出?

666.jpg

是不是 在LD文件中設(shè)定好 0x00005000開(kāi)始地址后,編譯器在初始化程序中自動(dòng)設(shè)定好中斷向量基地址,IAP不用管它?


您好,CH32V307的IAP升級(jí)基本和CH32V103類(lèi)似,在LD文件里設(shè)置FLASH起始地址后中斷向量會(huì)自動(dòng)偏移,IAP不用管它,具體例程可參考2樓附件,關(guān)于所問(wèn)機(jī)器模式,屬于RISC-V架構(gòu)定義的3種工作模式之一,為必選模式,其具體介紹可參考RISC-V特權(quán)架構(gòu)文檔,附件如下:

icon_pdf.gifriscv-privileged.pdf



說(shuō)明中,最好講一講向量表的切換原理,不知原理用著不放心。

找了很久,最后在初始化代碼startup_CH32v30x.s中找到,編譯后自動(dòng)設(shè)置中斷向量偏移地址




?/*?Enable?floating?point?and?interrupt?*/
???li?t0,?0x6088???????????
???csrs?mstatus,?t0
?la?t0,?_vector_base
????ori?t0,?t0,?3

csrw mtvec, t0



我也正在解決這個(gè)中斷重新定位的問(wèn)題。不知怎么解決?



經(jīng)電話(huà)溝通,地址設(shè)置錯(cuò)誤,問(wèn)題已經(jīng)解決@蘇海林


官方EVT里面自帶的ld文件設(shè)置FLASH地址在0x00000000是不科學(xué)的,F(xiàn)LASH實(shí)際地址在0x08000000,ld文件也應(yīng)該設(shè)置到0x08000000

雖然編譯生成的bin文件沒(méi)有地址,但是hex文件是有地址的,顯然起始地址0x00000000和0x08000000完全不同。

正確做法是ld文件中設(shè)置FLASH起始地址為0x08000000,然后在startup文件中增加以下代碼:

.section.init,"ax",@progbits

.global_start

.align1

_start:

lui? a0,0x8000? ? ? ?/* a0 = 0x8000<<12? ?if APP at 0x08005000 set 0x8005*/

jalr 8(a0)? ? ? ? ? ?/* jump to 0x08000008*/

jhandle_reset

.word 0x00000013

.word 0x00000013

雖然默認(rèn)MCU會(huì)把0x08000000處的FLASH映射到0x00000000,用戶(hù)所有的操作仍然應(yīng)該按照0x08000000這個(gè)地址來(lái),不能夠用映射以后的0地址來(lái)操作,這也是STM32代表的ARM芯片的統(tǒng)一做法。


是的,絕對(duì)地址跟相對(duì)地址其實(shí)在使用上都能實(shí)現(xiàn)同樣的效果,我們后面會(huì)將更多的因素考慮進(jìn)來(lái),給用戶(hù)更直觀(guān)更容易理解的界面顯示。


目前使用CH32V307VC做IAP功能,參考這個(gè)軟復(fù)位進(jìn)IAP_CH32V103.zip?例程,然而程序無(wú)法跳轉(zhuǎn),app只需要修改Ld文件的地址嗎?還有沒(méi)有其它地方需要修改?boot loader程序已經(jīng)參考?xì)v程加入跳轉(zhuǎn)代碼。


已解決問(wèn)題,只需要修改應(yīng)用程序的Ld文件的flash起始地址,我的問(wèn)題是在寫(xiě)錯(cuò)跳轉(zhuǎn)的中斷函數(shù),V103的跟V307的不一樣;其它的按照樓上即可


請(qǐng)問(wèn)一下307 具體怎么設(shè)置跳轉(zhuǎn)呢,我按照上面的工程配置,發(fā)現(xiàn)跳轉(zhuǎn)不成功。希望能解答一下謝謝


?您好,附件為CH32V307 IAP例程,可以參考一下。

icon_rar.gifCHV307 IAP.zip



@悠悠哥

今天看了下這個(gè)帖子,感謝對(duì)于RISCV芯片IAP中斷跳轉(zhuǎn)的研究,說(shuō)一下我自己的理解

1 修改LD文件,是IAP必須操作,可以在菜單欄的LD圖標(biāo)修改,有點(diǎn)類(lèi)似修改keil的下載程序IROM的意思

2 中斷向量的搬移或者映射實(shí)際不需要做什么操作,在修改完LD文件后,在startup.s文件內(nèi),有一句加載中斷向量的語(yǔ)句,就是悠悠哥截取的語(yǔ)句

/* enable all interrupt */

? li t0, 0x88

? csrs mstatus, t0

la t0, _vector_base

? ori t0, t0, 1

csrw mtvec, t0

從這個(gè)語(yǔ)句再深挖一下,這個(gè)語(yǔ)句只是加載vector_base到mtvec,并不涉及中斷向量搬移,這樣的話(huà)應(yīng)該是riscv的架構(gòu)支持一個(gè)mtvec的寄存器,這個(gè)寄存器是存著中斷首地址,而不是像arm一樣中斷地址是固定的,所以可以只需要修改ld文件就可以實(shí)現(xiàn)IAP,相對(duì)來(lái)說(shuō)更簡(jiǎn)單一些。

共享下思路,有問(wèn)題請(qǐng)指正,記錄下知識(shí)點(diǎn),后續(xù)可以回溯~


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频