本帖最后由 zhix*****hong 于 2016-5-18 08:19 编辑
话接上贴,上两贴介绍了 STM32f0的三要素和点亮LED,这回说说它的定时器。 stm32f0的定时器分为以下几种:高级控制定时器、通用定时器和基本定时器。不仅仅是f0,就整个stm32系列来说,其定时器的性能可以说是高级的眼花缭乱。可以满足各种各样的定时、计数甚至一些编码功能。这篇我们简单的介绍下定时器就行好吧,按照望文生义的字面意思来讲,定时器就是用来定时的,我们这讲也就说说基本定时器的定时功能就行,好吧。。。 从参考手册上看到,stm32f0这个系列基本定时器有 tiM6和TIM7两个,但从其数据手册上看,我们 开发板上的stm32f030r8这个片子只有一个基本定时器。
到底我们用的这个片子只有那个定时器,是TIM6还是TIM7呢?从芯片手册的块框图中可以看到,我们用的片子只包含TIM6。
这贴我们就来试着用TIM6定时1s,让led闪烁起来好吧。。。
从参考手册中可以看到TIM6的一些属性,还包括其框图:
从该介绍可以看出,TIM6有如下三个重要的寄存器:
参考手册里还有一些特别细节的内容,比如在定时途中修改重载值会有什么影响等等,这些细节我们这节用不到,就不详细说了,各位看官以后用到的话再回头看也不迟。。。 闲话不多说,我们直接上寄存器。 第一个关键寄存器是控制寄存器TIMx_CR1。其实基本定时器只有这一个控制寄存器,搞不懂为啥还要弄个编号,搞成CR1。。。可能是为了和高级定时器一致吧。。。 这个控制寄存器主要管着定时器6的开关、更新事件的细节还有ARR寄存器是否缓冲等内容。 TIMx_DIER寄存器用来控制DMA更新请求的开关、定时器更新中断的开关。 TIMx_SR寄存器用来表示定时器是否产生了更新事件。 TIMx_EGR寄存器来配置定时器更新时的动作。 TIMx_CNT寄存器里面就是计数的值,当前寄存器定时了多久都在这里面保存着。 TIMx_PSC寄存器用来设置定时器的预分频器。 TIMx_ARR寄存器里面就是定时器的重装值,其实真正管事的是影子寄存器,影子寄存器我们用户是无法操作的。 就这么多寄存器,不多,其实直接来看,就这么几个,不要忘了还有中断控制的寄存器啥的,这样我们用定时器用的才放心,对吧。。。 拷贝我们上贴的LED文件夹,重命名为TIM6+LED,然后打开工程。
建立timer6.c和timer6.h两个文件,并将.c文件加入工程中。。。如图:
打开固件库帮助文件,按如下路径打开main.c文件:
看到里面定义了初始化TIM6的结构体信息:
这里面虽然多,但我们能用到的也只有第一个和最后一个。。。
打开如下文件:
看到其里面配置的定时器6信息:
这里面好多都不是我们需要的,我们挑有用的抄,如果像我这样懒点,就挑有用的拷贝。。。哈哈。。。
搞定之后,在timer6.h中输入如下内容:
然后在timer6.c中输入:
其中配置了定时器的预分配系数为4800-1=4799。定义了ARR重装值为10000,这样两个配合起来就是1s的时间间隔。
再上面是中断管理配置,配置完成后,在led.c中加入:
并在led.h中声明一下。这里用了寄存器操作,因为查阅固件库,没有合适的固件库函数来翻转io,这样写比较简单。。。
从固件库中拷贝如下文件到User文件夹下
然后在stm32f0xx_it.c中输入:
这样,基本上就算完成了,当然,还需要在该文件中包含led.h头文件,包含头文件这样简单的事情我以后就会少提了,大家敲代码的时候,记得自己包含进去。
完成之后,在main.c中写上如下代码:
这样就算真正完成了。这时候大家编译的时候应该是通不过的,如果头文件包含等其他细节方面没问题,应该会有个错误,提示说TIM6_DAC_IRQn没有定义,这其实是固件库的一个bug,从固件库中拷贝的stm32f0xx.h这个文件中虽然定义了TIM6_DAC_IRQn但实际上我们用的这款芯片并没有真正定义。我最开始遇到该问题的时候很纳闷,难道各类手册说错了,我们用的stm32f030r8里面没有TIM6这个寄存器?这其实是很有可能的,然后,我打开我们之前建立的mdk和iar模板,进入调试模式,查看系统寄存器,里面确实是有TIM6这个寄存器的,这就说明这款芯片实际确实包含这个寄存器,但为什么stm32f0xx.h没有在stm32f030这个宏开关中定义,很有可能就是一个bug,我们查阅手册,发现TIM6的中断入口是17,在这个文件第289行加上这么一行:
然后编译,就会通过了。。。 烧写进片子,就可以看到四颗led以1s的频率闪烁了。。。 这个实验花了我一个晚上接近两个半小时的时间,中间出了一些问题,我很纳闷,为何很快问题就自己没了。其中一度我打算换到习惯的平台mdk上去进行,后来还是忍住了,在iar上搞了出来。。。 说句题外话,其实这个例子很简单,自己写的代码很少,基本上都是在复制拷贝。搞stm32开发甚至搞 单片机开发就是这样,技术含量比较低,大把的参考例程,外设很容易就可以驱动起来。实际上最看功力的地方在单片机之外,尤其是算法和操作系统。这也是我很抵触stm32甚至单片机工作的原因,工作中,如果是靠这个吃饭,那么这个活可替代性很强,这年头大二的学生stm32都可以玩的很溜,所以如果想借这个拿高工资,就趁早醒醒吧。。。这里给大家一个建议,stm32玩熟了之后,可以考虑上个ucos或者freertos或其他系统玩玩,但为了长远发展,建议玩熟stm32一年后直接上高端的 ARM+linux。大家要有心理准备,stm32两个月就可以入门,半年就可以玩的透透的,搞嵌入式linux可能一年都没摸到门在哪,大家如果有时间,可以考研,读研之后,如果还爱好这个方向,利用点滴时间,努力爬进嵌入式linux的大门,嵌入式linux没那么简单,培训也就那么回事,水的很,所以说大家一定要有足够厚的底子再考虑嵌入式linux,如果没有经验就直接上arm+linux,那会死的很惨很惨。。。 扯了好多,因为最近看到坛子里又刮起了嵌入式linux培训宣传的一阵风,就说了说自己的深刻体会,仅仅是一家之言,各位网喷请紧闭尊口。。。
这个帖子又挺长了,就到此为止吧,下帖请见:想跑多快就跑多快。
|