1.快速创建GD32工程
使用GD32官方的开发环境(以下称GD Eclipse)暂时只支持GD32E23x和GD32F31x等系列的单片机进行图形配置及代码生成(这些系列同时也提供HAL固件库)。其他系列的单片机尽管无法进行图形配置和自动生成代码,但也可以利用其快速创建项目工程,相比使用标准版Eclipse来说,省去自行下载固件库和配置工程的麻烦,同时还可添加官方的初始化代码(尽管很简陋),方法如下:
点击菜单栏File->New->Project…,弹出创建新工程对话框。
通过选择目标芯片,自动拷贝对应的固件库相关文件,并且配置好对应的编译环境,可减少开发工作中Ctrl+C/V的使用频率。
2.修改systick中断优先级
GD官方开发环境创建工程时生成的初始化代码中,SysTick滴答定时器中断的优先级别默认设置为最高的0,需要把优先级别降低,因为一般都会使用SysTick滴答定时器来延时,该中断频繁响应会影响到其他重要中断的实时性,同时注意不要在中断服务函数(包括中断回调函数)中调用SysTick的延时函数。
3.开启串口打印功能
在GD Eclipse环境中要实现printf函数打印log信息,方法不同于Keil环境。
由于GD Eclipse环境中使用的是标准C库,printf函数的底层调用的是_write() 函数实现输出,所以要重写write函数:
int _write (int fd, char *pBuffer, int size)
{
for (int i = 0; i < size; i++)
{
usart_data_transmit(USART_PORT, (uint8_t)pBuffer[i]);
while(RESET == usart_flag_get(USART_PORT, USART_FLAG_TBE));
}
return size;
}
注意该函数在CMSIS库中也定义了,需要将其屏蔽,同时需要修改Eclipse的配置,见下图:
注意:该方法使用GCC的libgcc.a进行使用printf,会消耗较大的flash空间(实测会增加10K),小容量的单片机慎用。
使用GD官方的固件库时,推荐采用独立的函数来实现log日志打印,例如:
int uartport_debug_putstring (const uint8_t *pBuffer)
{
uint8_t pchar;
int i=0;
if(debug_com_periph==0)return -1;
pchar = pBuffer[i++];
while(pchar!='\0'){
while(RESET == usart_flag_get (debug_com_periph, USART_FLAG_TBE));
usart_data_transmit (debug_com_periph, pchar);
pchar = pBuffer[i++];
}
return i;
}
void log_printf( const char * format, ...)
{
char str[64]={0};
va_list ap;
va_start(ap, format);
(void)vsnprintf(str, sizeof(str)-1, format, ap);
va_end(ap);
uartport_debug_putstring((const uint8_t *)str);
}