标题: 全球首发,全网最难,全世界第一个Proteus仿真stm32f103之实现定时器TIM3中断 [打印本页]

作者: happy87    时间: 2018-8-13 15:43
标题: 全球首发,全网最难,全世界第一个Proteus仿真stm32f103之实现定时器TIM3中断
全世界第一个proteus仿真stm32f103之实现定时器TIM3中断,全球首发,全网最难

经过坚持不懈的排查找到BUG,这是全世界最难的仿真。
困扰大家的stm32定时器仿真终于被攻克。

注:bug为一定要开启使能定时器1,不然就会报错
必须添加 __HAL_RCC_TIM1_CLK_ENABLE()

实验现象:
        本实验,DS0用来指示程序运行,400ms为一个周期。DS1用于定时器中断取反,指示
        定时器中断状态,1000ms为一个周期。下载完后,可以看到DS0快闪,DS1慢闪。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


stm32单片机源程序:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "key.h"
  6. #include "timer.h"




  7. int main(void)
  8. {
  9.     HAL_Init();                                     //初始化HAL库   
  10.     Stm32_Clock_Init(RCC_PLL_MUL9);           //设置时钟,72M
  11.         delay_init(72);                               //初始化延时函数
  12.         //uart_init(115200);                                        //初始化串口
  13.         LED_Init();                                                        //初始化LED        
  14.         //KEY_Init();                                                        //初始化按键
  15.     TIM3_Init(5000-1,7200-1);               //定时器3初始化,定时器时钟为84M,分频系数为8400-1,
  16.                                                                                 //所以定时器3的频率为72M/7200=10K,自动重装载为5000-1,那么定时器周期就是500ms
  17.     while(1)
  18.     {
  19.         LED0=!LED0;                         //LED0翻转
  20.         delay_ms(200);                              //延时200ms
  21.     }
  22. }

复制代码
  1. #include "timer.h"
  2. #include "led.h"



  3. TIM_HandleTypeDef TIM3_Handler;      //定时器句柄

  4. //通用定时器3中断初始化
  5. //arr:自动重装值。
  6. //psc:时钟预分频数
  7. //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
  8. //Ft=定时器工作频率,单位:Mhz
  9. //这里使用的是定时器3!
  10. void TIM3_Init(u16 arr,u16 psc)
  11. {  
  12.     TIM3_Handler.Instance=TIM3;                          //通用定时器3
  13.     TIM3_Handler.Init.Prescaler=psc;                     //分频系数
  14.     TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
  15.     TIM3_Handler.Init.Period=arr;                        //自动装载值
  16.     TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
  17.     HAL_TIM_Base_Init(&TIM3_Handler);
  18.    
  19.     HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
  20. }

  21. //定时器底册驱动,开启时钟,设置中断优先级
  22. //此函数会被HAL_TIM_Base_Init()函数调用
  23. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
  24. {
  25.     if(htim->Instance==TIM3)
  26.         {
  27.                 __HAL_RCC_TIM1_CLK_ENABLE();            //使能TIM3时钟
  28.                 __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
  29.                 HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
  30.                 HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
  31.         
  32.                
  33.                    // HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
  34.     //HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
  35.     //HAL_NVIC_SetPriority(TIM1_UP_IRQn, 0, 0);
  36.     //HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
  37.         
  38.         
  39.         }
  40. }

  41. //定时器3中断服务函数
  42. void TIM3_IRQHandler(void)
  43. {
  44.         
  45.         LED1=!LED1;        //LED1反转
  46.    HAL_TIM_IRQHandler(&TIM3_Handler);
  47. }

  48. //回调函数,定时器中断服务函数调用
  49. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  50. {
  51.     if(htim==(&TIM3_Handler))
  52.     {
  53.         
  54.     }
  55. }
复制代码



全部资料51hei下载地址:
7 定时器中断实验.zip (777.61 KB, 下载次数: 1000)



作者: happy87    时间: 2018-8-13 16:00
含金量这么高的帖子,什么奖励也没有,没道理
这个至少值200
作者: admin    时间: 2018-8-14 04:37
这个确实很有用,目前及其少见,好资料,51黑有你更精彩!!!是后台加的分,有时间延迟
作者: fzrwlx    时间: 2018-8-16 17:35
PROTUES8.7啊
作者: jjwangxu2008    时间: 2018-9-29 17:08
好牛逼!!!!
我发现用定时器时,程序是死在这里。

QQ截图20180929170656.png (50.12 KB, 下载次数: 271)

QQ截图20180929170656.png

作者: henrybee    时间: 2018-10-7 12:13
謝謝樓主
作者: cjd153957    时间: 2018-10-7 12:40
感谢大佬分享,学习xuexi
作者: hff    时间: 2018-11-18 18:11
你发现了真正的问题,牛!。。。。。。。。。。。。。。。。。
作者: 下一秒    时间: 2018-12-20 09:48
强,这都发现了
作者: bayga456    时间: 2018-12-20 21:56
很少用仿真,支持折腾的技术牛人
作者: wxxujian    时间: 2018-12-26 12:12
楼主威武,果然是第一个解决此问题的人
作者: qxqy080602    时间: 2019-1-1 10:24
刚接触 32 ,还没有学这么深,感觉有点懵。
不过感觉还是写得挺好
作者: morrin    时间: 2019-1-4 17:49
定时器会工作了,但是proteus8.6仿真的定时时间太长了,我要定时一秒,结果是大概30秒,请问如何解决?
作者: Leon_fgi    时间: 2019-1-4 20:14
厉害~!!
作者: 家妈滴白    时间: 2019-1-5 10:24
好厉害,强啊
作者: conky    时间: 2019-1-5 14:21
厉害,这么快就有了

作者: 梦园心田    时间: 2019-1-23 01:30
值得拥有
作者: STM32dream    时间: 2019-2-26 20:27
niubility!
作者: zhiweijiang    时间: 2019-3-4 02:45
我试了下,好像还是不行,定时时间是理论值的9倍,好像HCLK一直是8MHz,尽管已经配置了72MHz
作者: 正规007    时间: 2019-3-4 07:38
先留个脚印,不知后面会不会用到
作者: lanxiang13    时间: 2019-3-4 08:15
感谢楼主无私的奉献!
作者: zhiweijiang    时间: 2019-3-4 13:53
实测delay_(100);实际上是900ms,时间变长了9倍,PLL没有开启
作者: LY_123    时间: 2019-4-18 17:44
感谢楼主无私的奉献
作者: easyming    时间: 2019-5-8 20:34
定时器会工作了,但是proteus8.6仿真验证定时时间太长了!!!什么原因??

作者: ihk789123    时间: 2019-5-9 10:26
感谢大佬分享,学习
作者: 22793088    时间: 2019-5-11 11:28
proteus
作者: oy野马    时间: 2019-5-14 15:20
真真的是太高手,真真的是太为人民服务了,真真的是太感谢了!
作者: 吹哥来了    时间: 2019-5-16 09:26
仿真的最大频率好像只能到8M,如果你设置成72M那这样会增大CPU占用,搞得仿真变得更慢了
作者: 布谷布谷    时间: 2019-5-19 13:48
我的不是HAL库   但我把 __HAL_RCC_TIM1_CLK_ENABLE()  宏定义的这句话粘贴进去了 可还是没用啊 怎么办
作者: jkoommm    时间: 2019-5-21 08:17
厉害厉害
作者: njfwx    时间: 2019-9-4 15:57

不错的资料,感谢分享,学习1
作者: 木一小哥    时间: 2019-9-6 00:10
学习了大佬
作者: longsw    时间: 2019-10-6 12:30
感谢分享
作者: zycstc    时间: 2019-10-19 16:07
感谢,我做定时器仿真也卡在这里,只有timer1能成功仿真,2和3都是报错。用你的方法使能定时器1之后就可以了
作者: 刺眼的光景    时间: 2019-12-2 11:17
大牛人的操作
作者: bocelli    时间: 2019-12-2 11:53
谢谢大大无私奉献!!!!
作者: WFX777888    时间: 2019-12-2 16:29

感谢分享 下载了
作者: heroycbtt    时间: 2019-12-2 19:55
学习了,加油!!!
作者: 梦醒荒唐    时间: 2020-2-15 22:14
大佬,请问一下。只要TIM1使能时钟就可以仿真成功了嘛?

作者: shu_007    时间: 2020-2-18 23:00
我用protues8.8绿色版可以仿真吗?
作者: supersongge    时间: 2020-2-19 22:38
mark 感谢
作者: kust336    时间: 2020-2-26 15:07
这个确实很有用,目前及其少见,好资料,51黑有你更精彩
作者: kust336    时间: 2020-2-26 15:07
这个确实很有用,目前及其少见,好资料,51黑有你更精彩
作者: cndeusa    时间: 2020-2-28 14:14
多谢楼主,太强了
作者: liucw2056    时间: 2020-2-28 18:57
学习一下 感谢分享~~
作者: 持勤补拙    时间: 2020-3-10 23:45
真的太感谢了
作者: asm555    时间: 2020-3-17 18:22
这才是真正的大神级人物
作者: ddhex    时间: 2020-3-17 22:38
请问一下,TIM3的PWM互补模式如何开启?
作者: xizai    时间: 2020-3-31 11:19
感谢分享
作者: 775447930    时间: 2020-4-3 08:40
感谢楼主解决这个问题,纠结很久了
作者: wbaisen    时间: 2020-4-4 20:42
楼主牛皮,一开始还不信,结果一直开不了定时器2,后来开了定时器1就ok了
作者: 来了就欧了    时间: 2020-4-13 10:37
楼主厉害
作者: 拉风是我儿    时间: 2020-4-19 22:51
谢谢分享!
作者: zxk1    时间: 2020-4-23 07:57
十分厉害
作者: houge123    时间: 2020-4-26 13:57
相见恨晚啊,这个坑我踩过
作者: 江瀚林    时间: 2020-4-27 22:08
楼主你好,定时器仿真可以用了,但是时间扩大了大约9倍,目前我用的是Proteus8.9SP2,官方还是没有解决这个问题。
作者: onepcb    时间: 2020-5-3 09:42
谢谢分享!,,,,
作者: timemachine2000    时间: 2020-5-11 21:17
刚装好下载试一下 谢谢分享
作者: Oh_huo    时间: 2020-5-12 14:36
在初始化其他定时器的函数中先写这句话就可以了RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//proteus中的bug,用其他定时器,必须先使能TIM1。
作者: kaixin061421    时间: 2020-5-12 22:02
这个真的太厉害了,我只知道是定时器的问题,但是不知道怎么解决
作者: 雪域qw    时间: 2020-6-1 19:28
强啊,好没看到这么详细的仿真stm32的
作者: jzp_eric    时间: 2020-6-4 11:26
jjwangxu2008 发表于 2018-9-29 17:08
好牛逼!!!!
我发现用定时器时,程序是死在这里。

你好请问你在proteus仿真使用定时器时会导致cpu占用率过高的问题吗?有解决吗?
作者: 品牌在离开    时间: 2020-6-4 11:50
nb,搜了很久了
作者: NewFolder    时间: 2020-6-5 11:42
没道理啊,TIM1是APB2的,TIM3是APB1的,感觉毫无关系啊
作者: iaskall    时间: 2020-9-21 20:43
谢谢楼主,proteus8.8完全可以正常运行
作者: cc307400    时间: 2021-1-2 09:02
好厉害,强啊
作者: QAQQAQ    时间: 2021-4-12 11:50
proteus的定时器仿真终于可以用上了!!!
作者: ddssj    时间: 2021-4-14 14:45
仿真比较难!
作者: mick32    时间: 2021-5-4 18:29
nice work - thanks
Is it possible to simulate PWM/timers  with Proteus F401 model
作者: adamsecond    时间: 2021-5-12 07:49
给各赞~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~
作者: iaskall    时间: 2022-4-30 18:34
楼主的确前!
作者: iaskall    时间: 2022-4-30 18:35
shu_007 发表于 2020-2-18 23:00
我用protues8.8绿色版可以仿真吗?

估计仿真要配置很多库文件才能够进行,关键新建代码的时候是要配置编译器的。当然,你可以编译好了用hex文件仿真没有问题
作者: 光辉戯岁月    时间: 2022-5-4 19:56
大佬牛逼,我一直想stm32仿真

作者: xuefei    时间: 2022-11-27 17:24
正在学习STM32的仿真,很有用,谢谢楼主




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1