野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4729|回复: 3

STM32F103做闪烁灯,灯却常亮

[复制链接]
发表于 2022-11-27 15:51:02 | 显示全部楼层 |阅读模式
main函数

#include "main.h"
#include "stm32f1xx.h"
#include "./led/bsp_led.h"

int main(void)
{
    /* 系统时钟初始化成72 MHz */
    SystemClock_Config();

    /* LED 端口初始化 */
    LED_GPIO_Config();

    /* 控制LED灯 */
    while (1)
    {
        LED1( ON );                         // 亮
        HAL_Delay(1000);
        LED1( OFF );                  // 灭
        HAL_Delay(1000);
    }
}

void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef clkinitstruct = {0};
  RCC_OscInitTypeDef oscinitstruct = {0};

  /* Enable HSE Oscillator and activate PLL with HSE as source */
  oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;
  oscinitstruct.HSEState        = RCC_HSE_ON;
  oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;
  oscinitstruct.PLL.PLLState    = RCC_PLL_ON;
  oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;
  oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
     clocks dividers */
  clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
  clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;  
  if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
  {
    /* Initialization Error */
    while(1);
  }
}


led的头文件和c文件

屏幕截图 2022-11-27 152419.png                      
注:上面的代码大多都是移植野火对应课程的配套代码

将上面的main.c进行编译生成hex文件烧录到笔者的stm32f103c6t6中后,灯却一直常亮,并没有按预期的做1s一次的闪烁。但是直接用野火的配套代码却能正常完成预期。

这个问题因为笔者也是初学并不太懂其中的缘故也不知道如何下手,只能简单的去对比自己和野火的源码。后面发现野火的源码的USER里含有stm32f1xx_it.c/h和stm32f1xx_hal_conf.h这三个文件,我将其添加到我的工程USER中后(特别是该文件——stm32f1xx_it.c/h),再进行编译烧录,灯就按预期一样闪烁了。

但是笔者学识浅薄,完全不理解为什么要添加这三个文件,在笔者理解里,stm32f1xx_it.c/h这个文件应该是涉及到中断函数或者是中断服务函数的文件,为啥会影响到灯闪烁呢。难道是影响到了HAL_Delay这个延时函数吗?
————————————————
版权声明:本文为CSDN博主「40110诶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50935794/article/details/128064906

屏幕截图 2022-11-27 152444.png
回复

使用道具 举报

发表于 2022-11-28 10:52:51 | 显示全部楼层
stm32f1xx_it.c默认的SysTick中断处理程序每​没有调用HAL_IncTick()函数
野火论坛202211281052321939..png
回复 支持 反对

使用道具 举报

发表于 2023-5-12 15:45:49 | 显示全部楼层
对的,HAL_Delay()通过HAL_GetTick()函数进行延时,HAL_GetTick()函数的功能是返回uwTick值,HAL_IncTick()函数就是uwTick自增的函数,放在stm32f1xx_it.c文件的SysTick_Handler()函数里面。
回复 支持 反对

使用道具 举报

发表于 2023-5-15 08:55:37 | 显示全部楼层
你先单独调用 LED1( )函数的关或开功能,来测试下这个函数是否生效
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-20 10:04 , Processed in 0.056956 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表