STM32F103C8T6-定时器定时中断

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自动重装器的值小一点,预分频器系数大一点,则是以较慢的速度去记一个较小的数。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是stm32f103c8t6定时器1定时中断配置代码,供您参考: ```c #include "stm32f10x.h" void TIM1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // 使能TIM1时钟 TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 时钟预分频值 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分频因子 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); // TIM1溢出中断允许 NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; // TIM1中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // TIM1中断允许 NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM1, ENABLE); // TIM1使能 } void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) // TIM1溢出中断 { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 清除TIM1溢出中断标志位 // TODO: 在此处添加中断处理代码 } } int main(void) { TIM1_Configuration(); while (1) { // TODO: 在此处添加主函数代码 } } ``` 在此代码中,定时器1的时钟预分频值为72-1,自动重装载值为1000-1,即当计数器计数到1000时触发中断中断处理函数为`TIM1_UP_IRQHandler()`,在其中添加需要执行的中断处理代码即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值