无刷电机小车开发记录02——BSP导入RT-Thread Studio

前情提要
上一篇文章记录了一下如何创建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电路中功率管驱动的尖峰