时钟作为单片机中十分重要的一环,没有时钟作为时间基准,我们对单片机进行编程也将变得混乱及难以把控时间度。接下来就看看怎么在stm32cubemx中查询我们自己设置的时钟吧。
首先选择RCC,然后可以看到有HSE与LSE的选项,分别为高速时钟和低速时钟,stm32单片机内部分别有1个低速时钟与1个高速时钟,外部也可以接1个外部低速时钟与1个外部高速时钟。当我们使用内部时钟时,将其选为Disable便可,当使用外部时钟时则选Crystal/Ceramic Resonator选项。
由于我使用内部高速时钟作为时间基准,所以高速时钟和低速时钟均选“Disable”便可。接下来让我们看一下整个MCU的时钟树:
由图片我们可以知道现在系统时钟为8MHz,接下来就讲解一下怎么配置和使用systick定时溢出中断。
SYSTICK定时器溢出中断配置及使用:
接下来我们去NVIC中断设置中查看systick中断是否已经使能:
可以看到systick定时器中断已经默认打开且无法关断,其优先级为3(优先级数字越大其优先度越高);
然后我们再配置1个IO口输出点亮和熄灭LED灯,可供我们更加直观的看出定时器中断正在执行吧:
接下来就可以生成keil工程了:
点击右上角的GENERATE CODE生成即可去相应路径中打开工程了:
打开工程后我们找到stm32xxxx._hal.c这个文件打开,找到
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
这段代码,如图:
我们更改其中的1000U该值便可更改溢出中断的时间,其计算方法为
1秒/1000=1ms ,我将其更改为1秒/500=2ms;则每2ms将进入一次systick溢出中断,接下来我们在stm32xxxx_it.c中找到其中断服务函数
void SysTick_Handler(void):
其中我定义了一个累加值 uint16_t systime,当累加到1000的时候,即2秒,便执行1次翻转PA15电平的操作并清除计数值(该操作最好移至main函数中执行,中断中仅执行累加计数最好,本人为了方便自己所以偷懒了^~*)。接下来便编译程序,烧录程序,查看结果,将PA15连上LED后将看到其每隔两秒便亮or灭。
TIM普通定时器配置及使用:
回到stm32cubemx中,我们对该工程的时钟系统不做任何改变(即仍然使用内部8M高速时钟),对TIM3进行配置如下:
首先时钟还是8MHz,经过8分频后变成1MHz,即1微妙,然后累加值设置为500,则500微妙TIM3定时器将溢出执行一次中断,接下来我们先去使能TIM3溢出中断:
之后继续生成工程,回到工程之后找到TIM3中断服务函数,把之前在systick中断服务函数中的那部分执行程序剪切过来:
别急着烧录程序,这时候我们还没有打开TIM3中断定时器呢,回到main函数中,加入此程序
HAL_TIM_Base_Start_IT(&htim3);
接下来便可以烧录程序查看结果了。可以看到LED灯将以500毫秒的时间频率进行闪烁,证明TIM3溢出中断功能已经实现。