前言:
10多年前就用STM32了,最近从STM32转到GD32,感觉国产的芯片发展是真的快,不但更便宜,还更快更好用了(是在是受不了STM32 I2C BUSY的那个BUG)。
先说下,实际上STM32的程序可以直接烧了到GD32里面,用串口或者是JLINK、DAP下载器都可以,程序会直接运行。
STM32最简单的开发应该是用STM32CubeMX+Keil 或者是 STM32CubeIDE(个人感觉不如keil)。而GD32我试了一下,应该最快最方便的应该是用keil 的 RTE工具生成。我测试了一下,其实STM32也是可以用类似的方法从RTE生成的。
开发环境+工具:
Keil 5.28
GD32F10x_AddOn_V2.3.0(从GigaDevice下载,或者是keil 的包管理工具下都行)
JLINK
最小工程创建具体步骤:
1、新建工程,选择器件:
2、在打开的RTE配置里面,选择几个最基本的组件,然后生成代码。
3、新建用户代码。
另外需要注意的是,RTE集成的芯片的启动代码(startup.s),是hd(高密度版本的)。我对比了一下,这个启动代码应该是兼容中密度的(例如我现在用的就是103c8),但是如果是其他版本的,需要自己更换。
4、写一个最简单的main程序
5、GD32的编译器需要配置使用5.06的,默认的是5,是无法正常调试的。
6、选择调试器以及调试接口,按自己的实际硬件来。
7、允许调试,可以看到程序正常运行。
另外,默认用的是108M的速度,这个可以根据自己的需求进行变更。
默认生成的代码里面是没有中断入口的。如果需要的话可以自己拖一个现成的中断文件,或者是需要什么中断,自己写一个,入口的名字都在startup里面写了。
融合FreeRTOS:
1、在RTE里面选上FreeRTOS的组件
2、中断相关的需要进行两处修改。因为STM32/GD32都是16级的中断有限级,与FreeRTOSConfig.h里面的默认值是不一样的,不改会卡死在RTOS的代码里面。
3、简单写一段创建进程的测试代码:
#include <freertos.h>
#include <task.h>
#include <gd32f10x.h>
//#include "stm32f10x_conf.h"
TaskHandle_t test1_hdl;
void test1(void *pvPara)
{
while (1)
{
vTaskDelay(500);
}
}
int main()
{
taskENTER_CRITICAL();
xTaskCreate(
(TaskFunction_t) test1,
"test1",
256,
(void *)NULL,
1,
&test1_hdl
);
taskEXIT_CRITICAL();
vTaskStartScheduler();
while (1);
}
可见程序准确执行,并停留在任务的调试点里面。