TA的每日心情 | 郁闷 2020-9-17 18:05 |
---|
签到天数: 31 天 连续签到: 1 天 [LV.5]常住居民I
|
话说以前都是用的ST家的开发板,对于国产的GD家这更牛逼的板卡还没有真实的体验过,感谢爱板网让我这次能够有机会体验下这么高大上的板子,首先是收到板卡以后打开了包装,看来里面的泡沫防震做的也挺不错的,里面各种东西都是应有尽有。
然后把每个东西逐个拿出来,摆放在电脑上可以看到有主要的开发板、附带一个摄像头、一个光盘、一个电源、两根microUSB线,以及一根网线,东西看起来还是很其全的,当然也很让人省心。
然后直接上电,可以看到一个豹子在不停的跑,而且跑得还挺快呢,可以看出GD32的性能还是很厉害的。
评估完了以后按照之前申请的计划,第一步使用keil开发平台搭建工程模板,光盘上第一步是要安装GD32F450的keil安装包,我用的版本是keil5.15系列,在光盘里面找到GigaDevice.GD32F4xx_DFP.1.0.1.pack文件安装包并安装,就可以开始进行开发了。
按照以前学习STM32的惯例,先来个LED的闪烁程序,根据原理图上的LED灯程序,发现LED灯使用的是PE2 PE3 还有PF10。
在第一步使用中先确定系统的时钟,系统的时钟频率在system_gd32f4xx.c文件里面有定义:
/* select a system clock by uncommenting the following line *///#define __SYSTEM_CLOCK_IRC16M (uint32_t)(__IRC16M)//#define __SYSTEM_CLOCK_HXTAL (uint32_t)(__HXTAL)//#define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)//#define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL (uint32_t)(120000000)//#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL (uint32_t)(120000000)//#define __SYSTEM_CLOCK_168M_PLL_IRC16M (uint32_t)(168000000)//#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL (uint32_t)(168000000)//#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL (uint32_t)(168000000)//#define __SYSTEM_CLOCK_200M_PLL_IRC16M (uint32_t)(200000000)//#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL (uint32_t)(200000000)#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL (uint32_t)(200000000)正在这个时钟定义里面,外部晶振所用时钟为25MHz,倍频以后系统时钟为200MHz,比同系列的STM32F429的主频还要高,并且更厉害的是GD32F450IKT6拥有的Flash空间为3MBytes,已经超乎了人的想象。
对于GPIO的操作,首先先打开GPIOE和GPIOF的端口时钟:
rcu_periph_clock_enable(RCU_GPIOE);rcu_periph_clock_enable(RCU_GPIOF);在这里需要注意的是时钟的开启,输入参数RCU_GPIOE只能是一次一个的开启,要不然的话编译提示警告,我看了源码,开启时钟用的是枚举类型的方式,所以只能一次开一个,否则提示警告。我在这里做了个实验,分别采用上面的方法,还有下面的方法
rcu_periph_clock_enable(RCU_GPIOE|RCU_GPIOF);发现采用第一种的方法,逐个开启时钟系统能够工作,而采用第二种方法,也就是或的方法,直接就不工作了。所以由于库函数的原因,开启时钟一次只能开启一个。
然后是对GPIO进行设置,在这里GD32的库使用的是先设置模式,然后设置输出的状态,如果是输入的话就不需要进行output设置了。在这个地方是可以用或操作一次性操作多个的,具体的原因还是看库函数,用的方法不再是枚举类型,而是和STM32类似的方法,所以可以用与操作一次设置多个引脚。
gpio_mode_set(GPIOE,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_2|GPIO_PIN_3);gpio_output_options_set(GPIOE,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2|GPIO_PIN_3);gpio_mode_set(GPIOF,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_10);gpio_output_options_set(GPIOF,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10);在接着就是调用了系统时钟初始化systick_config();,函数的内容如下:主要作用是设置sys时钟的中断时间为1ms时间,然后设置优先级。void systick_config(void){ /* setup systick timer for 1000Hz interrupts */ if (SysTick_Config(SystemCoreClock / 1000U)){ /* capture error */ while (1){ } } /* configure the systick handler priority */ NVIC_SetPriority(SysTick_IRQn, 0x00U);}调用该函数的目的在于进行延时操作,在systick.c源文件中包含有delay_1ms延时函数,如果要使用这个函数,还要在系统时钟的中断函数里面添加延时递减函数的调用:
/*! \brief this function handles SysTick exception \param[in] none \param[out] none \retval none*/void SysTick_Handler(void){ delay_decrement();}这样的话就能够使用延时函数了,接下来对单个LED灯进行闪烁操作:while(1){ GPIO_BOP(GPIOE)=GPIO_PIN_2; delay_1ms(500); GPIO_BC(GPIOE)=GPIO_PIN_2; delay_1ms(500);}在while循环里面GPIO_BOP是bit operation的缩写,意思就是将某个引脚拉高(这里可以用或操作一次性操作多个),然后GPIO_BC是bit clear的缩写,意思就是拉低的作用,在这个while循环里面最终就实现了LED灯的闪烁操作了,效果如下:
|
|