先声明一下:本人写博客是便于自己对学习的知识的积累与总结,自己菜鸟一个,怕误导新手,有错的地方,希望大神看到后能给我指出一下,共同成长,共同提高。

    刚毕业,在公司学习,看源码的时候出现不明白的问题,问题起源于

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
systemTickISP();

}

    中断处理函数void SysTick_Handler(void){},什么时候才能进来一次呢?在学习串口通讯的时候,串口中断有标志位,标志位的变化,可以让程序运行到串口(接收、发送)中断服务函数里面进行数据的接收与发送。

    实际上,SysTick好像叫做滴答定时器。

    SysTick_Config(SystemCoreClock / Frequnce_Interrup_SystemTick);

    其中,  uint32_t SystemCoreClock   = SYSCLK_FREQ_24MHz;  /*!< System Clock Frequency (Core Clock) */

    SystemCoreClock =24M(问题的来源),Frequnce_Interrup_SystemTick可以赋不同的值,

    Frequnce_Interrup_SystemTick=1000时,1ms进入SysTick_Handler(void)一次;

    Frequnce_Interrup_SystemTick=100,10ms进入SysTick_Handler(void)一次;

    SysTick_Handler(void)=20,50ms进入SysTick_Handler(void)一次(我做做的项目Frequnce_Interrup_SystemTick=20)。1s中进入中断20次。可以这样理解, Frequnce_Interrup_SystemTick=1时,1s进入 SysTick_Handler(void)一次;Frequnce_Interrup_SystemTick时执行SysTick_Handler(void)的频率。

    引入计数器,就可以做实现固定时间的定时了。

typedef struct _Timer
{
u8 isStart; //定时器是否启动
u8 isOverflow; //定时器是否溢出
u32 time; //定时器的定时时间
} Timer;

void timerStart(Timer* pTimer, u32 time)
{
    xxx(设计公司产品代码实现不粘贴出来)

}

    定时时间(ms)=time*50           //(Frequnce_Interrup_SystemTick=20)

void timerStop(Timer* pTimer)
{
  xxx(公司产品代码实现不粘贴出来)
}

 //更新定时器的计数器,用于CPU定时器中断服务函数的调用
void timerUpdate(Timer* pTimer)
{
xxx(公司产品代码实现不粘贴出来)
}

//定时器是否溢出
u8 timerIsOverflow(Timer* pTimer)
{
xxx(公司产品代码实现不粘贴出来)

}

    本文要讨论研究的该登场了!

    STM32f103单片机中外部是16M晶振,但是SystemCoreClock=24M。问题出现来,对于新手最好不要逃避,要勇敢面对新问题,争取搞明白。24=16/2乘以3,(先2分频,在3倍频)。

  这里有讲如何分频的链接:http://www.51hei.com/bbs/dpj-35928-1.html

                                                      http://bbs.elecfans.com/forum.php?mod=viewthread&tid=518518

    按照链接里面的讲解,我理解清楚了怎么把16M变成24M的过程

STM32f103单片机中外部是16M晶振如何分频到24M

图片引用于链接http://www.51hei.com/bbs/dpj-35928-1.html。

16M变成24M,代码如下:

static void SetSysClockTo24(void)此函数在STM32f103单片机中外部是16M晶振如何分频到24M里面。

对应修改:

        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL3);

#endif /* STM32F10X_CL */

      16/2乘以3=24M。

很多博客说要注意下面这点也要改:stm32f10x.h打开  引用:https://blog.csdn.net/CPJ_phone/article/details/39344093

 #define HSE_VALUE    ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */


相关文章:

  • 2021-07-30
  • 2022-12-23
  • 2021-12-06
  • 2021-09-19
  • 2021-08-04
  • 2021-08-19
  • 2021-04-01
猜你喜欢
  • 2021-11-27
  • 2021-12-16
  • 2021-10-13
  • 2021-07-31
  • 2021-09-22
  • 2021-07-27
  • 2021-11-06
相关资源
相似解决方案