找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[零基础学习STM32]第十二讲:通用定时器—定时点亮LED

[复制链接]
跳转到指定楼层
楼主
ID:278743 发表于 2018-4-11 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、 概述
1、 TIM3简介
      iCore3使用的STM32F407IGT6芯片的具有10个通用定时器,分别为TIM2-TIM5、TIM9-TIM14,可用于定时、计数、输出PWM等。不同的定时器的计数方式、计数位数及功能有所不同,实验中使用的是TIM3,所以只对TIM3进行介绍。
2、 TIM3简介
      TIM3是一个16位递增、递减和递增/递减自动重载计数器,16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 到 65536 之间,可用于:输入捕获、 输出比较、PWM 生成(边沿和中心对齐模式)和单脉冲模式输出。在实际应用中,可以根据需要进行相应的配置,使用相应的功能。
二、硬件电路
                    图12_0 三色LED
      在iCore3双核心开发板中,三色LED与STM32F407相连,限流电阻为1K。
三、 实验原理
      实验中,通过TIM3实现500ms定时,每过500ms,LED颜色变化一次,三色LED按定时间隔交替闪烁。
四、 源代码
1.主函数
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/30/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         //定时500ms,每隔500ms三色LED灯闪烁一次
  17.         led.initialize();
  18.         timer3.initialize();
  19.         while(1){
  20.         }
  21. }
复制代码
2.TIM3初始化代码
  1. /*
  2. * Name                : initialize
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/30/2015
  10. *
  11. * create.
  12. * --------------------
  13. */

  14. static int initialize(void)
  15. {
  16.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  17.         NVIC_InitTypeDef NVIC_InitStructure;

  18.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);           //使能TIM3时钟

  19.         TIM_TimeBaseInitStructure.TIM_Period = 4999;               //设置自动重载值
  20.         TIM_TimeBaseInitStructure.TIM_Prescaler = 8399;           //设置定时器预分频系数
  21.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  22.         //设置时钟分频因子
  23.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数模式
  24.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

  25.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                  //使能TIM3更新中断
  26.         TIM_Cmd(TIM3,ENABLE);                                  //使能TIM3

  27.         //中断优先级分组
  28.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  29.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  30.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
  31.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  32.         NVIC_Init(&NVIC_InitStructure);

  33.         return 0;
  34. }

  35. /*
  36. * Name                : TIM3_IRQHandler
  37. * Description         : ---
  38. * Author              : ysloveivy.
  39. *
  40. * History
  41. * -------------------
  42. * Rev                 : 0.00
  43. * Date                : 30/11/2015
  44. *
  45. * create.
  46. * -------------------
  47. */
  48. void TIM3_IRQHandler(void)
  49. {
  50.         static int counter = 0;

  51.         //定时500ms,每隔500ms三色LED灯闪烁一次
  52.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
  53.         {
  54.                 if(counter % 3 == 0){
  55.                         LED_RED_ON;
  56.                         LED_BLUE_OFF;
  57.                         LED_GREEN_OFF;
  58.                 }else if(counter % 3 == 1){
  59.                         LED_RED_OFF;
  60.                         LED_BLUE_ON;
  61.                         LED_GREEN_OFF;
  62.                 }else if(counter % 3 == 2){
  63.                         LED_RED_OFF;
  64.                         LED_BLUE_OFF;
  65.                         LED_GREEN_ON;
  66.                 }
  67.                 counter ++;
  68.         }
  69.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  70. }
复制代码
3.定时器初始化结构体
  1. typedef struct
  2. {
  3.   uint16_t TIM_Prescaler;                                               
  4.   uint16_t TIM_CounterMode;      
  5.   uint32_t TIM_Period;         
  6.   uint16_t TIM_ClockDivision;   
  7.   uint8_t TIM_RepetitionCounter;  
  8. } TIM_TimeBaseInitTypeDef;
复制代码
   TIM_Prescaler:定时器预分频系数,0x0000- 0xFFFF。                                            
   TIM_CounterMode:计数模式,可选择向上计数 、向下计数和中央对其模式。  
   TIM_Period:定时器自动重载值,0x0000- 0xFFFF      
   TIM_ClockDivision:时钟分频因子,可选择1、2和4分频。
   TIM_RepetitionCounter:重复计数值,重复溢出相应的次数,进入中断。
五、 实验现象
       iCore3 双核心板三色LED每500ms交替闪烁。
六、 代码包下载


iCore3_12_TIMER.rar

851.49 KB, 下载次数: 16, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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