查看: 3727|回复: 1

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

[复制链接]
  • TA的每日心情
    无聊
    2018-8-2 09:51
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2017-5-16 12:09:16 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 lmt50222 于 2017-5-16 12:55 编辑

    其实收到开发板已经有一个多星期了,现在才有点时间进行初步试验。。。。Keil V5 这个软件怎么安装就不说了。当然也包括各种补丁了。。。

    1。首先,先找个地方建一个测试文件夹,千万不要把目录放的太深,不然后果你知道的。。。然后打开Keil V5。。。。 1.JPG

    2。打开指定文件夹,新建工程。。
    2.JPG

    3。选择芯片型号GD32F450VE  
    3.JPG

    4。这次我们不用库函数来建工程,而是使用Keil自带的,先选择CMSIS->Core勾选内核,Device->Startup勾选启动文件,GD32F4XX_libopt库文件,GD32F4XX_StdPeripherals->分别勾选GPIO(IO口),PMU(电源管理单元 ),RCU(复位和时钟单元 ),SYSCFG(配置选项).
    4.JPG 5.JPG

    5。找了半天也不知道中断是在哪里设置,只用手动增加gd32f4xx_it.c
    6.JPG

    6。打开Keil设置好仿真及其它设置
    7.JPG

    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。编译并运行仿真
    8.JPG

    此时出现了问题,怎么不能运行到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闪烁就会准时出现在你的眼前。。。。。
    10.JPG 9.JPG





    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2018-8-2 09:51
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

     楼主| 发表于 2017-5-16 13:05:41 | 显示全部楼层
    增加代码给需要的人。。。。
    GD32F450VE_Test.rar (510.36 KB, 下载次数: 70)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 04:03 , Processed in 0.123290 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.