TIMタイマー - STM32

TIMタイマー - STM32

TIM (Timer) タイマ入力クロックをカウントし、カウント値が設定値に達したときに割り込みを発生させることができるタイマ 16 ビットカウンタ、プリスケーラ、オートリロードレジスタの
タイムベースユニットを72MHz のカウントクロックで制御可能
最大 59.65 秒のタイミングを実現
基本的なタイミング割り込み機能だけでなく、内部および外部クロック ソースの選択、インプット キャプチャ、出力比較、エンコーダ インターフェイス、マスター/スレーブ トリガ モードなどの機能を備えています。応用シナリオに応じて、高度なタイマーに分かれています。タイマーには、一般タイマー、基本タイマーの 3 種類があります。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

カウントの途中でプリスケーラ値を変更しても、今回のカウントが終了するまではカウント周波数は元の周波数のままとなり、次のカウントから変更された分周値が反映されます。
ここに画像の説明を挿入
黒い影のあるレジスタはすべてシャドウ レジスタなどのバッファ機構を持っています。
ここに画像の説明を挿入
このシャドウ レジスタを導入する目的は、実際には同期化、つまり、値の変更と更新イベントを同期的に発生させ、動作中の変更によって引き起こされるエラーを防止し、タイマー設定手順を中断すること
ここに画像の説明を挿入
です
。 RCCクロック
. 2番目のステップは、タイムベースユニットのクロックソースを選択します
3番目のステップ、タイムベースユニットを設定します
4番目のステップ、出力割り込み制御を設定し、NMICへの更新割り込み出力を許可します
5番目のステップ、設定しますNVIC、NMIC でタイマー割り込みチャネルを開き、
優先順位を割り当てる 6 段​​階の動作制御です
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

#include "stm32f10x.h"                  // Device header

//exten声明变量,就是告诉编译器,现在有Num这个变量,e
//它在别的文件里定义了,用户跨文件使用变量
extern uint16_t Num;

void Timer_Intial(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1;//周期,ARR自动重装器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1;//PSC预分频器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	//第四步配置输出中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//更新中断
	
	//清除中断标志位,能够避免刚初始化完就进中断的问题
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	
	//第五步,配置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);
}

//定时器的中断函数
void TIM2_IRQHandler(void)
{
	//首先检查一下中断标志位
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
	{
		Num++;
		//清除标志位
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}


#ifndef _TIMER_H
#define _TIMER_H

void Timer_Intial(void);

#endif

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "Timer.h"

uint16_t Num;

int main(void)
{

	
	while(1)
	{

	}
}

割り込み関数で使用される、ファイル間で変数を使用する方法

1 つ目の解決策は、extern で宣言できるクロスファイル変数を使用することです。2
つ目の解決策は、割り込み関数を変数と同じフォルダにある main 関数に切り離すことです。

おすすめ

転載: blog.csdn.net/qq_45159887/article/details/130462229