先声明一下:本人写博客是便于自己对学习的知识的积累与总结,自己菜鸟一个,怕误导新手,有错的地方,希望大神看到后能给我指出一下,共同成长,共同提高。
刚毕业,在公司学习,看源码的时候出现不明白的问题,问题起源于
/**
* @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的过程
图片引用于链接http://www.51hei.com/bbs/dpj-35928-1.html。
16M变成24M,代码如下:
static void SetSysClockTo24(void)此函数在里面。
对应修改:
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 */