OpenEdv-开源电子网

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

定时器,如何通过库函数让TIM3产生三个不同间隔为0.1秒、0.2秒、0.5秒钟间隔的中断

[复制链接]

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
发表于 2016-11-25 14:30:05 | 显示全部楼层 |阅读模式

•通过定时器TIM3分别产生间隔为0.1秒、0.2秒、

0.5秒钟间隔的中断。在中断中控制蜂鸣器发声。


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

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-26 14:11:07 | 显示全部楼层
本帖最后由 东北小辉辉 于 2016-11-26 14:13 编辑

其实这些问题,你自己挂上仿真器,马上就能发现问题所在的,写程序,一定要学会自己调试,不然的话,你这个简单的小程序,都有bug,大程序就更不用说了。

不知道你这个程序的main函数里面是怎么写的,从现象上看,我猜测是因为,你这个TIM3_Int_Init()函数在while(1)外面初始化,调用一次,进到函数里面,i只是自加了一次,自然就执行case 1:arr=4999;psc=7199; break;

你这种写法是不能达到之前所说的功能的,仔细阅读一下之前2楼的方法,自己再尝试一下,这个尝试,调试,修改,再尝试就是提高的过程了。
不知道这个问题是谁给你的,问题其实给的很巧妙的,这个就是时间触发实现多任务的最基本的思想了,好好体会一下,以后自然会用得到。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 1 反对 0

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
金钱
1606
注册时间
2015-6-10
在线时间
223 小时
发表于 2016-11-25 15:40:24 | 显示全部楼层
Dana 发表于 2016-11-25 15:23
回复错楼了,帮忙看看吧

他的意思是在中断函数里面定义一个静态变量,
进一次自加1

看是不是= 1 、2 、5


我不知道你说产生不同间隔的中断是什么意思,同时三路还是说在不同时段产生,还是交替着来

回复 支持 1 反对 0

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8054
金钱
8054
注册时间
2014-8-13
在线时间
1597 小时
发表于 2016-11-25 15:20:21 | 显示全部楼层
这个直接看原子的例程就可以了。
这个说实在的,不应该问的。
回复 支持 0 反对 1

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-11-25 14:56:01 | 显示全部楼层
TIM3定时周期设置为0.1s,然后每次进中断以后各一个变量加一,然后根据这个变量的值来判断是0.1秒?0.2秒?还是0.5秒!
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 15:23:02 | 显示全部楼层
初学者,才碰板子,提的问题太low多包涵!产生一个我会,可是这个要改什么,下面是我的程序

void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
       
        TIM_TimeBaseInitStruct.TIM_Period=arr;
        TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
       
        NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);

        TIM_Cmd(TIM3,ENABLE);       
       
}


void TIM3_IRQHandler()
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
     BEEP=!BEEP;
        }
   
}

void BEEP_Init(void)
{
          GPIO_InitTypeDef GPIO_InitStruct;
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
          GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
          GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
          GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
          GPIO_Init(GPIOB,&GPIO_InitStruct);
          GPIO_SetBits(GPIOB,GPIO_Pin_8);
}

  int main(void)
{               

        delay_init();             
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);       
        BEEP_Init();                          
        TIM3_Int_Init(4999,7199);
        while(1);

}       

回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 15:23:54 | 显示全部楼层
zuozhongkai 发表于 2016-11-25 14:56
TIM3定时周期设置为0.1s,然后每次进中断以后各一个变量加一,然后根据这个变量的值来判断是0.1秒?0.2秒? ...

回复错楼了,帮忙看看吧
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 15:29:45 | 显示全部楼层
mack13013 发表于 2016-11-25 15:20
这个直接看原子的例程就可以了。
这个说实在的,不应该问的。

我看了定时器的例程,产生0.1秒的时钟我会,可是TIM3同时产生3个不同间隔的我不太会啊,才开始学,的确太笨,见谅
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 15:43:35 | 显示全部楼层
止天 发表于 2016-11-25 15:40
他的意思是在中断函数里面定义一个静态变量,
进一次自加1

交替着来,就是蜂鸣器先隔0.1秒叫几次,再隔着0.2秒叫几次,再隔0.5秒叫几次。这样一个循环。
回复 支持 反对

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-11-25 15:51:12 | 显示全部楼层
Dana 发表于 2016-11-25 15:43
交替着来,就是蜂鸣器先隔0.1秒叫几次,再隔着0.2秒叫几次,再隔0.5秒叫几次。这样一个循环。

这样的话,用七楼的方式就可以了,加到5的时候,把这个变量清0,不知道你还有什么问题?
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 15:55:42 | 显示全部楼层
东北小辉辉 发表于 2016-11-25 15:51
这样的话,用七楼的方式就可以了,加到5的时候,把这个变量清0,不知道你还有什么问题?

好的,谢谢。这就去试试
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-25 23:52:58 | 显示全部楼层
unsigned int i,arr,psc;       
void TIM3_Int_Init( )
{

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        NVIC_InitTypeDef NVIC_InitStruct;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        i=0;
        i++;
        if(i>5)
        i=0;
        switch(i){
                case 0:arr=999;psc=7199; break;
                case 1:arr=4999;psc=7199; break;               
                case 2:arr=1999;psc=7199; break;
                case 3:arr=1999;psc=7199; break;
                case 4:arr=4999;psc=7199; break;
                case 5:arr=4999;psc=7199; break;
         }
        TIM_TimeBaseInitStruct.TIM_Period=arr;
        TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
       
        NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;
        NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStruct);

        TIM_Cmd(TIM3,ENABLE);       
}


void TIM3_IRQHandler()
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
     LED0=!LED0;
        }  
}

这样写它为什么只执行i=1时候的情况?
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-11-26 13:36:51 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-11-25
在线时间
3 小时
 楼主| 发表于 2016-12-2 21:07:22 | 显示全部楼层
问题解决的,在中断服务函数里设定自变量,然后成倍数的对i的值设定蜂鸣器叫还是不叫。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-11 03:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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