今年芯片市场真是命运多舛,受到疫情的影响,上游晶圆短缺,直接导致今年芯片产能不足,连STM32这样的通用MCU也出现价格涨价甚至价格翻翻,但生活总得继续,STM32价格太贵也只能尝试使用国产的MCU,最受关注的当属兆易创新GD32,今年的产品基本就在这个平台上开发了,从习惯STM32的HAL库开发到GD32的类似标准库开发的转变总归还是有些不适应,而且还不能用STMStuido这样监控变量,既然要走破釜沉舟这条路,不如来个釜底抽薪,重新调研一下现在常用的IDE。
得知目前可以用JLINK的JScope来替换STMStudio来监控变量,而且还能达到超高速的记录数据,顿时对JLINK产生了好感,也关注到他们公司SEEGER也出了自己的IDE,不仅是跨平台的,而且运行速度均秒杀Keil和IAR,这一下提起了兴趣,因此写下这个系列专题,打算跟SES死磕到底啦!
该系列所需所有软件均同步到百度云,有需要可以自行下载
链接:https://pan.baidu.com/s/1KYtT8yJUIeFBpp3ed-9IFw
提取码:bggv
SEGGER Embedded Studio for ARM 最新的版本已经更新到V5.30,下载地址:https://www.segger.com/downloads/embedded-studio/
不仅支持window,还支持mac和linux。
安装完软件后,第一次打开会提示License,这个软件对个人和教育是免费使用的,直接点击Continue跳过
我们是准备开发GD32,这里需要安装一下支持的插件,和KEIL的PACK一样
弹出一个更新的提示,选择Yes
等待结束后,会列出现在适配的插件库,可以看到CMSIS的最新版本是5.0.4这个有点过时了,后面再写个博文来介绍如何使用最新的CMSIS库。下拉找到我们要使用的GD32的型号
右击选择Install Selected Packages。
这里开始新建一个工程
这里提示是新建一个工程到新的解决方案中,还是将新建一个工程到现在的解决方案中,当有多个工程需要管理时,可以选择第二个,这里以第一个为示例。
选择一个C/C++的工程,并配置好工程名和工程路径
这里选择型号,编译器,输出格式,以及头文件路径和打印宏定义,堆栈空间等。
关于编译器的选择,可以参考SEEGER的编译器测试表,地址:
https://www.segger.com/products/development-tools/embedded-studio/technology/tools/segger-compiler/
添加相关启动文件和脚本文件
点击完成后,可以得到一个默认工程,这个工程是打印Hello World
,连上板子,编译F7
运行F5
可以得到调试效果
我用的板子是GD32F303的开发板以及JLINK
SES的特点是使用JLINK作为调试器后,会自动将printf重定向到JLINK_RTT里,这样可以节省一路串口来打印信息,非常方便。后来有时间还会介绍如何使用RTT配合SCOPE来监控变量。
从工程目录里也可以看出,该工程里还没有GD32的外设库。
我们在源文件目录右键选择添加Add Existing Items
C:\Users\ZhangHao\AppData\Local\SEGGER\SEGGER Embedded Studio\v3\packages\GD32F30x\CMSIS\Device\Source
添加必要的文件
从板子原理图上可以看到有两个LED分别接在了PB14和PB15上。
/*********************************************************************
* SEGGER Microcontroller GmbH *
* The Embedded Experts *
**********************************************************************
-------------------------- END-OF-HEADER -----------------------------
File : main.c
Purpose : Generic application start
*/
#include
#include
#include
static volatile int ticks = 0;
void SysTick_Handler(void) {
ticks++;
}
static void delay(int n) {
unsigned endTicks = ticks + n;
while (ticks < endTicks);
}
/*********************************************************************
*
* main()
*
* Function description
* Application entry point.
*/
int main(void) {
// Enable SysTick timer interrupt
SysTick->LOAD = (SystemCoreClock / 1000) - 1;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
// Config led gpio
rcu_periph_clock_enable(RCU_GPIOB);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_14);
gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_2MHZ,GPIO_PIN_15);
while(1){
printf("ticks = %d\n", ticks);
gpio_bit_set(GPIOB,GPIO_PIN_14);
gpio_bit_reset(GPIOB,GPIO_PIN_15);
delay(200);
gpio_bit_reset(GPIOB,GPIO_PIN_14);
gpio_bit_set(GPIOB,GPIO_PIN_15);
delay(200);
}
// Disable SysTick interrupt
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
exit(EXIT_SUCCESS);
}
/*************************** End of file ****************************/
第一次体验到这里就结束了,SEGGER体验上比Keil和IAR要美观很多,而且调试界面功能非常丰富,当然也有一些适应的过程,后续为逐步改善我们的代码和参数。