你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记07—基础定时器实验

[复制链接]
STMCU 发布时间:2020-10-29 12:53
STM32学习笔记07—基础定时器实验


7.1 STM32定时器概述
       STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。

       STM32的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。
通用定时器的内部结构如下图所示。
1.png
7.2 相关寄存器
要使用通用定时器的基本功能,一共需要配置4个寄存器,剩余的寄存器都是在输入捕获和输出比较中使用到的。

7.2.1 控制寄存器1:TIMx_CR1
2.png
Bit 9~Bit 8:时钟分频系数,定义定时器输入时钟频率与数字滤波器采样频率之间的分频系数
       00:采样频率与定时器输入频率相等
       01:采样频率是定时器输入频率的2倍
       10:采样频率是定时器输入频率的4倍
       11:保留
Bit 7:自动重装载使能
       0:TIMx_ARR寄存器中没有缓冲
       1:TIMx_ARR寄存器的数据装入缓存器
Bit 6~Bit 5:选择中央对齐模式
       00:边沿对齐模式,计数器根据方向位DIR计数
       01:中央对齐模式1,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下计数时被设置
       10:中央对齐模式2,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向上计数时被设置
       11:中央对齐模式3,计数器交替向上向下计数,当TIMx_CCMRx中的CCxS=00时,计数器向下和向上计数时       被均设置
Bit 4:计数方向
       0:向上计数,计数器从0计数到TIMx_ARR寄存器的数据时重新从0开始并产生一个计数器溢出事件
       1:向下计数,计数器从TIMx_ARR寄存器的数据计数到0时重新从TIMx_ARR寄存器的数据开始并产生一个计数器溢出事件
Bit 3:单脉冲模式
       0:发生更新事件时计数器不停止
       1:在发生下一次更新事件时,计数器停止
Bit 2:更新请求源
       0:如果使能了更新中断或DMA请求,计数器溢出/设置UG位/从模式控制器产生更新都产生更新中断或DMA请求
       1:如果使能了更新中断或DMA请求,只有计数器溢出才产生更新中断或DMA请求
Bit 1:禁止更新
       0:允许UEV。更新事件由计数器溢出/设置UG位/从模式控制器产生更新事件产生
       1:不产生更新事件
Bit 0:使能计数器
       0:禁止计数器
       1:使能计数器
7.2.2 DMA/中断使能寄存器:TIMx_DIER
3.png
Bit 14:允许触发DMA请求
       0:禁止触发DMA请求
       1:允许触发DMA请求
Bit 12:允许捕获/比较4的DMA请求
       0:禁止捕获/比较4的DMA请求
       1:允许捕获/比较4的DMA请求
Bit 11:允许捕获/比较3的DMA请求
       0:禁止捕获/比较3的DMA请求
       1:允许捕获/比较3的DMA请求
Bit 10:允许捕获/比较2的DMA请求
       0:禁止捕获/比较2的DMA请求
       1:允许捕获/比较2的DMA请求
Bit 9:允许捕获/比较1的DMA请求
       0:禁止捕获/比较1的DMA请求
       1:允许捕获/比较1的DMA请求
Bit 8:允许更新的DMA请求
       0:禁止更新的DMA请求
       1:允许更新的DMA请求
Bit 6:触发中断使能
       0:禁止触发中断
       1:允许触发中断
Bit 4:允许捕获/比较4的中断
       0:禁止捕获/比较4的中断
       1:允许捕获/比较4的中断
Bit 3:允许捕获/比较3的中断
       0:禁止捕获/比较3的中断
       1:允许捕获/比较3的中断
Bit 2:允许捕获/比较2的中断
       0:禁止捕获/比较2的中断
       1:允许捕获/比较2的中断
Bit 1:允许捕获/比较1的中断
       0:禁止捕获/比较1的中断
       1:允许捕获/比较1的中断
Bit 0:允许更新中断
       0:禁止更新中断
       1:允许更新中断
7.2.3 预分频寄存器:TIMx_PSC
4.png
Bit 15~Bit 0:预分频器的值,计数器的时钟频率计算公式为


7.2.4 自动重装载寄存器:TIMx_ARR
5.png
Bit 15~Bit 0:自动重装载的值,该值就是传送到实际的自动重装载寄存器的数值,当该寄存器的值为空时,计数器不工作。
7.2.5 状态寄存器:TIMx_SR
6.png
Bit 12:捕获/比较4重复捕获标记
       0:无重复捕获产生
       1:当计数器的值捕获到TIMx_CCR4寄存器时,CC4IF的状态已经为1
Bit 11:捕获/比较3重复捕获标记
       0:无重复捕获产生
       1:当计数器的值捕获到TIMx_CCR3寄存器时,CC3IF的状态已经为1
Bit 10:捕获/比较2重复捕获标记
       0:无重复捕获产生
       1:当计数器的值捕获到TIMx_CCR2寄存器时,CC2IF的状态已经为1
Bit 9:捕获/比较1重复捕获标记
       0:无重复捕获产生
       1:当计数器的值捕获到TIMx_CCR1寄存器时,CC1IF的状态已经为1
Bit 6:触发器中断标记
       0:无触发事件产生
       1:触发器中断等待响应
Bit 4:捕获/比较4中断标记
       通道CC4配置为输出模式:
       0:无匹配发生
       1:TIMx_CNT的值与TIMx_CCR4的值匹配
       通道CC4配置为输入模式:
       0:没有输入捕获产生
       1:计数器值已经被捕获到TIMx_CCR4中(在IC4上检测到与所选极性相同的边沿)
Bit 3:捕获/比较3中断标记
       通道CC3配置为输出模式:
       0:无匹配发生
       1:TIMx_CNT的值与TIMx_CCR3的值匹配
       通道CC3配置为输入模式:
       0:没有输入捕获产生
       1:计数器值已经被捕获到TIMx_CCR3中(在IC3上检测到与所选极性相同的边沿)
Bit 2:捕获/比较2中断标记
       通道CC2配置为输出模式:
       0:无匹配发生
       1:TIMx_CNT的值与TIMx_CCR2的值匹配
       通道CC2配置为输入模式:
       0:没有输入捕获产生
       1:计数器值已经被捕获到TIMx_CCR2中(在IC2上检测到与所选极性相同的边沿)
Bit 1:捕获/比较1中断标记
       通道CC1配置为输出模式:
       0:无匹配发生
       1:TIMx_CNT的值与TIMx_CCR1的值匹配
       通道CC1配置为输入模式:
       0:没有输入捕获产生
       1:计数器值已经被捕获到TIMx_CCR1中(在IC1上检测到与所选极性相同的边沿)
Bit 0:更新中断标记
       0:无更新事件产生
       1:更新中断等待响应,当产生更新事件时该位由硬件置1,由软件清0
7.2.6 计数器:TIMx_CNT
7.png
Bit 15~Bit 0:计数器的值
7.3 定时器例程
利用定时器1实现LED以1Hz闪烁,LED接在PA1上。

(1)创建TIM1驱动文件,tim.c和tim.h,并将文件添加进工程。
8.png
(2)在寄存器文件中添加定义如下图所示。
添加定时器地址
9.png
添加定时器结构体映射
10.png
(3)tim.h写入如下图所示代码
11.png
(4)tim.c写入如下所示代码

  1. #include "tim.h"
  2. /***************************************************
  3. Name    :TIM7_IRQHandler
  4. Function    :TIM7中断服务函数
  5. Paramater  :None
  6. Return    :None
  7. ***************************************************/
  8. u8 TIM1_Count ;
  9. void TIM1_UP_IRQHandler()
  10. {
  11.   if( ( TIM1->SR&0x01 )==0x01 )
  12.   {
  13.     TIM1_Count ++ ;
  14.     if( TIM1_Count==1 )
  15.       LED = 0 ;
  16.     else if( TIM1_Count==2 )
  17.     {
  18.       LED = 1 ;
  19.       TIM1_Count = 0 ;
  20.     }
  21.   }
  22.   TIM1->SR &= ~( 1<<0 ) ;
  23. }
  24. /***************************************************
  25. Name    :TIM7_Init
  26. Function    :TIM7初始化
  27. Paramater  :
  28.       psc:预分频系数
  29.       arr:重装载值
  30. Return    :None
  31. ***************************************************/
  32. void TIM1_Init( u16 psc, u16 arr )
  33. {
  34.   //LED初始化
  35.   RCC->APB2ENR |= 1<<2 ;
  36.   GPIOA->CRL &= 0xFFFFFF0F ;
  37.   GPIOA->CRL |= 0x00000030 ;
  38.   LED = 1 ;
  39.   //定时器初始化
  40.   RCC->APB2ENR |= 1<<11 ;
  41.   TIM1->DIER |= 1<<0 ;
  42.   TIM1->PSC = psc ;
  43.   TIM1->ARR = arr ;
  44.   TIM1->CR1 |= 1<<0 ;
  45.   NVIC_Init( 3, 2, TIM1_UP_IRQn, 2 ) ;
  46.   }
复制代码


(5)主函数编写如下所示代码
12.png
7.4 软件仿真截图

13.png


收藏 评论0 发布时间:2020-10-29 12:53

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版