之前在M-Arch中弄过STM32的M3,GD32的M4和M23,搭环境就顺风顺水了。
主要把出现的问题梳理和总结下。
pack直接按官方给的安装就行了,另外Keil的话要用KEIL5,KEIL5工程的后缀是uvprojx,arm编译器选 Use default compiler version 5
,弄一个之前的工程改吧改吧就行了。
资源方面,AT32F425的几个特点:
M-Arch的基本思想是把IO进行封装和抽象,屏蔽厂家的差异性,从而达到IO跟业务解耦的目的。
M-Arch架构:
M-Arch架构
M-Arch IO目录层次:
M-Arch IO目录层次
没什么说的,再整一个AT32就好了,完美!!!
E:.
│ io.c
│
├─at32
│ interrupt.c
│ io_adc.c
│ io_at32.c
│ io_at32.h
│ io_crc.c
│ io_dac.c
│ io_fmc.c
│ io_gpio.c
│ io_rng.c
│ io_spi_rtc.c
│ io_system.c
│ io_timer.c
│ io_uart.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_gd32M0.c
│ io_gd32M0.h
│ io_gpio.c
│ io_rng.c
│ io_spi_rtc.c
│ io_system.c
│ io_timer.c
│ io_uart.c
│
├─include
│ io.h
│ io_adc.h
│ io_crc.h
│ io_dac.h
│ io_fmc.h
│ io_gpio.h
│ io_rng.h
│ io_spi.h
│ io_system.h
│ io_timer.h
│ io_uart.h
│
└─stm32
interrupt.c
io_adc.c
io_crc.c
io_dac.c
io_fmc.c
io_gpio.c
io_rng.c
io_spi_rtc.c
io_stm32.c
io_stm32.h
io_system.c
io_timer.c
io_uart.c
全局宏定义:
APPCODE,AT32,USE_STDPERIPH_DRIVER,AT32F425
头文件包含:
.\src\io\include;
.\src\common\include;
.\src\app\include;
.\src\freeRTOS\kernel\include;
.\src\freeRTOS\kernel\portable\RVDS\ARM_CM3;
.\src\firmwares\AT32F425_Firmware_Library\cmsis\cm4\core_support;
.\src\firmwares\AT32F425_Firmware_Library\drivers\inc;
.\src\firmwares\AT32F425_Firmware_Library\freeRTOSConfig;
.\src\firmwares\AT32F425_Firmware_Library\cmsis\cm4\device_support
AT32F425不支持浮点数运算,FreeRTOS中选一个M3的配置来用。
至此,基本的编译环境算是搞定了(告警暂时不管了)。
compiling timers.c...
compiling port.c...
linking...
Program Size: Code=2384 RO-data=1064 RW-data=44 ZI-data=1948
FromELF: creating hex file...
After Build - User command #2: fromelf --bin -o "E:\Gitee\m-arch\output_at\m_arch_app.bin" "E:\Gitee\m-arch\output_at\m_arch_app.axf"
".\output_at\m_arch_app.axf" - 0 Error(s), 12 Warning(s).
Build Time Elapsed: 00:00:11
AT32的时钟默认不是96M,如果要配置,按官方的例程:
void system_clock_config(void)
{
/* config flash psr register */
flash_psr_set(FLASH_WAIT_CYCLE_2);
/* reset crm */
crm_reset();
crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);
/* wait till hext is ready */
while(crm_hext_stable_wait() == ERROR)
{
}
/* config pll clock resource */
crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_12);
/* enable pll */
crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
/* wait till pll is ready */
while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
{
}
/* config ahbclk */
crm_ahb_div_set(CRM_AHB_DIV_1);
/* config apb2clk */
crm_apb2_div_set(CRM_APB2_DIV_1);
/* config apb1clk */
crm_apb1_div_set(CRM_APB1_DIV_1);
/* select pll as system clock source */
crm_sysclk_switch(CRM_SCLK_PLL);
/* wait till pll is used as system clock source */
while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
{
}
/* update system_core_clock global variable */
system_core_clock_update();
}
单步运行,main函数中的while主循环也能正常运行,bingo。
【注:本文首发于eeworld。】