前情提要
上一篇文章记录了一下如何创建gd32e503的bsp。但由于时间关系只实现了mdk版本的工程模板,后面如果需要提交bsp时再去补全iar版本的。但对于我个人而言,iar只在读书时玩蓝牙开发的时候用过,而mdk虽然用的比较多但最近几年也很少用了。感觉还是vscode等编辑器用起来更舒服一些,而对于rtt系统的开发,我个人还是更倾向于使用官方的rtthreadstudioide进行开发。于是今天想想办法怎么移到rttstudio上去。
面临的问题
上篇文章已经发现,目前官方的固件库竟然没有gcc版本的启动文件,所以要想办法弄个启动文件
rttstudio自带的gcc编译器版本太老,不支持编译m33内核,所以要升级gcc
计划用开源的dap调试器进行调试,但同样rttstudio自带的pyocd调试工具版本太老,需要升级
添加gcc版本的启动文件
拷贝启动文件模板
从gd32f4xx固件包内把gcc文件夹拷贝到新添加的gde50x固件包的对应位置,并把汇编文件名称修改为gd32e50x的,注意,gd32e50x分了高密度版(hd)和互联版(cl),我这里暂且只修改了一份我用到的高密度版本的。cl版本的也类似修改即可。
修改启动文件
众所周知,汇编的启动文件要干的事情就是做一些芯片启动的前期初始化工作,搭建c代码的运行环境。所以这里也并不需要对照汇编指令,把每条语句的功能都搞明白,只需大致了解一下即可。一眼望去,感觉这个汇编文件主要做了三大事情。
第一,定义中断向量;
第二,定义启动入口;
第三,声明中断函数。
而启动入口相关的不用修改,都是先调用systeminit函数做一些时钟等基础初始化,然后再调用entry或者main函数执行后续的代码。
所以这里主要修改的就是中断向量的定义和中断函数的声明,按照armcc版本的进行修改即可:
1; * copyright (c) 2006-2021, rt-thread development team 2; * 3; * spdx-license-identifier: apache-2.0 4; * 5; * change logs: 6; * date author notes 7; * 2018-05-22 tanek first implementation 8; */ 9.syntax unified 10.cpu cortex-m33 11.fpu softvfp 12.thumb 13.global g_pfnvectors 14.global default_handler 15 .section .isr_vector,a,%progbits 16 .type g_pfnvectors, %object 17g_pfnvectors: 18 .word _estack // top of stack 19 .word reset_handler // reset handler 20 .word nmi_handler // nmi handler 21 .word hardfault_handler // hard fault handler 22 .word memmanage_handler // mpu fault handler 23 .word busfault_handler // bus fault handler 24 .word usagefault_handler // usage fault handler 25 .word 0 // reserved 26 .word 0 // reserved 27 .word 0 // reserved 28 .word 0 // reserved 29 .word svc_handler // svcall handler 30 .word debugmon_handler // debug monitor handler 31 .word 0 // reserved 32 .word pendsv_handler // pendsv handler 33 .word systick_handler // systick handler 34 // external interrupts handler 35 .word wwdgt_irqhandler // 16:window watchdog timer 36 .word lvd_irqhandler // 17:lvd through exti line detect 37 .word tamper_irqhandler // 18:tamper through exti line detect 38 .word rtc_irqhandler // 19:rtc through exti line 39 .word fmc_irqhandler // 20:fmc 40 .word rcu_ctc_irqhandler // 21:rcu and ctc 41 .word exti0_irqhandler // 22:exti line 0 42 .word exti1_irqhandler // 23:exti line 1 43 .word exti2_irqhandler // 24:exti line 2 44 .word exti3_irqhandler // 25:exti line 3 45 .word exti4_irqhandler // 26:exti line 4 46 .word dma0_channel0_irqhandler // 27:dma0 channel0 47 .word dma0_channel1_irqhandler // 28:dma0 channel1 48 .word dma0_channel2_irqhandler // 29:dma0 channel2 49 .word dma0_channel3_irqhandler // 30:dma0 channel3 50 .word dma0_channel4_irqhandler // 31:dma0 channel4 51 .word dma0_channel5_irqhandler // 32:dma0 channel5 52 .word dma0_channel6_irqhandler // 33:dma0 channel6 53 .word adc0_1_irqhandler // 34:adc0 and adc1 54 .word usbd_hp_can0_tx_irqhandler // 35:usbd hp or can0 tx 55 .word usbd_lp_can0_rx0_irqhandler // 36:usbd lp or can0 rx0 56 .word can0_rx1_irqhandler // 37:can0 rx1 57 .word can0_ewmc_irqhandler // 38:can0 ewmc 58 .word exti5_9_irqhandler // 39:exti5 to exti9 59 .word timer0_brk_timer8_irqhandler // 40:timer0 break and timer8 60 .word timer0_up_timer9_irqhandler // 41:timer0 update and timer9 61 .word timer0_trg_cmt_timer10_irqhandler // 42:timer0 trigger and commutation and timer10 62 .word timer0_channel_irqhandler // 43:timer0 channel capture compare 63 .word timer1_irqhandler // 44:timer1 64 .word timer2_irqhandler // 45:timer2 65 .word timer3_irqhandler // 46:timer3 66 .word i2c0_ev_irqhandler // 47:i2c0 event 67 .word i2c0_er_irqhandler // 48:i2c0 error 68 .word i2c1_ev_irqhandler // 49:i2c1 event 69 .word i2c1_er_irqhandler // 50:i2c1 error 70 .word spi0_irqhandler // 51:spi0 71 .word spi1_i2s1add_irqhandler // 52:spi1 or i2s1add 72 .word usart0_irqhandler // 53:usart0 73 .word usart1_irqhandler // 54:usart1 74 .word usart2_irqhandler // 55:usart2 75 .word exti10_15_irqhandler // 56:exti10 to exti15 76 .word rtc_alarm_irqhandler // 57:rtc alarm 77 .word usbd_wkup_irqhandler // 58:usbd wakeup 78 .word timer7_brk_timer11_irqhandler // 59:timer7 break and timer11 79 .word timer7_up_timer12_irqhandler // 60:timer7 update and timer12 80 .word timer7_trg_cmt_timer13_irqhandler // 61:timer7 trigger and commutation and timer13 81 .word timer7_channel_irqhandler // 62:timer7 channel compare 82 .word adc2_irqhandler // 63:adc2 83 .word exmc_irqhandler // 64:exmc 84 .word sdio_irqhandler // 65:sdio 85 .word timer4_irqhandler // 66:timer4 86 .word spi2_i2s2add_irqhandler // 67:spi2 or i2s2add 87 .word uart3_irqhandler // 68:uart3 88 .word uart4_irqhandler // 69:uart4 89 .word timer5_dac_irqhandler // 70:timer5 and dac0 dac1 underrun error 90 .word timer6_irqhandler // 71:timer6 91 .word dma1_channel0_irqhandler // 72:dma1 channel0 92 .word dma1_channel1_irqhandler // 73:dma1 channel1 93 .word dma1_channel2_irqhandler // 74:dma1 channel2 94 .word dma1_channel3_4_irqhandler // 75:dma1 channel3 and channel4 95 .word 0 // 76:reserved 96 .word 0 // 77:reserved 97 .word 0 // 78:reserved 98 .word can1_tx_irqhandler // 79:can1 tx 99 .word can1_rx0_irqhandler // 80:can1 rx0 100 .word can1_rx1_irqhandler // 81:can1 rx1 101 .word can1_ewmc_irqhandler // 82:can1 ewmc 102 .word 0 // 83:reserved 103 .word 0 // 84:reserved 104 .word shrtimer_irq2_irqhandler // 85:shrtimer irq2 105 .word shrtimer_irq3_irqhandler // 86:shrtimer irq3 106 .word shrtimer_irq4_irqhandler // 87:shrtimer irq4 107 .word shrtimer_irq5_irqhandler // 88:shrtimer irq5 108 .word shrtimer_irq6_irqhandler // 89:shrtimer irq6 109 .word 0 // 90:reserved 110 .word 0 // 91:reserved 111 .word shrtimer_irq0_irqhandler // 92:shrtimer irq0 112 .word shrtimer_irq1_irqhandler // 93:shrtimer irq1 113 .word 0 // 94:reserved 114 .word 0 // 95:reserved 115 .word 0 // 96:reserved 116 .word 0 // 97:reserved 117 .word i2c2_ev_irqhandler // 98:i2c2 event 118 .word i2c2_er_irqhandler // 99:i2c2 error 119 .word usart5_irqhandler // 100:usart5 120 .word i2c2_wkup_irqhandler // 101:i2c2 wakeup 121 .word usart5_wkup_irqhandler // 102:usart5 wakeup 122 .word 0 // 103:reserved 123 .size g_pfnvectors, .-g_pfnvectors 124 .section .text.reset_handler 125 .weak reset_handler 126 .type reset_handler, %function 127reset_handler: 128 ldr r1, =_sidata 129 ldr r2, =_sdata 130 ldr r3, =_edata 131 subs r3, r2 132 ble fill_bss_start 133loop_copy_data: 134 subs r3, #4 135 ldr r0, [r1,r3] 136 str r0, [r2,r3] 137 bgt loop_copy_data 138fill_bss_start: 139 ldr r1, =__bss_start 140 ldr r2, =__bss_end 141 movs r0, 0 142 subs r2, r1 143 ble startup_enter 144loop_fill_bss: 145 subs r2, #4 146 str r0, [r1, r2] 147 bgt loop_fill_bss 148startup_enter: 149 bl systeminit 150 bl entry 151 /* exception handlers */ 152 .weak nmi_handler 153 .type nmi_handler, %function 154nmi_handler: 155 b . 156 .size nmi_handler, . - nmi_handler 157 .weak memmanage_handler 158 .type memmanage_handler, %function 159memmanage_handler: 160 b . 161 .size memmanage_handler, . - memmanage_handler 162 .weak busfault_handler 163 .type busfault_handler, %function 164busfault_handler: 165 b . 166 .size busfault_handler, . - busfault_handler 167 .weak usagefault_handler 168 .type usagefault_handler, %function 169usagefault_handler: 170 b . 171 .size usagefault_handler, . - usagefault_handler 172 .weak svc_handler 173 .type svc_handler, %function 174svc_handler: 175 b . 176 .size svc_handler, . - svc_handler 177 .weak debugmon_handler 178 .type debugmon_handler, %function 179debugmon_handler: 180 b . 181 .size debugmon_handler, . - debugmon_handler 182 .weak pendsv_handler 183 .type pendsv_handler, %function 184pendsv_handler: 185 b . 186 .size pendsv_handler, . - pendsv_handler 187 .weak systick_handler 188 .type systick_handler, %function 189systick_handler: 190 b . 191 .size systick_handler, . - systick_handler 192 /* iqr handler */ 193 .section .text.default_handler,ax,%progbits 194 .type default_handler, %function 195default_handler: 196 b . 197 .size default_handler, . - default_handler 198 .macro irq handler 199 .weak handler 200 .set handler, default_handler 201 .endm 202 irq wwdgt_irqhandler 203 irq lvd_irqhandler 204 irq tamper_irqhandler 205 irq rtc_irqhandler 206 irq fmc_irqhandler 207 irq rcu_ctc_irqhandler 208 irq exti0_irqhandler 209 irq exti1_irqhandler 210 irq exti2_irqhandler 211 irq exti3_irqhandler 212 irq exti4_irqhandler 213 irq dma0_channel0_irqhandler 214 irq dma0_channel1_irqhandler 215 irq dma0_channel2_irqhandler 216 irq dma0_channel3_irqhandler 217 irq dma0_channel4_irqhandler 218 irq dma0_channel5_irqhandler 219 irq dma0_channel6_irqhandler 220 irq adc0_1_irqhandler 221 irq usbd_hp_can0_tx_irqhandler 222 irq usbd_lp_can0_rx0_irqhandler 223 irq can0_rx1_irqhandler 224 irq can0_ewmc_irqhandler 225 irq exti5_9_irqhandler 226 irq timer0_brk_timer8_irqhandler 227 irq timer0_up_timer9_irqhandler 228 irq timer0_trg_cmt_timer10_irqhandler 229 irq timer0_channel_irqhandler 230 irq timer1_irqhandler 231 irq timer2_irqhandler 232 irq timer3_irqhandler 233 irq i2c0_ev_irqhandler 234 irq i2c0_er_irqhandler 235 irq i2c1_ev_irqhandler 236 irq i2c1_er_irqhandler 237 irq spi0_irqhandler 238 irq spi1_i2s1add_irqhandler 239 irq usart0_irqhandler 240 irq usart1_irqhandler 241 irq usart2_irqhandler 242 irq exti10_15_irqhandler 243 irq rtc_alarm_irqhandler 244 irq usbd_wkup_irqhandler 245 irq timer7_brk_timer11_irqhandler 246 irq timer7_up_timer12_irqhandler 247 irq timer7_trg_cmt_timer13_irqhandler 248 irq timer7_channel_irqhandler 249 irq adc2_irqhandler 250 irq exmc_irqhandler 251 irq sdio_irqhandler 252 irq timer4_irqhandler 253 irq spi2_i2s2add_irqhandler 254 irq uart3_irqhandler 255 irq uart4_irqhandler 256 irq timer5_dac_irqhandler 257 irq timer6_irqhandler 258 irq dma1_channel0_irqhandler 259 irq dma1_channel1_irqhandler 260 irq dma1_channel2_irqhandler 261 irq dma1_channel3_4_irqhandler 262 irq can1_tx_irqhandler 263 irq can1_rx0_irqhandler 264 irq can1_rx1_irqhandler 265 irq can1_ewmc_irqhandler 266 irq shrtimer_irq2_irqhandler 267 irq shrtimer_irq3_irqhandler 268 irq shrtimer_irq4_irqhandler 269 irq shrtimer_irq5_irqhandler 270 irq shrtimer_irq6_irqhandler 271 irq shrtimer_irq0_irqhandler 272 irq shrtimer_irq1_irqhandler 273 irq i2c2_ev_irqhandler 274 irq i2c2_er_irqhandler 275 irq usart5_irqhandler 276 irq i2c2_wkup_irqhandler 277 irq usart5_wkup_irqhandler
导入rttstudioide
导入工程
有了gcc版本的启动文件,那不妨先用rttstudio导入一下工程,然后再根据错误想办法解决。点击“文件”菜单内的“导入”图标,打开导入对话框:
选择“rt-thread bsp到工作空间中”,然后点击下一步按钮:
根据自己的实际情况填写内容,然后点击“完成按钮”进行导入:
如下是我导入后的项目资源列表,会把所需的内容都拷贝到工程内部:
编译根据错误解决问题
不妨先编译一下工程,发现报了一些错误,这是必然的,因为还有很多操作没做呢。那首当其冲的错误就是如下的gcc不支持m33内核的问题。
1arm-none-eabi-gcc: error: unrecognized argument in option '-mcpu=cortex-m33+nodsp' 2arm-none-eabi-gcc: note: valid arguments to '-mcpu=' are: arm1020e arm1020t arm1022e arm1026ej-s arm10e arm10tdmi arm1136j-s arm1136jf-s arm1156t2-s arm1156t2f-s arm1176jz-s arm1176jzf-s arm2 arm250 arm3 arm6 arm60 arm600 arm610 arm620 arm7 arm70 arm700 arm700i arm710 arm7100 arm710c arm710t arm720 arm720t arm740t arm7500 arm7500fe arm7d arm7di arm7dm arm7dmi arm7m arm7tdmi arm7tdmi-s arm8 arm810 arm9 arm920 arm920t arm922t arm926ej-s arm940t arm946e-s arm966e-s arm968e-s arm9e arm9tdmi cortex-a12 cortex-a15 cortex-a15.cortex-a7 cortex-a17 cortex-a17.cortex-a7 cortex-a5 cortex-a53 cortex-a57 cortex-a57.cortex-a53 cortex-a7 cortex-a72 cortex-a72.cortex-a53 cortex-a8 cortex-a9 cortex-m0 cortex-m0.small-multiply cortex-m0plus cortex-m0plus.small-multiply cortex-m1 cortex-m1.small-multiply cortex-m3 cortex-m4 cortex-m7 cortex-r4 cortex-r4f cortex-r5 cortex-r7 cortex-r8 ep9312 exynos-m1 fa526 fa606te fa626 fa626te fa726te fmp626 generic-armv7-a iwmmxt iwmmxt2 marvell-pj4 mpcore mpcorenovfp native strongarm strongarm110 strongarm1100 strongarm1110 xgene1 xscale 3make: *** [rt-thread/src/subdir.mk rt-thread/src/clock.o] error 1
更新gcc
去arm官网,下载最新版本的gcc-arm-none-eabi:
gcc下载地址: https://developer.arm.com/downloads/-/gnu-rm
把解压后的gcc文件夹拷贝到rttstudio的gcc工具路径内,为了减小点路径长度,可以把文件夹名字重命名为”10.3”:
点击“构建配置”工具图标,打开配置对话框,在“设置”栏的“toolchains”图页内就可以配置gcc相关信息了。gcc应该是向下兼容的,这里不妨选择”global”进行全局设置:
点击“浏览”按钮,选择刚加入的gcc工具路径,要选择到里面的bin级目录:
添加“cmsis_gcc.h”头文件
点击“应用并关闭”按钮,完成修改,再次编译,发现之前不支持m33内核的错误不见了。不过错误反而变多了,也很正常,因为之前就没进行到gcc编译这一步,很多错误自然出现不了,不用着急,先看第一个错误:
1d:rt-threadstudioworkspacefoc_minicarlibrariesgd32e50x_firmware_librarycmsis/cmsis_compiler.h:54:12: fatal error: cmsis_gcc.h: no such file or directory 2 54 | #include cmsis_gcc.h
报的是固件库缺少“cmsis_gcc.h”文件。也对,官方固件并没有做gcc的支持,怎么会有这个头文件呢。那继续从其它固件那里拷贝一份到当前工程内即可,当然为了之前做的bsp的完整性,也可以同时往其对应位置拷贝一份:
再次编译,呕吼!错误更多了,依然不急,先看第一个错误:
1d:rt-threadstudioworkspacefoc_minicarlibrariesgd32e50x_firmware_librarycmsis/core_cm33.h:2668:10: fatal error: mpu_armv8.h: no such file or directory 2 2668 | #include mpu_armv8.h
提示找不到”mpu_armv8.h”头文件。这里比较奇怪,m33内核确实属于armv8架构,但官方固件库内却找不到此头文件,倒是在其它的bsp内搜到了此头文件,于是随便拷贝一个到工程内即可,比如我是从瑞萨的一个bsp内拷贝的。当然,这里也可以关掉mpu的配置宏,不用mpu。
于是再次进行编译,就会发现编译通过了:
更新pyocd
那不妨下载一下试试,不出意外自然会出现意外,果真不能正常下载。原因就是最开始提到的自带的pyocd版本太老了,不支持gd32e503rc的器件。需要更新pyocd:
打开cmd命令窗口,运行如下命令,安装新的pyocd:
等待安装完毕,就可以在python的安装路径下找到新的”pyocd.exe”
在终端输入“pyocd -v”命令,可查看到新安装pyocd的版本。还可以输入“pyocd list —targets”命令查看目前pyocd支持的器件。
最后会发现,默认并不支持兆易创新的器件,所以,还需要自己添加支持包:
安装完后,再查看安装包和支持的器件,就能找到gd32了:
最后再修改一些rttstudio的工程配置,选择先安装的pyocd.exe和pyocd-gdbserver.exe:
然后再尝试一些烧写,就可以正常下载甚至调试程序了:
相关链接
本系列首篇文章链接:
https://club.rt-thread.org/ask/article/5c0c4ba7eb4ab1ad.html
———————end———————
点击阅读原文进入官网
原文标题:无刷电机小车开发记录02——bsp导入rt-thread studio
文章出处:【微信公众号:rtthread物联网操作系统】欢迎添加关注!文章转载请注明出处。
日月光营收下滑 电子代工服务业绩可望增近
11月1日起,购买Vive不再附赠Tilt Brush
商汤科技发布SenseAuto智能汽车解决方案,开放赋能助智能汽车“自我进化”
英特尔携新芯片如猛虎之势直压AMD,AMD恐无法阻击,股价下滑60%
通过C8051F021单片机和CPLD器件实现全自动对接焊控制系统的设计
无刷电机小车开发记录02——BSP导入RT-Thread Studio
RapidIO针对低延迟处理器连接进行优化
当前AI芯片应该关注的是什么
讯飞智能AI键盘D1:融合语音识别与智能交互的前沿科技产品
EMC现场测试的一般步骤和注意事项有哪些?
绝缘轴承的应用领域,它一般用在什么地方
OLED拼接屏:OLED显示技术是什么意思?
通过USB或PoE为物联网端点供电解决方案
ABB电气公布2022业务业绩
用于蚀刻冲洗和干燥MEMS晶片的最佳工艺条件实验报告
SMI有两款新的SSD控制器随机性能怎么样?
硬件仿真系列 | 如何定义当代Emulator?
区块链在银行业中的应用和潜力
索尼Xperia10Plus评测 更像是面向小众或者粉丝的手机
半桥LLC电路中功率管驱动的尖峰