学习使用笔记:复制粘贴久了有些忘记如何配置了,复制了框图、官方代码与寄存器学习和回忆

基本定时器功能框图:

1:打开来自RCC的时钟(RCC_APB1PeriphClockCmd)

固件库代码与寄存器位展示

            1:固件库代码:NewState 若不等于DISABLE则将输入值与当前寄存器值进行按位或,等于将需要开启的寄存器位写1,否则取反按位与->不改变其他位,对控制位写0.

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){RCC->APB1ENR |= RCC_APB1Periph;}else{RCC->APB1ENR &= ~RCC_APB1Periph;}
}/*部分的RCC_APB1Periph可选值含义,使用估计库可以直接填写名字*/
#define RCC_APB1Periph_TIM2              ((uint32_t)0x00000001)
#define RCC_APB1Periph_TIM3              ((uint32_t)0x00000002)
#define RCC_APB1Periph_TIM4              ((uint32_t)0x00000004)
#define RCC_APB1Periph_TIM5              ((uint32_t)0x00000008)
#define RCC_APB1Periph_TIM6              ((uint32_t)0x00000010)
#define RCC_APB1Periph_TIM7              ((uint32_t)0x00000020)
#define RCC_APB1Periph_TIM12             ((uint32_t)0x00000040)
#define RCC_APB1Periph_TIM13             ((uint32_t)0x00000080)
#define RCC_APB1Periph_TIM14             ((uint32_t)0x00000100)
#define RCC_APB1Periph_WWDG              ((uint32_t)0x00000800)
#define RCC_APB1Periph_SPI2              ((uint32_t)0x00004000)
#define RCC_APB1Periph_SPI3              ((uint32_t)0x00008000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)

2:配置PSC预分频器(16位:0-65535)用来改变时钟

3:配置计数器CNT(16位:只能向上计数)

定时器初始化固件库代码与寄存器位展示:

typedef struct
{uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.This parameter can be a number between 0x0000 and 0xFFFF */uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.This parameter can be a value of @ref TIM_Counter_Mode */uint16_t TIM_Period;            /*!< Specifies the period value to be loaded into the activeAuto-Reload Register at the next update event.This parameter must be a number between 0x0000 and 0xFFFF.  */ uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.This parameter can be a value of @ref TIM_Clock_Division_CKD */uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restartsfrom the RCR value (N).This means in PWM mode that (N+1) corresponds to:- the number of PWM periods in edge-aligned mode- the number of half PWM period in center-aligned modeThis parameter must be a number between 0x00 and 0xFF. @note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;     void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
{uint16_t tmpcr1 = 0;/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode));assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision));tmpcr1 = TIMx->CR1;  if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)||(TIMx == TIM4) || (TIMx == TIM5)) {/* Select the Counter Mode */tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS)));tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode;}if((TIMx != TIM6) && (TIMx != TIM7)){/* Set the clock division */tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD));tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision;}TIMx->CR1 = tmpcr1;/* Set the Autoreload value */TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ;/* Set the Prescaler value */TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler;if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))  {/* Set the Repetition Counter value */TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;}/* Generate an update event to reload the Prescaler and the Repetition countervalues immediately */TIMx->EGR = TIM_PSCReloadMode_Immediate;
}

4:定时器时钟使能官方库、寄存器

#define  TIM_CR1_CEN                         ((uint16_t)0x0001)            /*!< Counter enable */void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Enable the TIM Counter */TIMx->CR1 |= TIM_CR1_CEN;}else{/* Disable the TIM Counter */TIMx->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));}
}

若输入DNE对CR1的CEN写入

5:初始化中断使能以及删除中断标志位

 1) TIMx_SR:判断是否有中断,写入0则无中断更新,

         2) TIMx_DIER:开启计数器中断

       

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG)
{  /* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG));/* Clear the flags */TIMx->SR = (uint16_t)~TIM_FLAG;
}
#define TIM_IT_Update                      ((uint16_t)0x0001)void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
{  /* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_TIM_IT(TIM_IT));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Enable the Interrupt sources */TIMx->DIER |= TIM_IT;}else{/* Disable the Interrupt sources */TIMx->DIER &= (uint16_t)~TIM_IT;}
}

 为ENABLE时对UIE位写入1:使能更新中断

基本定时器TIM6定时总代码:

#ifndef __TIMEBASE_H
#define __TIMEBASE_H#include "stm32f10x.h"#define BASIC_TIM                 TIM6
#define BASIC_TIM_APBxClock_FUN   RCC_APB1PeriphClockCmd
#define BASIC_TIM_CLK             RCC_APB1Periph_TIM6
#define BASIC_TIM_IRQ             TIM6_IRQn
#define BASIC_TIM_IRQHandler      TIM6_IRQHandlervoid BASIC_TIM_Init(void);
void TIME_BASE_Config(void);
void TIME_BASE_NVIC_Config(void);#endif  /*__TIMEBASE_H*/
/*********************************************
*功能:基本定时器配置
*输入:nc
*输出:nc
*说明:初始化定时器、配置计数值、分频数
**********************************************/
void TIME_BASE_Config(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;// 开启定时器时钟,即内部时钟 CK_INT=72MBASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);//计数值TIM_TimeBaseStruct.TIM_Period=999;// 累计 TIM_Period 个频率后产生一个更新或者中断// 时钟预分频数为 71,则驱动计数器的时钟 CK_CNT = CK_INT / (71+1)=1MTIM_TimeBaseStruct.TIM_Prescaler=71;//结构体初始化TIM_TimeBaseInit(BASIC_TIM,&TIM_TimeBaseStruct);TIM_Cmd(BASIC_TIM,ENABLE);// 清除计数器中断标志位TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);// 开启计数器中断TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);//暂时关闭APB1时钟BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, DISABLE);
}/********************************************
*功能:NVIC配置
*输入:nc
*输出:nc
*说明:初始化函数,中断优先级配置
*********************************************/
void TIME_BASE_NVIC_Config(void)
{NVIC_InitTypeDef  NVIC_InitStruct;// 设置中断组为 0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStruct.NVIC_IRQChannel=BASIC_TIM_IRQ;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;NVIC_Init(&NVIC_InitStruct);}/********************************************
*功能:基本定时器初始化
*输入:nc
*输出:nc
*说明:定时器初始化函数
*********************************************/
void BASIC_TIM_Init(void)
{TIME_BASE_Config();TIME_BASE_NVIC_Config();
}

stm32f103基本定时器的使用相关推荐

  1. STM32F103基本定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动.它们可以作为通用定时器提 ...

  2. STM32F103通用定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成.它适用于多种场合,包括测量输入信号的脉冲长度( ...

  3. STM32F103高级定时器使用

      STM32F103单片机中定时器分为3种,高级定时器.通用定时器.基本定时器.   高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动.它适合多种用 ...

  4. STM32F103利用定时器编程实现输出一路PWM波形

    目录 一.PWM简介 二.STM32F1 PWM介绍 三.PWM输出配置步骤 四.实现代码 五.实现效果 六.参考资料 一.PWM简介 PWM是 Pulse Width Modulation 的缩写, ...

  5. STM32F103 - CubeMX 的使用实例详细(04.5)- STM32F103的 - 定时器设定详细解释 - 定时器相关的HAL接口函数 - 定时器的中断

    前言:本文介绍STM32 定时器中断控制的HAL 接口定义: 1 该驱动接口能实现的主要功能: 1.1 有哪些驱动 /**   ************************************ ...

  6. STM32 - CubeMX 的使用实例详细(04.1)- STM32F103的 - 定时器设定详细解释 - PWM波的产生 - 频率占空比的设定 - 软件代码分析

    前言:本文详细条例STM32 103定时器的设定 1 定时器简介 中等容量的STM32F103xx增强型系列产品包含1个高级控制定时器.3个普通定时器,以及2个看门 狗定时器和1个系统嘀嗒定时器. 下 ...

  7. STM32F103 TIM4定时器

    1.通用定时器(TIM) 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时 ...

  8. STM32F103高级定时器死区时间计算

    官方数据手册的说明不容易看懂,举的例子与我的应用场合也不一致,我使用的是72MHz的晶振,讲一讲我的死区时间是怎么算出来的. DT死区时间: TDTS为系统时钟周期时长: TDTG为系统周期时长乘以倍 ...

  9. STM32F103高级定时器死区时间的计算

    看了一些网上讲死区时间计算的教程,觉得讲述的不是很清楚,所以在此用我自己理解的方式讲述一遍,如有错误,请读者赐教. 死区时间的设置:由寄存器"TIM1和TIM8刹车和死区寄存器TIMX_BD ...

  10. STM32F103 基本定时器 (P2MDA-KM4)

    27 基本定时器 27.1 定时器分类 STM32F1 系列中,除了互联型的产品,共有8 个定时器,分为基本定时器,通用定时器和高级定时器. 基本定时器:TIM6 和TIM7 是一个16 位的只能向上 ...

最新文章

  1. nodejs 获取文件路径_Qunar 酒店 Nodejs 覆盖率收集实践
  2. 2021护理正高考试成绩查询,中国卫生人才网:2021年护资考试成绩现可查询!
  3. python测试代码怎么写_Python 单元测试
  4. python的源代码文件的扩展名是-python源文件后缀是什么?
  5. oauth2和jwt学习资料
  6. Eclipse常用功能键
  7. 第 14 章 Networking
  8. 计算机制片管理系统,Agile Shot:新一代影视制片流程管理系统大揭秘
  9. Mapxtreme Java 地图缩放,平移操作的原理和实现
  10. Chrome firefox ie等浏览器空格(nbsp;)兼容问题
  11. 蓝桥杯 ADV-91 算法提高 素数判断
  12. 对CSRF(跨站请求伪造)的理解
  13. 安装j2ee开发环境
  14. [ustc]那些杀手不太冷
  15. matlab如何定义dmod函数,matlab中的dmod函数
  16. GOOGLE卫星地图
  17. MINIO(一)简介
  18. xadmin的一些自定义
  19. macOS Catalina(mac10.15.5系统)
  20. Python Orange入门之第一节:数据输入格式

热门文章

  1. 中国SSD行业企业势力全景图
  2. 新版CSDN浏览器助手打造沉浸式阅读体验,快来看看吧!
  3. 仰邦LED(BX-Y08)二次开发的java版流程梳理记录
  4. VMware Horizon 8安装部署(二)NFS共享存储
  5. HTML5 - Three.js 3D特效学习
  6. 直接在excel里面去除重复行
  7. java hive和hbase整合,Hive入门3–Hive与HBase的整合
  8. 吾爱破解crackme 033 034
  9. Android:UI控件ViewPager,notifyDataSetChanged
  10. mp4 android自动播放,Android - 简单使用VideoView播放MP4