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

描述

前情提要


上一篇文章记录了一下如何创建GD32E503的BSP。但由于时间关系只实现了MDK版本的工程模板,后面如果需要提交BSP时再去补全IAR版本的。但对于我个人而言,IAR只在读书时玩蓝牙开发的时候用过,而MDK虽然用的比较多但最近几年也很少用了。感觉还是VSCode等编辑器用起来更舒服一些,而对于RTT系统的开发,我个人还是更倾向于使用官方的RTThreadStudioIDE进行开发。于是今天想想办法怎么移到RTTStudio上去。

 

面临的问题


  1. 上篇文章已经发现,目前官方的固件库竟然没有GCC版本的启动文件,所以要想办法弄个启动文件

  2. RTTStudio自带的GCC编译器版本太老,不支持编译M33内核,所以要升级GCC

  3. 计划用开源的DAP调试器进行调试,但同样RTTStudio自带的pyocd调试工具版本太老,需要升级

 

添加GCC版本的启动文件


拷贝启动文件模板

从GD32F4xx固件包内把GCC文件夹拷贝到新添加的GDE50x固件包的对应位置,并把汇编文件名称修改为gd32e50x的,注意,GD32E50x分了高密度版(hd)和互联版(cl),我这里暂且只修改了一份我用到的高密度版本的。cl版本的也类似修改即可。

RT-Thread

修改启动文件

众所周知,汇编的启动文件要干的事情就是做一些芯片启动的前期初始化工作,搭建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

选择“RT-Thread Bsp到工作空间中”,然后点击下一步按钮:

RT-Thread

根据自己的实际情况填写内容,然后点击“完成按钮”进行导入:

RT-Thread

如下是我导入后的项目资源列表,会把所需的内容都拷贝到工程内部:

RT-Thread

编译根据错误解决问题

不妨先编译一下工程,发现报了一些错误,这是必然的,因为还有很多操作没做呢。那首当其冲的错误就是如下的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

RT-Thread

把解压后的GCC文件夹拷贝到RTTStudio的GCC工具路径内,为了减小点路径长度,可以把文件夹名字重命名为”10.3”:

RT-Thread

点击“构建配置”工具图标,打开配置对话框,在“设置”栏的“Toolchains”图页内就可以配置GCC相关信息了。GCC应该是向下兼容的,这里不妨选择”global”进行全局设置:

RT-Thread

点击“浏览”按钮,选择刚加入的GCC工具路径,要选择到里面的bin级目录:

RT-Thread

RT-Thread

 

添加“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的完整性,也可以同时往其对应位置拷贝一份:

RT-Thread

再次编译,呕吼!错误更多了,依然不急,先看第一个错误:


		

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。

RT-Thread

于是再次进行编译,就会发现编译通过了:

RT-Thread

 

更新pyocd


那不妨下载一下试试,不出意外自然会出现意外,果真不能正常下载。原因就是最开始提到的自带的pyocd版本太老了,不支持GD32E503RC的器件。需要更新pyocd:

RT-Thread

打开CMD命令窗口,运行如下命令,安装新的pyocd:

RT-Thread

等待安装完毕,就可以在python的安装路径下找到新的”pyocd.exe”

RT-Thread

在终端输入“pyocd -V”命令,可查看到新安装pyocd的版本。还可以输入“pyocd list —targets”命令查看目前pyocd支持的器件。

RT-Thread

最后会发现,默认并不支持兆易创新的器件,所以,还需要自己添加支持包:

RT-Thread

安装完后,再查看安装包和支持的器件,就能找到GD32了:

RT-Thread

RT-Thread

最后再修改一些RTTStudio的工程配置,选择先安装的pyocd.exe和pyocd-gdbserver.exe:

RT-Thread

然后再尝试一些烧写,就可以正常下载甚至调试程序了:

RT-Thread

 

相关链接


本系列首篇文章链接:

https://club.rt-thread.org/ask/article/5c0c4ba7eb4ab1ad.html

 

———————End——————

 

   点击阅读原文进入官网


原文标题:无刷电机小车开发记录02——BSP导入RT-Thread Studio

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分