1回答

1收藏

自建工程+从点亮LED灯开始

GD32 GD32 5625 人阅读 | 1 人回复 | 2017-05-16

本帖最后由 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
  1. //====================================================================
  2. //===       滴答时钟初始化函数        ===//
  3. void SystemTick_Init(void)
  4. {
  5.     if(SysTick_Config(SystemCoreClock / 1000U))  //1ms
  6.     {
  7.         while(1);
  8.     }
  9.    
  10.     NVIC_SetPriority(SysTick_IRQn, 0x00U);//开启中断
  11. }
复制代码
B。滴答中断服务函数
  1. //====================================================================
  2. //===         滴答中断服务函数         ===//
  3. void SysTick_Handler(void)
  4. {
  5.     if(B_Flash_Show)
  6.     {
  7.         B_Flash_Show = 0;
  8.         gpio_bit_set(GPIOD,GPIO_PIN_6);
  9.     }
  10.     else
  11.     {
  12.         B_Flash_Show = 1;
  13.         gpio_bit_reset(GPIOD,GPIO_PIN_6);
  14.     }
  15.    
  16.     R_T2500us++;
  17.     if(R_T2500us >= 100)
  18.     {
  19.         R_T2500us = 0;
  20.         B_T100ms = 1;
  21.         R_T500ms++;
  22.         if(R_T500ms >= 5)
  23.         {
  24.             R_T500ms = 0;
  25.             B_T500ms = 1;
  26.         }
  27.     }
  28. }
复制代码
C。LED灯IO口设置
  1. //====================================================================
  2. //===         GPIO初始化函数         ===//
  3. void GPIO_Init(void)
  4. {
  5.     rcu_periph_clock_enable(RCU_GPIOB);                                                  //开启GPIOB时钟
  6.     gpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_3|GPIO_PIN_4);        //设置GPIOB.3/4口为输出模式,接上拉
  7.     gpio_output_options_set(GPIOB,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_3|GPIO_PIN_4);//设置GPIOB.3/4为推挽输出,速度50MHZ
  8.    
  9.     rcu_periph_clock_enable(RCU_GPIOD);                                                  //开启GPIOD时钟
  10.     gpio_mode_set(GPIOD,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_6|GPIO_PIN_7);        //设置GPIOD.6/7口为输出模式,接上拉
  11.     gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);//设置GPIOD.6/7为推挽输出,速度50MHZ
  12. }
复制代码
D。LED灯亮灭控制
  1. //====================================================================
  2. //===              主函数            ===//
  3. int main(void)
  4. {
  5.     SystemTick_Init();
  6.     GPIO_Init();
  7.     while(1)
  8.     {
  9.         if(B_T100ms == 1)
  10.         {
  11.             B_T100ms = 0;
  12.         }
  13.         if(B_T500ms == 1)
  14.         {
  15.             B_T500ms = 0;
  16.             if(B_Onf)
  17.             {
  18.                 B_Onf = 0;
  19.                 gpio_bit_set(GPIOD,GPIO_PIN_7);
  20.                 gpio_bit_set(GPIOB,GPIO_PIN_3);
  21.                 gpio_bit_set(GPIOB,GPIO_PIN_4);
  22.             }
  23.             else
  24.             {
  25.                 B_Onf = 1;
  26.                 gpio_bit_reset(GPIOD,GPIO_PIN_7);
  27.                 gpio_bit_reset(GPIOB,GPIO_PIN_3);
  28.                 gpio_bit_reset(GPIOB,GPIO_PIN_4);
  29.             }
  30.         }
  31.     }
  32. }
复制代码
8。编译并运行仿真


此时出现了问题,怎么不能运行到Main函数呢。。。。。
  1.     /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */
  2.     do{
  3.         timeout++;
  4.         stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);
  5.     }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));

  6.     /* if fail */
  7.     if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){
  8.         while(1){
  9.         }
  10.     }
复制代码
停止全速运行后,光标停在等待外部高速时钟。。那么怎么出现这样的情况呢。。。。
  1. /* select a system clock by uncommenting the following line */
  2. //#define __SYSTEM_CLOCK_IRC16M                   (uint32_t)(__IRC16M)
  3. //#define __SYSTEM_CLOCK_HXTAL                    (uint32_t)(__HXTAL)
  4. //#define __SYSTEM_CLOCK_120M_PLL_IRC16M          (uint32_t)(120000000)
  5. #define __SYSTEM_CLOCK_120M_PLL_8M_HXTAL          (uint32_t)(120000000)
  6. //#define __SYSTEM_CLOCK_120M_PLL_25M_HXTAL       (uint32_t)(120000000)
  7. //#define __SYSTEM_CLOCK_168M_PLL_IRC16M          (uint32_t)(168000000)
  8. //#define __SYSTEM_CLOCK_168M_PLL_8M_HXTAL        (uint32_t)(168000000)
  9. //#define __SYSTEM_CLOCK_168M_PLL_25M_HXTAL       (uint32_t)(168000000)
  10. //#define __SYSTEM_CLOCK_200M_PLL_IRC16M          (uint32_t)(200000000)
  11. //#define __SYSTEM_CLOCK_200M_PLL_8M_HXTAL        (uint32_t)(200000000)
  12. //#define __SYSTEM_CLOCK_200M_PLL_25M_HXTAL       (uint32_t)(200000000)
复制代码
原因在于新建工程出现的文件默认选择外部8M时钟为PLL主时钟,并运行在120M频率上。
我们只需要选择开启   #define __SYSTEM_CLOCK_120M_PLL_IRC16M (uint32_t)(120000000)
就可以了,熟悉的LED闪烁就会准时出现在你的眼前。。。。。






关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

lmt50222

发表于 2017-5-16 13:05:41 | 只看该作者

增加代码给需要的人。。。。
GD32F450VE_Test.rar (510.36 KB, 下载次数: 70)
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条