找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 37978|回复: 73
打印 上一主题 下一主题
收起左侧

全球首发,全网最难,全世界第一个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, 下载次数: 986)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏34 分享淘帖 顶10 踩1
回复

使用道具 举报

沙发
ID:230913 发表于 2018-8-13 16:00 | 只看该作者
含金量这么高的帖子,什么奖励也没有,没道理
这个至少值200
回复

使用道具 举报

板凳
ID:1 发表于 2018-8-14 04:37 | 只看该作者
这个确实很有用,目前及其少见,好资料,51黑有你更精彩!!!是后台加的分,有时间延迟
回复

使用道具 举报

地板
ID:385072 发表于 2018-8-16 17:35 | 只看该作者
PROTUES8.7啊
回复

使用道具 举报

5#
ID:86450 发表于 2018-9-29 17:08 | 只看该作者
好牛逼!!!!
我发现用定时器时,程序是死在这里。

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

QQ截图20180929170656.png
回复

使用道具 举报

6#
ID:377639 发表于 2018-10-7 12:13 | 只看该作者
謝謝樓主
回复

使用道具 举报

7#
ID:333436 发表于 2018-10-7 12:40 | 只看该作者
感谢大佬分享,学习xuexi
回复

使用道具 举报

8#
ID:353241 发表于 2018-11-18 18:11 | 只看该作者
你发现了真正的问题,牛!。。。。。。。。。。。。。。。。。
回复

使用道具 举报

9#
ID:384172 发表于 2018-12-20 09:48 | 只看该作者
强,这都发现了
回复

使用道具 举报

10#
ID:162136 发表于 2018-12-20 21:56 | 只看该作者
很少用仿真,支持折腾的技术牛人
回复

使用道具 举报

11#
ID:325997 发表于 2018-12-26 12:12 | 只看该作者
楼主威武,果然是第一个解决此问题的人
回复

使用道具 举报

12#
ID:377919 发表于 2019-1-1 10:24 | 只看该作者
刚接触 32 ,还没有学这么深,感觉有点懵。
不过感觉还是写得挺好
回复

使用道具 举报

13#
ID:462003 发表于 2019-1-4 17:49 | 只看该作者
定时器会工作了,但是proteus8.6仿真的定时时间太长了,我要定时一秒,结果是大概30秒,请问如何解决?
回复

使用道具 举报

14#
ID:462098 发表于 2019-1-4 20:14 | 只看该作者
厉害~!!
回复

使用道具 举报

15#
ID:253415 发表于 2019-1-5 10:24 来自手机 | 只看该作者
好厉害,强啊
回复

使用道具 举报

16#
ID:418900 发表于 2019-1-5 14:21 | 只看该作者
厉害,这么快就有了
回复

使用道具 举报

17#
ID:383374 发表于 2019-1-23 01:30 来自手机 | 只看该作者
值得拥有
回复

使用道具 举报

18#
ID:481189 发表于 2019-2-26 20:27 | 只看该作者
niubility!
回复

使用道具 举报

19#
ID:375838 发表于 2019-3-4 02:45 | 只看该作者
我试了下,好像还是不行,定时时间是理论值的9倍,好像HCLK一直是8MHz,尽管已经配置了72MHz
回复

使用道具 举报

20#
ID:483991 发表于 2019-3-4 07:38 | 只看该作者
先留个脚印,不知后面会不会用到
回复

使用道具 举报

21#
ID:50988 发表于 2019-3-4 08:15 来自手机 | 只看该作者
感谢楼主无私的奉献!
回复

使用道具 举报

22#
ID:375838 发表于 2019-3-4 13:53 | 只看该作者
实测delay_(100);实际上是900ms,时间变长了9倍,PLL没有开启
回复

使用道具 举报

23#
ID:510485 发表于 2019-4-18 17:44 | 只看该作者
感谢楼主无私的奉献
回复

使用道具 举报

24#
ID:102665 发表于 2019-5-8 20:34 | 只看该作者
定时器会工作了,但是proteus8.6仿真验证定时时间太长了!!!什么原因??
回复

使用道具 举报

25#
ID:530580 发表于 2019-5-9 10:26 | 只看该作者
感谢大佬分享,学习
回复

使用道具 举报

26#
ID:189285 发表于 2019-5-11 11:28 | 只看该作者
proteus
回复

使用道具 举报

27#
ID:351044 发表于 2019-5-14 15:20 | 只看该作者
真真的是太高手,真真的是太为人民服务了,真真的是太感谢了!
回复

使用道具 举报

28#
ID:61069 发表于 2019-5-16 09:26 | 只看该作者
仿真的最大频率好像只能到8M,如果你设置成72M那这样会增大CPU占用,搞得仿真变得更慢了
回复

使用道具 举报

29#
ID:351610 发表于 2019-5-19 13:48 | 只看该作者
我的不是HAL库   但我把 __HAL_RCC_TIM1_CLK_ENABLE()  宏定义的这句话粘贴进去了 可还是没用啊 怎么办
回复

使用道具 举报

30#
ID:402224 发表于 2019-5-21 08:17 | 只看该作者
厉害厉害
回复

使用道具 举报

31#
ID:593497 发表于 2019-9-4 15:57 | 只看该作者

不错的资料,感谢分享,学习1
回复

使用道具 举报

32#
ID:111893 发表于 2019-9-6 00:10 | 只看该作者
学习了大佬
回复

使用道具 举报

33#
ID:619729 发表于 2019-10-6 12:30 | 只看该作者
感谢分享
回复

使用道具 举报

34#
ID:626591 发表于 2019-10-19 16:07 | 只看该作者
感谢,我做定时器仿真也卡在这里,只有timer1能成功仿真,2和3都是报错。用你的方法使能定时器1之后就可以了
回复

使用道具 举报

35#
ID:76606 发表于 2019-12-2 11:17 | 只看该作者
大牛人的操作
回复

使用道具 举报

36#
ID:650054 发表于 2019-12-2 11:53 | 只看该作者
谢谢大大无私奉献!!!!
回复

使用道具 举报

37#
ID:63317 发表于 2019-12-2 16:29 | 只看该作者

感谢分享 下载了
回复

使用道具 举报

38#
ID:654593 发表于 2019-12-2 19:55 | 只看该作者
学习了,加油!!!
回复

使用道具 举报

39#
ID:630260 发表于 2020-2-15 22:14 | 只看该作者
大佬,请问一下。只要TIM1使能时钟就可以仿真成功了嘛?
回复

使用道具 举报

40#
ID:658039 发表于 2020-2-18 23:00 | 只看该作者
我用protues8.8绿色版可以仿真吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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