STM32学习记录 通用定时器TIM

eefocus · 电子工程世界·2021-04-30 00:00

2.2k

经过两天的研究,逛各种坛子,不断测试,

发现网上很多代码实际上都只有两三个版本,但是都不工作或者说不正常工作。。。

东拼西凑,不断调试,终于找出了通用定时器的可以工作的配置。

时钟配置不是问题,问题在于TIM的初始化。网上各种资料都不正确。

导至定时器一直只以一个频率工作,而且按资料来说正确范围内的参数实际却不工作。

时钟配置

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; /*TIM3中断*/

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*先占优先级0级*/

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /*从优先级3级*/

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/

NVIC_Init(&NVIC_InitStructure);

TIM初始化设置

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 时钟使能 */

/*定时器TIM3初始化*/

TIM_TimeBaseStructure.TIM_Period = 7200;/*周期的值*/

TIM_TimeBaseStructure.TIM_Prescaler = 10000;/* 预分频值 */

//跟据程序实际CNT的取值看,应该TIM_Period才是预分频值

//虽然资料说这两个取值在0x0000~0xFFFF,但是好像取值超过一定值就不工作,具体是多少没测,但是很多数值都不工作。

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*设置时钟分割:TDTS = Tck_tim*/

//这里与资料上也不相同,好像设任何值(1,2,4)都不影响计步速度。

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* TIM向上计数模式*/

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*根据指定的参数初始化TIMx的时间基数单位*/

TIM_PrescalerConfig(TIM3, 7200-1, TIM_PSCReloadMode_Immediate);

//如果不加这句,定时器会以200次/秒 左右的周期溢出,不论前面周期,预分频和时钟如何设置。

TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /*使能指定的TIM3中断,允许更新中断*/

中断配置

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

{

TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);

/*处理事件。。。*/

}


关键字: STM32 通用定时器 TIM 编辑:什么鱼 引用地址: http://news.eeworld.com.cn/mcu/ic534418.html

广告

eefocus · 电子工程世界·2021-04-30 00:00

2.2k
  • TI
  • 定时器
  • 用户热评
    打开摩尔芯球APP,查看更多评论

    重大事件及时推送,更流畅的沉浸式阅读体验

    参与评论

    0/200字

    登录后即可发布评论

    发布评论

    请使用浏览器自带的分享按钮,
    将你这篇文章分享出去吧。
    +86
    获取验证码
    登 录

    邮箱登录

    未注册过的用户将直接为你创建摩尔账号