stm32之路:三 约好那一刻

来源:互联网 发布:淘宝怎么看总消费 编辑:程序博客网 时间:2024/05/23 22:30

        万事开头难,前两天,我们已经建好了工程,写了点亮LED的程序,是不是感觉stm32也没想象中那么难?接下来,go on!

        开发板上的LED在闪烁着,间隔是多长时间呢?能不能让它像钟表一样,一秒闪一下呢?答案是肯定的。今天我的目标,就是教它“读”秒~

        还是上一个函数,功能都有了,就是缺个精确的延时。说到“精确的延时”,大家首先想到的一定是定时器。对!就是它。翻开stm32的参考资料(Cortex-M3技术参考手册、Cortex-M3权威指南、STM32F10xxx数据手册,这些都可以),有个SysTick,就用它吧。一般人们把它叫做“系统节拍时钟”,或者叫“滴答定时器”,因为它可以可靠的提供一个精确的时钟。本质上说,SysTick是个24位的计数器,计数完成,就中断了,然后清零,重载,又计数。下边还是通过程序来看,这个家伙到底怎么用的。

 

void Systick_Configuration(void)

{

       SysTick_CounterCmd(SysTick_Counter_Disable);            //SysTick计数失能;

       SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//SysTick时钟为HCLK8分频;

       SysTick_CounterCmd(SysTick_Counter_Clear);        //清除SysTick计数器;

       SysTick_SetReload(9000*1000);                              //设置SysTick重载值;

}

 

        根据上次的程序,可以轻易的推测void Systick_Configuration(void)是SysTick的配置函数,而且,要在工程lib文件中添加stm32f10x_systick.c。里面的设置和我们以前用定时器很相似,先失能(屏蔽中断),在清除计数器(清除中断标志位),然后设置计数值。(这么说我都觉得有些牵强···)计数值怎么算呢?这要根据时钟源了。前面的RCC_Configuration()函数设置HCLK为72MHz,上面的函数中,SysTick时钟源是HCLK8分频,也就是f=9MHz,那么,T=1/9M,1s=T*N,所以重载值N=9000000。还要注意一下,SysTick是Cortex-M3的“内设”,不需要用RCC来开启时钟。

        这个只是初始化配置,用的时候有是怎样呢?

void Delay_Second(void)

{

       SysTick_CounterCmd(SysTick_Counter_Enable);      //SysTick使能;

       while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)== 0); //等待SysTick计数至0;

       SysTick_CounterCmd(SysTick_Counter_Disable);     //SysTick计数失能;

       SysTick_CounterCmd(SysTick_Counter_Clear); //清除SysTick计数器;

}

          延时1s的函数,和定时器相似,很容易懂吧?不同的是,重装值上面已经设置过了。至于那句“等待SysTick计数至0”,去看参考资料吧,说的很明白的。(下载的资料要多看,数据手册才是最好的参考资料。)

          把这两个函数加在上次的程序中,主函数中先调用下配置函数,然后把以前延时函数换掉,编译,下载。恩,拿个秒表看下,约定的时间,对吗?