stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解

2023-11-16

stm32定时器时钟源时钟选择

stm32定时器时钟源时钟选择

有意义的参考

TI与ITRX的区别参考:https://blog.csdn.net/gtkknd/article/details/39292517

解析参考:https://blog.csdn.net/qq_33559992/article/details/103728903?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2

基础了解

时钟选择计数器时钟可由下列时钟源提供:

● 内部时钟(CK_INT)

● 外部时钟模式1:外部输入脚(TIx)

● 外部时钟模式2:外部触发输入(ETR)

● 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

在平常使用中我们系统复位 000 默认使用内部时钟源

内部时钟源

  从时钟选择框图中可以看到,内部时钟源(CK_INT)来自RCC的TIMx_CLK,即定时器本身的驱动时钟。

  当禁止从模式控制器(TIMx_SMCR寄存器的SMS=000),则预分频的时钟源CK_PSC由内部时钟源(CK_INT)驱动。定时器的实际控制位为CEN位、DIR位和UG位,并且只能被软件修改(UG位仍被自动清除)。只要CEN位被置1,预分频器的时钟CK_PSC就由内部时钟CK_INT提供。  

  通用定时器的内部时钟来源于APB1总线时钟,但是通用定时器的内部时钟是根据APB1总线时钟是否分频来决定的,如果APB1总线时钟预分频系数为1,则通用定时器的内部时钟就是APB1总线时钟;但是如果APB1总线时钟的分频系数为2,则通用定时器的内部时钟就是APB1总线时钟的2倍。

  下图显示了控制电路和向上计数器在一般模式下,不带预分频器时(分频系数为0)的操作。

  如图所示,只有当CEN位被置位高电平的时候,预分频器的时钟CK_PSC和计数器的时钟CK_CNT才开始工作。

外部时钟源1

来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作;

来自通道1的输入信号经过上升沿、下降沿双沿检测而生成的脉冲信号进行逻辑相或以后的信号就是TI1F_ED信号,即TI1F_ED双沿脉冲信号。

相关函数

TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);
//设置 TIMx 触发为外部时钟(从四个通道引脚引入)
//触发源选择:
//TIM_TIxExternalCLK1Source_TI1ED: 双边沿的Timer Input 1
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
//设置输入捕获的边沿:
//TIM_ICPolarity_Rising
//TIM_ICPolarity_Falling

//TIM_ICPolarity_BothEdge

//设置滤波设置:
//必须在0x0与0xF之间

代码示例

时钟源对频率进行计数

复制代码

#include "timer.h"
#include "led.h"
//     
//将PB5与tim2-ch1的pa0短接
pb5为时钟源对频率进行计数

void TIM2_Int_Init( u16 arr,u16 psc ){

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               
    GPIO_InitStructure.GPIO_Mode =     
     GPIO_Mode_IN_FLOATING;            
    GPIO_Init(GPIOA, &GPIO_InitStructure);   

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
        TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = arr;     
    TIM_TimeBaseStructure.TIM_Prescaler =psc; 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 
  /*重点*/  
 TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Falling,15);//设置输入滤波和边沿检测
    TIM_Cmd(TIM2, ENABLE);  
//
}

void TIM3_Int_Init(u16 arr,u16 psc){

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

                   


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
    TIM_TimeBaseStructure.TIM_Period = arr; 
    TIM_TimeBaseStructure.TIM_Prescaler = psc; 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 


    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);  

    TIM_Cmd(TIM3, ENABLE);               
}

void TIM3_IRQHandler(void){

    if (TIM_GetITStatus(TIM3, TIM_IT_Update)!=RESET){
                        LED0=!LED0;
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 
}

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"

int main(void)
{

delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
TIM2_Int_Init(10,0);

 

while(1)
{
//LED0=!LED0;
delay_ms(400);
printf("Count=%d\n",TIM_GetCounter(TIM2));
}

 

}

 

复制代码

//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2

这两个选项T1是CH1通道   T2经测试CH1与CH2通用

大概是这个异或的原因

 

 

外部时钟源模式2

来自于 外部触发脚[ETR脚] 经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器。当然分频和滤波不是必需的,可以根据外来信号频率高低及信号干净度来决定。

ETR功能较全可以完成T1的工作但仅限于CH1通道,可以经行分频

相关函数

TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波
//TIM_TS_ITR0 TIM内部触发0 TIM1
//TIM_TS_ITR1 TIM内部触发1 TIM2
//TIM_TS_ITR2 TIM内部触发2 TIM3
//TIM_TS_ITR3 TIM内部触发3 TIM4

 TIM_TS_TI1F_ED
TIM_TS_TI1FP1
 TIM_TS_TI2FP2
 TIM_TS_ETRF

 

 

TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式1.需要设置预分频,以及外部触发极性:滤波
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效 //TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效

代码示例

由第一个示例更改,功能一致main不变

复制代码

void TIM2_Int_Init( u16 arr,u16 psc ){

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef  GPIO_InitStructure;
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;               
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;            
    GPIO_Init(GPIOA, &GPIO_InitStructure);     
    
        TIM_DeInit(TIM2);
    TIM_TimeBaseStructure.TIM_Period = arr;     
    TIM_TimeBaseStructure.TIM_Prescaler =psc; 
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 

/*重点*/
        TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ITR3);//高级定时器开启
    TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0)//配置外部时钟2的模式;
    TIM_SetCounter( TIM2,0 );
/
 
    TIM_Cmd(TIM2, ENABLE);  

}
void TIM2_IRQHandler(void){    

    if (TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET){

    }
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    
}

https://www.cnblogs.com/forup/p/12756248.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解 的相关文章

随机推荐

  • Fabric实战(13)Fabric链码调试(容器外)

    链码调试 本文章所有操作基于的操作系统版本是 ubuntu16 04 64位 本文章基于的Fabric网络环境是 Fabric实战 2 运行一个简单的fabric网络 容器外 1 开发环境链码调试 1 1 容器之外运行Chaincode 第
  • 开机出现start pxe over ipv4 /start pxe over ipv6无法进入系统?!

    我遇到的是戴尔电脑start pxe over ipv4 出现此类问题的原因 用户将win10系统装成win7后出现的 一般是由于在重装系统之前在BIOS中不小心设置错误所引起的 解决方法 方法一 1 首先进入bios 不同品牌按不同的热键
  • C# 通过 RabbitMQ 实现定时任务 (延时队列)

    环境准备 需要在MQ中进行安装插件 地址链接插件介绍地址 https www rabbitmq com blog 2015 04 16 scheduling messages with rabbitmq 使用场景 作为一个新的预支付订单被初
  • 部署SpringBoot项目到云服务器

    服务器选择以及项目背景 我购买的是阿里云ECS服务器 它的特点是可以给我们配置服务器较大的自由度 我选择的是Centos Linux操作系统 我这次是希望在服务器上部署一个SpringBoot后台项目 最后实现的效果是我可以在手机App上通
  • Vivado的一些tcl命令记录(待补充)

    1 Report Clock Networks report clock networks name network 1 2 分析设计中逻辑级数的分布 report design analysis logic level distribut
  • NLP(自然语言处理)是什么?

    NLP基本概念 自然语言处理 Natural Language Processing NLP 是以语言为对象 利用计算机技术来分析 理解和处理自然语言的一门学科 即把计算机作为语言研究的强大工具 在计算机的支持下对语言信息进行定量化的研究
  • simplest-jpa v1.2.0如何优雅实现多租户

    开始使用 simplest详细文档 simplest jpa 使用多租户需要 2 个步骤 在属性中配置对应租户表和列 配置 TenantFactory 注入租户数据源 TenantFactory 是用于生产租户 ID 的 或者说是用于获取当
  • idea 内存不足 low memory 彻底解决

    1 在IDE中 帮助 help gt 编辑自定义vm配置 idea64 exe vmoptions文件 修改 Xmx2048m Xms2048m 增加根据自己的系统内存 此时重启idea 仍然报内存不足 提示提高内存 通过idea log发
  • Loader Runner 课程笔记(一)录制设置和压测

    1 录制前设置 1 创建脚本 新建单协议脚本 选择Web协议 创建 LR11只支持WIN7系统 浏览器IE8 9和低版本的火狐 24 0或36 0 高版本IE可以卸载装IE8或9 不支持谷歌 LR自带火狐路径HP LoadRunner bi
  • 关于ECC-Elgamal同态加密

    关于ECC Elgamal同态加密 1 什么是ECC elliptic curve 1 有限域 首先我们要知道椭圆曲线加密是在有限域进行加密的 对于无限域上的加密我没有了解过 在椭圆曲线 加密上有限域分为 1 GF p 素数域2 GF 2
  • Python 爬虫案例

    一 用cookie池模拟登录 在网络请求交互中 为了维持用户的登录状态 引入了cookie的概念 当用户第一次登录某个网站时 网站服务器会返回维持登录状态需要用到的信息 这些信息就称为cookie 浏览器会将cookie信息保存在本地计算机
  • Intellij IDEA快速实现Docker镜像部署

    1 Docker开启远程访问 root izwz9eftauv7x69f5jvi96z docker vim lib systemd system docker service 修改ExecStart这行 ExecStart usr bin
  • python中各种文件类型的读写

    本文汇总了在python中各种类型文件的读取和写入 包含文本 图像 表格 log文件 pickle文件 npy文件 npz文件等 文本类型 txt文件 json文件 yaml文件 图像类型 使用skimage PIL opencv imag
  • Java解决线程安全问题

    文章目录 背景 1 线程安全问题 1 1 什么是线程安全 1 2 产生的原因 1 3 实例 买票超卖问题 1 4 如何确定是否存在线程安全问题 2 如何解决线程安全问题 2 1 不可变 Immutable 2 2 变量私有化 2 2 1 栈
  • 数据库--商品 表的设计

    目录 商品分类表 商品品牌表 商品分类表 tb item cat 树状结构 CREATE TABLE tb item cat id bigint 20 NOT NULL AUTO INCREMENT COMMENT 类目ID parent
  • GBDT调库代码示例

    二 使用GBDT预测新能源汽车充电桩的故障检测问题 55分 请你用训练数据构建相应的模型 并将模型进行保存 import matplotlib pyplot as plt 正常显示中文及字符 plt rcParams font family
  • python中返回上一步操作_通过实例解析Python文件操作实现步骤

    当程序运行时 变量是保存数据的好方法 但变量 序列以及对象中存储的数据是暂时的 程序结束后就会丢失 如果希望程序结束后数据仍然保持 就需要将数据保存到文件中 Python 提供了内置的文件对象 以及对文件 目录进行操作的内置模块 通过这些技
  • Nginx启动只有master进程而没有worker进程

    大致按照下面文章的提示进行排查 https blog csdn net sinat 37729104 article details 102662475 https blog csdn net qt10086 article details
  • docker配置java环境和mysql数据库

    1 安装docker 1 安装命令 yum install docker 有提示直接y确认 2 设置开机自动启动 service docker start 3 查看版本 docker version 4 修改docker仓库地址 命令 vi
  • stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解

    stm32定时器时钟源时钟选择 stm32定时器时钟源时钟选择 有意义的参考 TI与ITRX的区别参考 https blog csdn net gtkknd article details 39292517 解析参考 https blog