基本的なタイマーSTM32の学習--TIM

  stm32f1シリーズは、基本的なタイマ、汎用タイマー、3つのシニアタイマーTIMタイマーがあります。これは、TIM6 / 7は、基本的なタイマーについて話をする物品です。

  基本的なタイマTIM6 / 7は16ビットのみカウントアップタイマーがタイミングのみに使用されています。汎用タイマとタイマは、出力することもできるなど、より高度な機能は、製品の導入に関連するインプットキャプチャおよびその他の機能は、彼らは基本的なタイマーについて話背中、上に書かれる、比較しています。

  24-1に示すように、タイマーの基本的なブロック図を見てください。

  

 

  図24-1

  クロックソース

  私たちは、つまり、内部クロックCK_INTはプリスケーラで割っAPB1によって提供され、RCCクロックツリーを知ることができるリファレンスマニュアル、RCCのタイマクロックTIMxCLKのセクションを参照してください。プリスケーラはAPB1 1 ,,同じ周波数、または周波数が2倍された場合、図24-2に示します。この時点で、すなわち、プレAPB1分割ファクタを分割するため2、TIMxCLKが= 36×2 = 72MHzです。

  

 

  図24-2

  カウンタクロック

  PSCプリスケーラ得CK_CNT後、図24-1、内部クロックCK_INTによってクロックカウンタのブロック図です。PSCは、16ビットのプリスケーラでは、1と65536分周クロックタイマーTIMxCLK間の任意の数とすることができます。図に示すように、基準レジスタに述べ分割した後に計算CK_CNT値は手動TIMx_PSC、24-3に記載しました。

  

 

  図24-3

  即= CK_CNT CK_PSC /(PSC [15:0] +1)。

  カウンター

  カウンタCNTは、16ビットカウンタでのみ最大カウント値65535をカウントアップ。

  自動リロードレジスタTIMx_ARR

  最大カウント値、カウント値の預金を登録TIMx_ARR、割り込みを生成します。もちろん、割り込み缶を有効にする必要があります。

  タイミング時間の計算

  時間のカウント数は、割り込みが(ARR + 1)/ CK_CNT時間に生成され、1 / CK_CNTあります。変数は時間を記録するための割り込みサービスルーチン割り込みに設定されている場合は、スケジュールされた時間は次のとおりです。(ARR + 1)/ CK_CNT *時間。

  TIM_TimeBaseInitTypeDef

  図24-4は、基本的な構造が定義されているTIM_TimeBaseInitTypeDefタイマーです。

  

 

  図24-4

  TIM_Prescaler:指定定时器预分频器数值,由TIMx_PSC寄存器配置,可设置范围为0x0000~0xFFFF,即0~65535;

  TIM_CounterMode:计数模式,可分为向上计数、向下计数以及三种中心对齐模式。而基本定时器只能向上计数;

  TIM_Period:计数器周期,即自动重装载寄存器TIMx_ARR的值,在事件生成时更新到影子寄存器,由TIMx_CR1寄存器的ARPE位配置是否使能缓冲;

  TIM_ClockDivision:时钟分频,配置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比,基本定时器没有这个功能,不用设置;

  TIM_RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以很容易控制输出PWM个数,这里不用设置。

  定时1s实验

  例如,需要做一个1s的定时,CK_PSC=72MHz,则PSC=71,那么CK_CNT=1MHz,

  计一个数时间:1/CK_CNT = 1/1MHz = 1us,

  中断一次的时间:(ARR+1)/CK_CNT = (999+1)/1MHz = 1ms,

  则定时时间:(ARR+1)/CK_CNT*time = 1ms*1000 = 1s

  我们用led的亮灭状态变化来展示1s的定时。

  初始化TIM_TimeBaseInitTypeDef

  前文提到的TIM_TimeBaseInitTypeDef结构体有5个成员,但基本定时器TIM6/7只用到了TIM_Prescaler和TIM_Period这两个成员,其他三个是通用定时器和高级定时器才会用到的。

 

 /**

  * @brief 基本定时器配置

  * @param 无

  * @retval 无

  */

  static void BASIC_TIM_Mode_Config(void)

  {

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 内部时钟72MHz

  TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载寄存器的值

  TIM_TimeBaseStructure.TIM_Prescaler= 71; // 预分频器数值

  TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

  TIM_ClearFlag(TIM6, TIM_FLAG_Update); // 清除计数器中断标志位

  TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

  TIM_Cmd(TIM6, ENABLE);

  }

 

  中断优先级配置

  有关中断配置相关已经在之前的文章介绍过,有不清楚的地方可移步阅读。这里只说几个配置的关键点。可配置中断优先级分组为0,即0位抢占优先级,4位子优先级。配置中断源为TIM6_IRQn。

  

/**

  * @brief 中断优先级配置

  * @param 无

  * @retval 无

  */

  static void BASIC_TIM_NVIC_Config(void)

  {

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  }

 

  中断函数

  中断函数在stm32f10x_it.c文件里配置。

  

extern volatile uint32_t time; // 该变量定义在main()函数里

  void TIM6_IRQHandler(void)

  {

  if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)

  {

  time++; // 每中断一次,time值加1,中断一次时间为1ms,需要中断1000次才可定时1s,即time值为1000

  TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update);

  }

  }

 

  最后在main()函数里调用led和定时器的初始化配置函数,在一个循环里判断time变量的值是否为1000,如果已经达到1000,则led灯状态变化(亮或灭)一次,并且time变量值重赋为0,以便继续判断及定时。

最后给大家分享些smt32方面的资料便于学习参考

(STM32中断系统)
http://www.makeru.com.cn/live/1392_1124.html?s=45051

(定时器)
http://www.makeru.com.cn/live/1392_1199.html?s=45051

基于STM32-WiFi智能小车机器人开发实战
http://www.makeru.com.cn/course/details/3008?s=45051

 

おすすめ

転載: www.cnblogs.com/8734ujn/p/11608349.html