STM32-微项目01-基本定时器的使用

一,硬件需求:

1,STM32F103C8 核心板、0.96寸OLED显示屏

二、实现目标:

在OLED显示计数,每秒增加一次(PS:也是时钟系统的基础,稍微在main增加时钟增加的逻辑即可)

三、前导知识梳理

1,定时器模块是STM32核心板中,最复杂的模块之一。可以分为三大块:①基本定时器;②通用定时器;③高级定时器。

本文主要针对基本定时器进行操作,基本定时器是通用定时器和高级定时器的基础。

2,基本定时器的框图介绍

 

①接入时钟系统:基本定时器的外部时钟接入,只有一种,来自系统时钟RCC,在STM32F103系列中,为72mhz

 ②PSC预分频器

PSC预分频器,主要的作用是对于外部CK_PSC进行分频处理,得到新的CK_INT频率。简而言之,外部高频率是时钟信号输入,通过CK_PSC的设置就会得到较低的频率(频率越低,表示在单位时间内的产生的时钟突变变少)

③CNT计数器

接受经过分频处理完的信号CK_INT信号,每次CK_INT产生一次时钟变化,则产生一次CNT计数器自增1。

补充:CNT计数模式分为三种,向上、向下、中间

④自动重装寄存器

自动重装寄存器相当于是一个目标值,当CNT计数器达到计数目标值时刻(向上计数模式),则会产生中断或者事件(具体看软件配置);并且CNT恢复到0,继续下一次计数;

到这里,前导知识部分基础,下面进行代码分析

四、代码模块

1,需要配置的模块

 

根据上图的配置路线,可以得到以下配置路线

①RCC-TIM2时钟开启

②配置TIM2为的时钟模块为内部时钟模式

③配置TIM2时钟配置,PSC\ARR等,并且开始时钟模块(配置完后,要先清一次时基中断)

④打通TIM2的中断配置,配置NVIC分配优先级分组

⑤配置NVIC中断信息

⑥设计中断服务函数

下面开始配置代码,只说明核心部分

①RCC-TIM2自己的时钟开启

TIM2在APB1上,所以在APB1上开始TIM2的时钟

//打开TIM2的时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

②配置TIM2外部时钟接入:为内部时钟

//配置TIM2的时钟源,为系统内部时钟
	TIM_InternalClockConfig(TIM2);

③配置TIM2模块的配置

其中:1-先定义TIM_TimeBaseInitStruct结构体,用于TIM_TimeBaseInit函数初始化。在STM32库操作都是利用这种形式:初始化对应结构体,初始化init函数调用结构体指针进行配置;

2-配置TIM_ClockDivision,外部时钟的采样分频不分频(即时钟输入的采样),直接写入TIM_CKD_DIV1

3-配置计数模式TIM_CounterMode,向上计数模式

4-配置ARR重装寄存器TIM_Period,即目标值

5-配置PSC预分频器,TIM_Prescaler

6-配置重复计数器TIM_RepetitionCounte

7-调用初始化函数,初始化TIM2时钟

补充:外部时钟频率和产生中断频率 的计算公式

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)  = CK_PSC / (PSC + 1) / (ARR + 1)

	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=10000-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStruct);

③清除基本定时器中断标志

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

④配置TIM2中断

//使能TIM2中断
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

⑤配置中断优先级分组

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

⑥配置中断NVIC参数

1-定义结构体,用于后续初始化

2-配置中断频道TIM2

3-NVIC使能开启

4-修改抢占优先级

5-修改次优先级

//NVIC配置
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);

⑦开启时钟

//启动定时器
	TIM_Cmd(TIM2,ENABLE);
	

⑧配置中断函数

中断函数在启动文件中寻找,函数名必须要和启动问题一样,不然中断无法正常配置

void TIM2_IRQHandler(void)
{
	//检查中断标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
	

至此已经完成,软件配置已经完成

下面mian函数中,进行简单配置操作即可

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "OLED.H"
#include "timer.h"
/*
1,初始化时钟
2,定义GPIO端口,并配置输出端口,输出速度和输出方式
3,控制端口输出
*/

uint32_t num=0;

int main()
{
	OLED_Init();
	timer_init();
	OLED_ShowString(1,1,"TIME:");
	
	
	while(1)
	{
		OLED_ShowNum(2,1,num,4);
		OLED_ShowNum(3,1,TIM_GetCounter(TIM2),5);
		
	}
}

五、小结:

1,配置基本定时器的步骤:

开启定时器所在分支的时钟----配置定时器参数----中断导入到NVIC----配置NVIC分组---配置NVIC中断参数----启动定时器----设置中断服务函数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值