定时中断和内外时钟源选择

  • 定时器和中断系统的电路都在STM32内部,故只需在外插一个OLED显示屏即可
  • 定时器不涉及外部硬件,所以把模块封装到System文案金夹,并初始化,把【定时中断基本结构】全部打通
    1. RCC开启时钟,同时定时器的基准时钟和整个外设的工作时钟都会同时打开
    2. 选择时基单元的时钟源,(定时中断选择内部时钟源)
    3. 配置时基单元,包括用结构体配置预分频器,自动重装器,计数模式
    4. 配置输出中断控制,允许更新中断输出到NVIC
    5. 配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
    6. 运行控制
    7. 使能计数器
  • 回到keil进行编写:

查看定时器的库函数都有那些:【Library——>stm32f10x_tim.h——>拖到最后】

void TIM_DeInit(TIM_TypeDef* TIMx);//恢复缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//时基单元初始化
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//把结构体变量赋一个默认值

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出信号
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟

void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRx其他定时器时钟

void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIx捕获通道的时钟

void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式1输入的时钟

 

  • 小tips

 【准备初始化通用定时器TIM2】

有关时钟分频参数:定时器的外部信号输入引脚一般都有滤波器,可以过滤信号的抖动干扰,具体原理是在固定的时钟频率f下采样,如果连续N个采样点的电平均相同,则说明输入信号稳定。其中f和N都是滤波器的参数。采样频率f可以由内部时钟直接而来,也可以由内部时钟加一个分钟分频而来。

void Timer_Init(void)
{
    //RCC开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2是APB1总线的外设
    //选择时基单元时钟,想选择内部时钟,其实不调用这个也是可以的,默认就是内部时钟
    TIM_InternalClockConfig(TIM2);
    //配置时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//1分频
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
    
    //按下中断的一瞬间清除中断标志位置位。复位以后可以从0开始啦
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);
    
    
    //使能更新中断,配置输出中断控制,允许更新中断输出到NVIC
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    //配置NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    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);
}

 

想定时1秒钟:定时频率 = 72M / (PSC + 1) / (ARR + 1)。PSC和ARR的值可以自行分配

中断函数可以放在任意文件位置

 

 

posted @ 2023-04-16 18:54  整点薯条拯救一切  阅读(163)  评论(0)    收藏  举报