OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7466|回复: 7

STM32F103定时器主从模式(控制从定时器计时)

[复制链接]

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-11
在线时间
14 小时
发表于 2020-2-14 12:06:43 | 显示全部楼层 |阅读模式
8金钱
本帖最后由 李赖赖无敌手 于 2020-2-14 13:01 编辑

我的想法是通过主定时器TIM1来控制从定时器TIM2,从而实现LED0每隔一秒翻动一次。程序如下。我的想法是,主定时器TIM1产生一次更新中断(1ms),就给从定时器发送一次触发信号,从而从定时器的计数器值加一。那么从定时器的ARR是999,所以从定时器要产生溢出总共就需要1ms乘以1000,就等于1s。运行结果的确也会翻动,可是时间太长了(大概50秒的样子翻动一次)。我个人的猜测是定时出了问题,其他的诸如主从模式的设置应该是没错的。希望有大佬可以指点我一下,困扰我几天了。不胜感激!//...........................................................................................................//

#include "tim.h"
#include "led.h"
void TIM_Mode_Config(void)
{
        //主定时器TIM1初始化
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        //时基初始化结构体
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_TimeBaseInitStruct.TIM_Prescaler=71;
        TIM_TimeBaseInitStruct.TIM_Period=999;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);
        TIM_Cmd(TIM1,ENABLE);//计数器使能
        TIM_SetCounter(TIM1,0);
        TIM_ARRPreloadConfig(TIM1,ENABLE);//使能自动重转载计数器
        TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);//使能TIM1为主定时器
        TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);//选择TIM1更新中断作为触发输出
        
        //定时器TIM2初始化
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        //时基初始化结构体
        TIM_TimeBaseInitStruct.TIM_Prescaler=71;
        TIM_TimeBaseInitStruct.TIM_Period=999;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
        TIM_SetCounter(TIM2,0);
        //TIM_ARRPreloadConfig(TIM2,DISABLE);//使能自动重转载计数器
        TIM_Cmd(TIM2,ENABLE);//计数器使能
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断使能
        
        //从模式选择
        TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1);//从模式的选择为外部触发1
        TIM_SelectInputTrigger(TIM2,TIM_TS_ITR0);
}

void TIM2_NVIC_Config(void)
{
        //中断初始化
        NVIC_InitTypeDef NVIC_InitStruct;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn ;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);
}

void TIM2_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
                LED0=!LED0;
        }
}

void TIM_Config(void)
{
        TIM_Mode_Config();
        TIM2_NVIC_Config();
}

//......................................................................................................//
主函数
int main (void)
{
        LED_Init();
        TIM_Config();
        while(1);
}

//......................................................................................................//

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-11
在线时间
14 小时
 楼主| 发表于 2020-2-14 12:54:54 | 显示全部楼层
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-11
在线时间
14 小时
 楼主| 发表于 2020-2-14 16:31:19 | 显示全部楼层
没人么。
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-11
在线时间
14 小时
 楼主| 发表于 2020-2-14 18:11:08 | 显示全部楼层
再顶。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-2-14 22:21:47 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-10-11
在线时间
14 小时
 楼主| 发表于 2020-2-15 11:21:27 | 显示全部楼层
发现个问题,我在软件仿真里面跑出来是没问题的。硬件仿真跑出来,发现TIM2的计数器加的特别慢。所以导致TIM2溢出需要时间很长。
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-11-13
在线时间
18 小时
发表于 2020-12-1 19:20:14 | 显示全部楼层
定时器初始化有一个参数没有设置,  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  //重复n次计数才触发中断加上这个应该就可以了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2022-11-8
在线时间
2 小时
发表于 2022-11-16 19:48:17 | 显示全部楼层
是不是 TIM1 是 72000,000Hz ;  72000,000/72/1000 = 1kHz ;    然后作为 TIM2 的计数时钟, 但是你的 TIM2 预分频是71,自动重装载值是999, 所以
1kHz /1000/72 = 72秒   。所以每72秒翻转一次 ?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 23:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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