差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
stm32:tim [2025/01/21 15:00] laythystm32:tim [2025/01/23 19:43] (当前版本) laythy
行 21: 行 21:
 如图,时钟输入信号可以是:内部RCC时钟和外部时钟。而外部时钟又可以是:TIMx_ETR、ITR0-3、TI1F_ED、TI1FP1、TI2FP2。首选:RCC时钟。\\ 如图,时钟输入信号可以是:内部RCC时钟和外部时钟。而外部时钟又可以是:TIMx_ETR、ITR0-3、TI1F_ED、TI1FP1、TI2FP2。首选:RCC时钟。\\
  
-{{ :stm32:simpletimerstructure.jpeg?nolink |}}+===定时中断基本结构=== 
 +{{ :stm32:simpletimerstructure-white.png?nolink |}} 
 + 
 +===RCC时钟树=== 
 +{{ :stm32:rccclocktree.png?nolink |}} 
 + 
 +===例程:定时1秒=== 
 +<code> 
 +// Timer.c 
 + 
 +#include "stm32f10x.h"                  // Device header 
 + 
 +void Timer2_Init(void) 
 +
 +    // 时钟 
 +    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
 +    TIM_InternalClockConfig(TIM2); // 可不写这一句,上电默认内部时钟源 
 +     
 +    // 时基单元 
 +    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrucure; 
 +    TIM_TimeBaseInitStrucure.TIM_ClockDivision = TIM_CKD_DIV1; 
 +    TIM_TimeBaseInitStrucure.TIM_CounterMode = TIM_CounterMode_Up; 
 +    TIM_TimeBaseInitStrucure.TIM_Period = 10000 - 1; // ARR 
 +    TIM_TimeBaseInitStrucure.TIM_Prescaler = 7200 - 1; // PSC 
 +    TIM_TimeBaseInitStrucure.TIM_RepetitionCounter = 0; //通用定时器没有重复计数器 
 +    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrucure); 
 +    // 计数器溢出频率公式 CK_CNT_OV =  CK_PSC / (PSC+1)*(ARR+1) 
 +    // 要定时1秒,即溢出频率1hz,解得 ARR=9999, PSC=7199(非唯一) 
 +    // 注意ARR和PSC都是16位的, 取值范围都是0-65535 
 +     
 +    // 下面这一句防止复位就执行一次中断,对应1秒+1的情况就是复位值为0. 否则刚复位显示就是1. 
 +    TIM_ClearFlag(TIM2, TIM_FLAG_Update); 
 +     
 +    // IT中断使能 
 +    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中断 
 +     
 +    // NVIC 
 +    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
 +    NVIC_InitTypeDef NVIC_InitStrucure; 
 +    NVIC_InitStrucure.NVIC_IRQChannel = TIM2_IRQn; 
 +    NVIC_InitStrucure.NVIC_IRQChannelCmd = ENABLE; 
 +    NVIC_InitStrucure.NVIC_IRQChannelPreemptionPriority = 2; 
 +    NVIC_InitStrucure.NVIC_IRQChannelSubPriority = 1; 
 +    NVIC_Init(&NVIC_InitStrucure); 
 +     
 +    // 启动定时器 
 +    TIM_Cmd(TIM2, ENABLE); 
 +
 + 
 +void TIM2_IRQHandler(void) 
 +
 +    if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) 
 +    { 
 +        extern uint16_t ticktok; 
 +        ticktok++; 
 +        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 
 +    } 
 +
 +</code> 
 + 
 +<code> 
 +// main.c 
 + 
 +#include "stm32f10x.h"                  // Device header 
 +#include "OLED.h" 
 +#include "Timer.h" 
 + 
 +uint16_t ticktok = 0; 
 + 
 +int main(void) 
 +
 +    Timer2_Init(); 
 +    OLED_Init(); 
 +    OLED_ShowString(1, 1, "ticktok:"); 
 +     
 +    while(1) 
 +    { 
 +        OLED_ShowNum(1, 9, ticktok, 5); 
 +    } 
 +
 +</code>