搜索
bottom↓
回复: 3

有没有人做过 TKM32F499 的定时器 级联啊,遇到问题

[复制链接]

出0入0汤圆

发表于 2021-1-18 14:37:22 | 显示全部楼层 |阅读模式
如果 定时器 都 使用 内部时钟 不级联的话(屏蔽红色代码) ,两者进入 中断都很正常
测试代码
        TIM4_Config(12000,10000);                                //周期0.5秒
        TIM2_Config(24000,10000);                                //周期1秒

如果使用 主定时器是 tim2 从定时器 是tim4 tim2作为tim4 的预分频的话 只要tim2进入中断 tim4 就进入中断
tim4的分频还有 周期 都完全没有用,
测试代码:
        TIM4_Config(10,10);                                                //他的周期 应该是 100秒  测试出来是一秒
        TIM2_Config(24000,10000);                                //周期1秒

中断函数
void TIM2_UP_IRQHandler(void)
{
        OSIntEnter();
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                                                                  //清除TIM2更新中断标志
        ++g_tim2cnt;
        OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR                */
}

//32K 中断
void TIM4_IRQHandler(void)
{
        OSIntEnter();
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);                                                                  //清除TIM4更新中断标志
        ++g_tim4cnt;
        OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR                */
}



void TIM4_Config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStruct;        //中断参数结构体
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM8时钟使能
        TIM_DeInit(TIM4);
        TIM_TimeBaseStructure.TIM_Period = arr; //重装载值        
        TIM_TimeBaseStructure.TIM_Prescaler =psc-1;                                         //预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                 //不懂,不用管
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;         //向上计数
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化

        //中断优先级NVIC设置
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);                                  //清除TIM4更新中断标志
        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );                                         //使能TIM4中断,允许更新中断
        NVIC_InitStruct.NVIC_IRQChannel = TIM4_IRQn;                                //TIM4中断
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;                 //占先优先级0
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;                         //次优先级0
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                 //IRQ通道被使能
        NVIC_Init(&NVIC_InitStruct);                                                                  //初始化NVIC寄存器

        TIM_ITRxExternalClockConfig(TIM4,TIM_TS_ITR2);                                //tim2 as master
        TIM_ARRPreloadConfig(TIM4, ENABLE);                                                  //使能TIM4重载寄存器ARR                  
        TIM_Cmd(TIM4, ENABLE);                                                                          //使能TIM4
}

void TIM2_Config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                          
        NVIC_InitTypeDef NVIC_InitStruct;        //中断参数结构体
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM2, ENABLE);
        TIM_DeInit(TIM2);
        TIM_TimeBaseStructure.TIM_Period = arr;  //当定时器从0计数到999,即为1000次,为一个定时周期               
        TIM_TimeBaseStructure.TIM_Prescaler = psc-1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式          
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频                                  
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

        NVIC_InitStruct.NVIC_IRQChannel = TIM2_UP_IRQn;                                  //TIM8中断
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;                //占先优先级0
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;                          //次优先级0
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                 //IRQ通道被使能
        NVIC_Init(&NVIC_InitStruct);                                                                  //初始化NVIC寄存器
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );                                        //使能TIM8中断,允许更新中断


        TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);

        TIM_ARRPreloadConfig(TIM2, ENABLE);                                                  //使能TIM2重载寄存器ARR                  
        TIM_CtrlPWMOutputs(TIM2,ENABLE);          
        TIM_Cmd(TIM2,ENABLE);  
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出15入186汤圆

发表于 2021-1-18 15:57:46 | 显示全部楼层
像这种问题就看手册,对寄存器,不要相信库,因为用库和写库的人想法不一样,有可能漏掉某个初始化或某使能,

出0入0汤圆

 楼主| 发表于 2021-1-18 17:31:47 | 显示全部楼层
yuyu87 发表于 2021-1-18 15:57
像这种问题就看手册,对寄存器,不要相信库,因为用库和写库的人想法不一样,有可能漏掉某个初始化或某使能 ...

我看了他 做 级联的那个库 操作寄存器的 代码 好像没有多大的问题,
将 寄存器的数据 也通过串口打印出来 也没有看出什么问题,不会是 ic 的bug 吧
虽然ic的bug 的可能性很少,但是 同样的代码 我在stm32 是可以实现定时器级联的

出0入0汤圆

 楼主| 发表于 2021-1-19 11:24:43 | 显示全部楼层
我的程序 可能搞错 了
现在发现是 只要 主timer的溢出 会给 从timer 产生一个 溢出中断
我禁止 从timer的溢出中断,使能从timer的比较中断,就可以看到 从 timer 的时钟分频 是通过主timer的时钟分频 形成的了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 08:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表