由于keil的授权费太高,我们公司一直秉持着使用gcc作为单片机编译器的传统。最新研究一款新的国产超高性价比单片机---cw32l010,拥有媲美ch32v003、py32f002b等单片机的价格,还有着更好的技术支持(主要他们与我们都在武汉)。但是官方例程仅仅提供了keil与iar的编译器库,为了将其移植到gcc上编译,包括以后移植到linux上编译,因此小沃我可是亲自去他们公司武汉研发中心去请教了啊。现在就记录一下一直过程。
1、首先下载cw32官方技术论坛的帖子:传送门
下载附件,提取附件中的startup_cw32l010.S与cw32l010x8_flash.ld这三个文件,分别是芯片的汇编启动代码以及分区映射文件ld。
以及core_cm0plus.h、core_cmFunc.h与core_cmInstr.h这三个文件方便调用。
2、下载cw32的固件库:传送门
提取Libraries到自己工程中,方便后续调用。
3、创建自己的工程目录
将Libraries文件夹、core_cm0plus.h、core_cmFunc.h与core_cmInstr.h、startup_cw32l010.S与cw32l010x8_flash.ld放到目录中
4、工程目录创建自己的Makefile
力源的工程文件没有Makefile,但是他们的工程师提供了一份CMake文件给我,我自己改成了Makefile如下:
PROJECT_NAME = app
CFLAGS = -mfloat-abi=soft -mcpu=cortex-m0plus -march=armv6-m -mthumb -mlittle-endian -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -D__VTOR_PRESENT -D__DEBUG -std=gnu11 -Os -I"main" -I"Libraries/inc" -I"Device/Include"
ASFLAGS = -mfloat-abi=soft -mcpu=cortex-m0plus -march=armv6-m -mthumb -mlittle-endian -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -D__VTOR_PRESENT -D__DEBUG -std=gnu11 -Os -x assembler-with-cpp
CC = arm-none-eabi-gcc
LDFLIE = Device/Source/GCC/linker/cw32l010x8_flash.ld
OBJS = \
Device/Source/GCC/startup_cw32l010.o \
main.o \
Libraries/src/cw32l010_gpio.o \
Libraries/src/cw32l010_sysctrl.o \
Libraries/src/system_cw32l010.o
all: ${PROJECT_NAME}.bin ${PROJECT_NAME}.hex
${PROJECT_NAME}.bin: ${PROJECT_NAME}.elf
arm-none-eabi-objcopy -O binary $^ $@
${PROJECT_NAME}.hex: ${PROJECT_NAME}.elf
arm-none-eabi-objcopy -O ihex $^ $@
${PROJECT_NAME}.elf: $(OBJS)
$(CC) -T${LDFLIE} -Xlinker --gc-sections -Wl,--print-memory-usage,-Map=${PROJECT_NAME}.map --specs=nano.specs --specs=nosys.specs -mcpu=cortex-m0plus -mthumb -Os -o $@ $^
clean:
rm ${PROJECT_NAME}.hex ${PROJECT_NAME}.bin ${PROJECT_NAME}.elf ${PROJECT_NAME}.map $(OBJS)其中-I"main" -I"Libraries/inc" -I"Device/Include"是头文件的位置,比如core_cm0plus.h、core_cmFunc.h、core_cmInstr.h与Libraries文件夹中的头文件。
Device/Source/GCC/linker/cw32l010x8_flash.ld是链接文件的路径。
PROJECT_NAME = app代表生成的二进制文件叫做app.bin与app.hex。
OBJS后跟着的就是C语言源文件。
5、下载arm-none-eabi-gcc
下载地址为:传送门,根据自己的操作系统安装合适的版本即可,小沃安装的是14.3.rel1。
6、编写自己的代码
下面是小沃编写的一个gpio翻转的代码
#include "cw32l010_gpio.h"
#include "cw32l010_sysctrl.h"
void main(void)
{
__SYSCTRL_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef pb03 = {0};
SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV1); // 48MHz
pb03.IT = GPIO_IT_NONE;
pb03.Mode = GPIO_MODE_OUTPUT_PP;
pb03.Pins = GPIO_PIN_3;
GPIO_Init(CW_GPIOB, &pb03);
while (1)
{
GPIO_TogglePin(CW_GPIOB, GPIO_PIN_3); // 1k方波
SysTick->LOAD = 0xffffff;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while (0x1000000 - SysTick->VAL < 48000000 / 1000 / 2); // 48MHz下是延时0.5ms
SysTick->CTRL = 0;
}
}
// 下面4句话,不加编译会提示warning
void _close(void) {}
void _lseek(void) {}
void _read(void) {}
void _write(void) {}7、打开终端运行make
windows如果不带make,可以尝试安装tdm-gcc,并使用里面的mingw32-make,编译效果如下图

文章作者:沃航科技