《AlientekSTM32开发板》定时器中断实验--整理后
[复制链接]
1.注意我们的教材讲解是基于寄存器操作,方便初学者理解透彻,
2.我们另外还提供了该实例的库函数源码, 下载链接:https://bbs.eeworld.com.cn/icview-210815-1-1.html
3.此实验的教程在《Alientek STM32不完全手册》的 3.7节:
下载地址:《Alientek STM32不完全手册》
4.源码:
SC=psc;
//预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0;
//允许更新中断
TIM3->DIER|=1<<6;
//允许触发中断
TIM3->CR1|=0x01;
//使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2
}
该文件下包含一个中断服务函数和一个定时器初始化函数,中断服务函数比较简单,在每次中断后,判断TIM3的中断类型,如果中断类型正确,则执行LED1(DS1)的取反。
Timerx_Init函数就是执行我们上面介绍的那5个步骤,使得TIM3开始工作,并开启中断。该函数的2个参数用来设置TIM3的溢出时间。因为我们在Stm32_Clock_Init函数里面已经初始化APB1的时钟为2分频,所以,TIM3的时钟为76M,再根据我们设计的arr和psc的值,就可以计算中断时间了。计算公式如下:
Tout=Tclk/psc*arr;
其中:
Tclk:TIM3的计数时钟(单位为Khz)。
Tout:TIM3溢出时间(单位为ms)。
我们将timer.c文件保存,然后加入到HARDWARE组下。接下来,在timer.h文件里,我们输入如下代码:
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
//Mini STM32开发板
//定时器
驱动代码
//正点原子@ALIENTEK
//2010/6/1
void Timerx_Init(u16 arr,u16psc);
#endif
关于这部分代码,我们不多说了。
最后,我们修改main函数如下:
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);
//延时初始化
uart_init(72,9600);
//串口初始化
LED_Init();
//初始化与LED连接的硬件接口
Timerx_Init(5000,7199);//10Khz的计数频率,计数到5000为500ms
while(1)
{
LED0=!LED0;
delay_ms(200);
}
}
这里的代码和之前大同小异,此段代码对TIM3进行初始化之后,进入死循环等待TIM3溢出中断,当TIM3_CNT的值等于TIM3_ARR的值的时候,就会产生TIM3的更新中断,然后在中断里面取反LED1,TIM3_CNT再从0开始计数。
3.7.4
下载与测试
在完成软件设计之后,我们将编译好的文件下载到MiniSTM32开发板上,观看其运行结果是否与我们编写的一致。如果没有错误,我们将看DS0不停闪烁(每400ms闪烁一次),而DS1也是不停的闪烁,但是闪烁时间较DS0慢(1s一次)。
店铺:http://shop62057469.taobao.com/
技术支持论坛:www.openedv.com
QQ讨论群:95288038(验证:21ic)
QQ:389063473/ 497610476
-
-
图3.3.4.1 串口调试助手收到的信息.jpg
(63.75 KB)
|