TA的每日心情 | 无聊 2018-8-2 09:51 |
---|
签到天数: 276 天 连续签到: 1 天 [LV.8]以坛为家I
|
本帖最后由 lmt50222 于 2017-5-16 12:55 编辑
其实收到开发板已经有一个多星期了,现在才有点时间进行初步试验。。。。Keil V5 这个软件怎么安装就不说了。当然也包括各种补丁了。。。
1。首先,先找个地方建一个测试文件夹,千万不要把目录放的太深,不然后果你知道的。。。然后打开Keil V5。。。。
2。打开指定文件夹,新建工程。。
3。选择芯片型号GD32F450VE
4。这次我们不用库函数来建工程,而是使用Keil自带的,先选择CMSIS->Core勾选内核,Device->Startup勾选启动文件,GD32F4XX_libopt库文件,GD32F4XX_StdPeripherals->分别勾选GPIO(IO口),PMU(电源管理单元 ),RCU(复位和时钟单元 ),SYSCFG(配置选项).
5。找了半天也不知道中断是在哪里设置,只用手动增加gd32f4xx_it.c
6。打开Keil设置好仿真及其它设置
7。程序编写
A。使用自带滴答定时器进行计时1ms- //====================================================================
- //=== 滴答时钟初始化函数 ===//
- void SystemTick_Init(void)
- {
- if(SysTick_Config(SystemCoreClock / 1000U)) //1ms
- {
- while(1);
- }
-
- NVIC_SetPriority(SysTick_IRQn, 0x00U);//开启中断
- }
复制代码 B。滴答中断服务函数- //====================================================================
- //=== 滴答中断服务函数 ===//
- void SysTick_Handler(void)
- {
- if(B_Flash_Show)
- {
- B_Flash_Show = 0;
- gpio_bit_set(GPIOD,GPIO_PIN_6);
- }
- else
- {
- B_Flash_Show = 1;
- gpio_bit_reset(GPIOD,GPIO_PIN_6);
- }
-
- R_T2500us++;
- if(R_T2500us >= 100)
- {
- R_T2500us = 0;
- B_T100ms = 1;
- R_T500ms++;
- if(R_T500ms >= 5)
- {
- R_T500ms = 0;
- B_T500ms = 1;
- }
- }
- }
复制代码 C。LED灯IO口设置- //====================================================================
- //=== GPIO初始化函数 ===//
- void GPIO_Init(void)
- {
- rcu_periph_clock_enable(RCU_GPIOB); //开启GPIOB时钟
- gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_3|GPIO_PIN_4); //设置GPIOB.3/4口为输出模式,接上拉
- gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4);//设置GPIOB.3/4为推挽输出,速度50MHZ
-
- rcu_periph_clock_enable(RCU_GPIOD); //开启GPIOD时钟
- gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_6|GPIO_PIN_7); //设置GPIOD.6/7口为输出模式,接上拉
- gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);//设置GPIOD.6/7为推挽输出,速度50MHZ
- }
复制代码 D。LED灯亮灭控制- //====================================================================
- //=== 主函数 ===//
- int main(void)
- {
- SystemTick_Init();
- GPIO_Init();
- while(1)
- {
- if(B_T100ms == 1)
- {
- B_T100ms = 0;
- }
- if(B_T500ms == 1)
- {
- B_T500ms = 0;
- if(B_Onf)
- {
- B_Onf = 0;
- gpio_bit_set(GPIOD,GPIO_PIN_7);
- gpio_bit_set(GPIOB,GPIO_PIN_3);
- gpio_bit_set(GPIOB,GPIO_PIN_4);
- }
- else
- {
- B_Onf = 1;
- gpio_bit_reset(GPIOD,GPIO_PIN_7);
- gpio_bit_reset(GPIOB,GPIO_PIN_3);
- gpio_bit_reset(GPIOB,GPIO_PIN_4);
- }
- }
- }
- }
复制代码 8。编译并运行仿真
此时出现了问题,怎么不能运行到Main函数呢。。。。。- /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
- do{
- timeout++;
- stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
- }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));
- /* if fail */
- if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
- while(1){
- }
- }
复制代码 停止全速运行后,光标停在等待外部高速时钟。。那么怎么出现这样的情况呢。。。。- /* 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)
复制代码 原因在于新建工程出现的文件默认选择外部8M时钟为PLL主时钟,并运行在120M频率上。
我们只需要选择开启 #define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)
就可以了,熟悉的LED闪烁就会准时出现在你的眼前。。。。。
|
|