提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
由于STM系列单片机价格疯涨,不少嵌入式的开发人员都想着找一款国内的单片机进行替代,还需要与之前开发的芯片兼容性较高,代码移植率高。因此GD32系列芯片应用而生,同样的芯片内核ARM® Cortex-Mx,让开发人员快速的适应新的产品。接下来就把自己学到和遇到的问题在这统一叙述。
一、IAR的补丁环境安装和固件库说明
IAR补丁环境的官方安装网址:http://gd32mcu.com/cn。
前面两个是keil环境,第三个是IAR环境,支持win8以下,win10电脑需要修改兼容性
安装默认会安装在最高版本的IAR目录下,不要自己修改文件夹位置,最好使用IAR7.4版本以上的,本人使用的是IAR8.32.4。
接着下载对应芯片的固件库
解压后会有四个文件夹:Examples(一些外设的使用案例)、Firmware(固件库文件,包括CMSIS文件和GD32F30x_standard_peripheral文件,具体看文件里面的内容)、Template(工程模板,有KEIL和IAR编程环境,任选保留一个)、Utilities(其它一些第三方插件)。
二、搭建编程环境
1、将Template文件夹下除了要使用的环境文件(IAR_project或Keil_project)其它都删掉,然后将Examples文件夹下的选一个案例,将案例下所有.C和.H文件复制到Template文件夹下,这样一个简单的工程就搭建好了,但接下来还有一些事情要做。
2、双击下图的IAR工作环境,就可以进入编程界面。在Options选项配置中,设定Device为使用的芯片,因为已经安装了补丁,所以能找到对应的芯片型号,如果找不到GD,说明安装补丁位置错误或是没有安装上。
3、下一步:
可以看到一些文件已经被包括在这里了,主要是一些头文件。自己新建工程的时候一定要注意这里的头文件都要包括上,不然在编译的时候会报错找不到某某文件。还有由于使用的是高容量的GD32所以要改成GD32F30X_HD(Flash在256k到512k之间为HD,512k以上是XD,互联型CL)。
在Linker选项里,一定要选中对应产品型号的.icf文件,选了Device后这个会自动配置上,检查下即可,Edit里是存储器的地址配置和堆栈的配置,可以先不用管。
4、接下来,就是Debugger的配置,在Setup中选择使用的下载器,J-link\ST-link\DAP这个跟STM32配置方法一致,在Download中选择正确的board,并勾选,检查一下没错就行。其它配置没有什么区别需要注意的了。
5、编译一下,应该不会出现什么问题,毕竟是官方固件库,如果出错,检查配置或根据编译信息,查看是否有文件因为没有用到而报错。
三、系统时钟配置
1、在startup_gd32f30x_hd.s启动文件中有如下一串代码,应该都很熟悉这段代码了,SystemInit将用来配置系统时钟。
> Reset_Handler
> LDR R0, =SystemInit
> BLX R0
> LDR R0, =__iar_program_start
> BX R0
进入函数体:在system_gd32f30x.c这个库函数里,主要功能是打开一些时钟使能位,可以对着寄存器说明来阅读。
void SystemInit (void)
{
/* FPU settings */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
/* reset the RCU clock configuration to the default reset state */
/* Set IRC8MEN bit */
RCU_CTL |= RCU_CTL_IRC8MEN;
RCU_MODIFY
RCU_CFG0 &= ~RCU_CFG0_SCS;
#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
/* reset HXTALEN, CKMEN and PLLEN bits */
RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);
/* disable all interrupts */
RCU_INT = 0x009f0000U;
#elif defined(GD32F30X_CL)
/* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */
RCU_CTL &= ~(RCU_CTL_PLLEN |RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);
/* disable all interrupts */
RCU_INT = 0x00ff0000U;
#endif
/* reset HXTALBPS bit */
RCU_CTL &= ~(RCU_CTL_HXTALBPS);
/* Reset CFG0 and CFG1 registers */
RCU_CFG0 = 0x00000000U;
RCU_CFG1 = 0x00000000U;
/* configure the system clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */
system_clock_config();
}
最后进入时钟的配置函数体system_clock_config();定义使用不同的系统时钟源,就会有相应的配置函数,我们用的是外部8M晶振,且最大能到120MHz,所以需要定义__SYSTEM_CLOCK_120M_PLL_HXTAL,配置函数才能使用。这个定义在system_gd32f30x.c的开头
static void system_clock_config(void)
{
#ifdef __SYSTEM_CLOCK_IRC8M
system_clock_8m_irc8m();
#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M)
system_clock_48m_irc8m();
#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M)
system_clock_72m_irc8m();
#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M)
system_clock_108m_irc8m();
#elif defined (__SYSTEM_CLOCK_120M_PLL_IRC8M)
system_clock_120m_irc8m();
#elif defined (__SYSTEM_CLOCK_HXTAL)
system_clock_hxtal();
#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL)
system_clock_48m_hxtal();
#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)
system_clock_72m_hxtal();
#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL)
system_clock_108m_hxtal();
#elif defined (__SYSTEM_CLOCK_120M_PLL_HXTAL)
system_clock_120m_hxtal();
#endif /* __SYSTEM_CLOCK_IRC8M */
}
这个定义在system_gd32f30x.c的开头,有这么一段定义,取消注释相应的时钟定义就可以。
然后就进入真正的时钟配置函数void system_clock_120m_hxtal(void)。包括AHB\APB1\APB2的时钟。最终配置成AHB=120Mhz,APB1=120;APB2=60。
/* AHB = SYSCLK */
RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;
/* APB2 = AHB/1 */
RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;
/* APB1 = AHB/2 */
RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;
#if (defined(GD32F30X_HD) || defined(GD32F30X_XD))
/* select HXTAL/2 as clock source */
RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0);
RCU_CFG0 |= (RCU_PLLSRC_HXTAL_IRC48M | RCU_CFG0_PREDV0);
/* CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz */
RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4 | RCU_CFG0_PLLMF_5);
RCU_CFG0 |= RCU_PLL_MUL30;
这里CK_PLL = (CK_HXTAL/2) * 30 = 120 MHz ,那可知CK_HXTAL为8Mhz,表示外部晶振为8Mhz,如果外部用的是12M或是其它的呢?在哪里修改?
在gd32f30x.h这个头文件里找到上面这段代码,修改外部晶振的值。
另外在这个头文件开头还有如下的定义,如果没有这个蓝色圈的定义,很多代码都无法执行。
好了,以上就是初次接触学习和了解到的,有帮助的话给个支持吧,后面有发现新的问题不断更新。
---
# 总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。