差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
stm32:tim [2025/01/21 14:43] – laythy | stm32:tim [2025/01/23 19:43] (当前版本) – laythy | ||
---|---|---|---|
行 19: | 行 19: | ||
===通用定时器结构=== | ===通用定时器结构=== | ||
{{ : | {{ : | ||
+ | 如图,时钟输入信号可以是:内部RCC时钟和外部时钟。而外部时钟又可以是:TIMx_ETR、ITR0-3、TI1F_ED、TI1FP1、TI2FP2。首选:RCC时钟。\\ | ||
+ | |||
+ | ===定时中断基本结构=== | ||
+ | {{ : | ||
+ | |||
+ | ===RCC时钟树=== | ||
+ | {{ : | ||
+ | |||
+ | ===例程:定时1秒=== | ||
+ | < | ||
+ | // Timer.c | ||
+ | |||
+ | #include " | ||
+ | |||
+ | void Timer2_Init(void) | ||
+ | { | ||
+ | // 时钟 | ||
+ | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, | ||
+ | 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, | ||
+ | // 计数器溢出频率公式 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, | ||
+ | | ||
+ | // IT中断使能 | ||
+ | TIM_ITConfig(TIM2, | ||
+ | | ||
+ | // 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(& | ||
+ | | ||
+ | // 启动定时器 | ||
+ | TIM_Cmd(TIM2, | ||
+ | } | ||
+ | |||
+ | void TIM2_IRQHandler(void) | ||
+ | { | ||
+ | if(TIM_GetITStatus(TIM2, | ||
+ | { | ||
+ | extern uint16_t ticktok; | ||
+ | ticktok++; | ||
+ | TIM_ClearITPendingBit(TIM2, | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | // main.c | ||
+ | |||
+ | #include " | ||
+ | #include " | ||
+ | #include " | ||
+ | |||
+ | uint16_t ticktok = 0; | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | Timer2_Init(); | ||
+ | OLED_Init(); | ||
+ | OLED_ShowString(1, | ||
+ | | ||
+ | while(1) | ||
+ | { | ||
+ | OLED_ShowNum(1, | ||
+ | } | ||
+ | } | ||
+ | </ |