你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32库函数版 定时器中断

[复制链接]
feixiang20 发布时间:2017-5-26 09:59
定时器时间计算公式:
          Tout = ( ( psc+1) / Tclk ) * (arr+1)
     Tout :     溢出时间值(μs)
     psc:        预分频值(例如系统时钟为72MHz,APB分频1,则该值为7200)
     Tclk:       输入时钟(MHz)
     arr:         自动装载值(根据需要溢出的时间,通过预分频值和时钟倒推出自动装载值为多少)
例如:需要TIM2每 1s 中断一次(APB为1分频)
          1000000μs = ((7199+1)/72MHz) * (arr+1)   ----->    由此可求出 arr的自动装载值为9999

关于TIM2 ~ TIM7 的初始化


        1. 使能该定时器的时钟(TIM2 ~ TIM7是挂载在APB1下)

               RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能或者失能APB1外设时钟


        1. 初始化定时器

          TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = psc;//预分频值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseStructure.TIM_Period = arr;//在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//TDTS = Tck_tim
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化


        1.  初始化NVIC


              NVIC_InitTypeDef NVIC_my_init ;
    NVIC_my_init.NVIC_IRQChannel = TIM2_IRQChannel ;
    NVIC_my_init.NVIC_IRQChannelPreemptionPriority = 0 ;
    NVIC_my_init.NVIC_IRQChannelSubPriority = 3 ;
    NVIC_my_init.NVIC_IRQChannelCmd = ENABLE ;
    NVIC_Init(&NVIC_my_init) ;


        1. 打开定时器中断


               TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);


        1.       打开定时器


     TIM_Cmd(TIM2, ENABLE);


        1.     编写定时中断函数

void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);          //     清空中断标志位
          //函数编写----尽量只设置标志位,避免中断嵌套
    }
}

收藏 评论2 发布时间:2017-5-26 09:59

举报

2个回答
黑夜之狼 回答时间:2017-5-26 15:15:24
LZ最近转载了不少资料过来呀
小小超 回答时间:2017-5-26 15:19:03
楼主的计算方式似乎太复杂了吧。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版