1.程序功能实现
本程序采用RCC内部时钟,来实现定时器定时中断的效果,实现1秒钟计时
2.程序实现过程
2.1 创建文件
Timer.c跟Timer.h文件,确定计时器(选择TIM2计时器)
2.2 配置定时器
根据开头的图可知,我们使用RCC内部时钟,TIM2计时器
首先,开启TIM2计时器时钟(TIM2计时器时钟在APB1总线)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
其次,选择时钟源
TIM_InternalClockConfig(TIM2);//时钟源选择,内部时钟
配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式,向上计数
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装器的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频器系数
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器,本实验用不到
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
清除因时基单元初始化产生的更新中断
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//时基单元初始化会产生更新事件,同时产生更新中断,并置更新
//中断标志位,手动调用函数清除产生的更新中断标志位
使能中断
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
接下来配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC分组选择
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;//通道选择
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//响应优先级
NVIC_Init(&NVIC_InitStruct);
启动定时器
TIM_Cmd(TIM2,ENABLE);//启动定时器
2.3 配置定时中断函数
定时中断函数去启动文件中找startup_stm32f10x_md.s
函数名称 TIM2_IRQHandler
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//是否产生更新中断标志位
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除更新中断标志位
}
}
在开头加上 ,因为变量在main.c函数中声明
extern uint16_t Num;
2.4 主函数
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h" //引入头文件
uint16_t Num;//定义一个变量
int main(void)
{
Timer_Init();//Timer调用
OLED_Init();
OLED_ShowString(1, 1, "Num:");//显示字符串
while (1)
{
OLED_ShowNum(1,5,Num,5); //显示Num的值
}
}
3 实验现象
4.预分频器的值和自动重装寄存器的值作用
TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//ARR自动重装器的值,决定计数周期,也就是计数记到多少为止。
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频器系数,决定计数频率,值越大,计数越慢,值越小,计数越快。
若ARR自动重装器的值大一点,预分频器系数小一点,则是以较快的速度去记一个较大的数。
若ARR自动重装器的值小一点,预分频器系数大一点,则是以较慢的速度去记一个较小的数。