前言
板子还没有收到。
先把编译环境搞定吧,顺势把M23融合到我的M-Arch里面去。
IDE用的是keil,版本是5.30,前面弄过几次,反正吧不是特别友好。
官方特别提示了要用KEIL5,KEIL5工程的后缀是uvprojx,KEIL4工程的后缀是uvproj
另外我搭环境过程中发现编译器只能用AC6,跟AC5差别还是有一些,有些折腾人,细节后面说到。
pack安装
pack名:
GigaDevice.GD32L23x_DFP_1.0.0.pack
双击安装,一路OK即可。
but,这竟然发现也有小bug!!!
![8821e28ebe1e7c423dcc803f11018f3b.png](https://i-blog.csdnimg.cn/blog_migrate/a91948d42dc8b7a989f6d6d52500a028.png)
说好的1.0.0版本,安装的竟然是0.0.0版本,手动@GD BOSS。
更离谱的是,keil上面有官方网站上还没有的新版本···
![809179ae0c2e62db75bf9b27c8590bf3.png](https://i-blog.csdnimg.cn/blog_migrate/64ba280ea3137f293425298d211379a8.png)
框架融合
M-Arch的基本思想是把IO进行封装和抽象,屏蔽厂家的差异性,从而达到IO跟业务解耦的目的。
M-Arch架构:
![d0de03055bf7ffad0e0291e9f25974cf.png](https://i-blog.csdnimg.cn/blog_migrate/d0a3e7627c8f5a460b8b01a41abc53a4.png)
M-Arch IO目录层次:
![6f17cb8ab8ab42ba1ad975d2c5838101.png](https://i-blog.csdnimg.cn/blog_migrate/d8db7a927b1badac45e39a7389df4dce.png)
在之前的设计中,我打算把GD32的放到一起,通过宏来区分,但是等把GD32L233CC配置(GD32L233CC的keil配置就是常规的startup S文件,头文件include以及库文件包含等)之后发现一个问题,之前的代码很多编译不过:
".\output_stm\m_arch_app.axf" - 147 Error(s), 248 Warning(s).
详细看了下报错信息,发现主要的一些差异点(同M3,M4):
M23的NVIC只有2bit,所以没有组的概念。
所以,
nvic_priority_group_set
没有 ···所以,
nvic_irq_enable
函数参数不一样。
M23的很多资源只有1个,定义就不一样了。
例如DAC只有一个,宏定义就是
DAC
而不是DAC0
。定时器有l个低功耗叫
LPTIMER
,其他的叫TIMER1,TIMER2,TIMER5,TIMER6,TIMER8,TIMER11
···
这样的差异性造成的问题就是M23和M3,M4兼容起来比较困难。
索性把M23的IO单独拎出来:
E:.
│ io.c
│
├─gd32
│ interrupt.c
│ io_adc.c
│ io_crc.c
│ io_dac.c
│ io_fmc.c
│ io_gd32.c
│ io_gd32.h
│ io_gpio.c
│ io_rng.c
│ io_spi_rtc.c
│ io_system.c
│ io_timer.c
│ io_uart.c
│
├─gd32M0
│ interrupt.c
│ io_adc.c
│ io_crc.c
│ io_dac.c
│ io_fmc.c
│ io_gd32.c
│ io_gd32.h
│ io_gpio.c
│ io_rng.c
│ io_spi_rtc.c
│ io_system.c
│ io_timer.c
│ io_uart.c
│
编译通过
重点解决问题一:AC6的半主机问题。
报错:
error: '#pragma import' is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6 [-Warmcc-pragma-import]
#pragma import(__use_no_semihosting)
解决:
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
替换为:
__ASM (".global __use_no_semihosting");
当然,最简单的方式是直接用MicroLIB。
重点解决问题二:FreeRTOS的编译问题。
首先要保证配置OK,配置指堆栈大小,优先级等。
最简单的办法是直接从FreeRTOS的官方DEMO中直接整一个M0的配置来用。
另外,编译的时候要把告警配置为AC-5 Like,不然会有一堆的编译告警。
![7da820fe1a00246139281fdb4e003498.png](https://i-blog.csdnimg.cn/blog_migrate/f128133eb62e190b42dd8106889d91c7.png)
大功告成
至此,基本的编译环境算是搞定了。
linking...
Program Size: Code=23284 RO-data=1184 RW-data=24 ZI-data=13944
FromELF: creating hex file...
After Build - User command #2: fromelf --bin -o "E:\Gitee\m-arch\m_arch_app.bin" "E:\Gitee\m-arch\m_arch_app.axf"
".\m_arch_app.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:07
【注:本文首发于eeworld,后续也会在微信公众号:趣Python,发布。】
![e309ccf2de3b3dbc17a475a334a759cb.gif](https://i-blog.csdnimg.cn/blog_migrate/07a956638a28e4f7b8a889150f0812af.gif)
![4258e3f2ff65c03c1e9df2413076107b.png](https://i-blog.csdnimg.cn/blog_migrate/bc3606b8c1a7b277d8978d0087936062.png)
![894137a1f84ece8c521b386cad6a4741.gif](https://i-blog.csdnimg.cn/blog_migrate/01e14d459da33150ff69447b5bb84054.gif)