3-4 STM32F405--定时器输入捕获

devtools/2024/12/22 10:53:25/

功能描述:测量方波频率和占空比。通过将TIM9配置为输入捕获模式

  • main.c文件内容如下
    #include "stm32f4xx.h"                  // Device header
    #include "Delay.h"
    #include "MyDMA.h"
    #include "Serial.h"
    #include "Timer.h"int main(void)
    {Serial_Init();	//初始化串口Timer_Init();	//初始化定时器Serial_SendString(USART1,"Hello, world!\n"); //串口输出字符串while(1){//IC_GetFreq()获得信号频率,通过串口显示Serial_Printf(USART1,"The frequency of the sign is %dHz\n", IC_GetFreq());//IC_GetDutyRatio()获得信号占空比,通过串口显示Serial_Printf(USART1,"The duty ratio of the sign is %.1f%% \n", 100*IC_GetDutyRatio());Delay_ms(500);}
    }
    
  • Timer.c文件内容如下
    #include "Timer.h"                  /*** @摘要  		初始化TIM* @参数  		无* @返回值  	无* @说明  		无*/
    void Timer_Init(void)
    {//开启GPIOA时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//将PA2配置为复用模式,复用为TIM9的CH1引脚GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM9);//定义GPIO初始化结构体GPIO_InitTypeDef GPIO_InitStructure;//初始化上述结构体GPIO_StructInit(&GPIO_InitStructure);//配置GPIO模式为复用模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//配置GPIO输出类型为推挽输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//配置GPIO输入类型为上拉输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//配置GPIO的速度为高速100MHZGPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//指定GPIO引脚为Pin2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//初始化对应的GPIOGPIO_Init(GPIOA, &GPIO_InitStructure);//开启TIM9时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);			//选择TIM9的时钟模式为内部模式,时钟源为内部时钟(84*2=168MHZ)TIM_InternalClockConfig(TIM9);									//定义时基单元初始化结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//初始化上述结构体TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);				//配置预分频系数为168-1TIM_TimeBaseInitStructure.TIM_Prescaler = 168-1;				//配置自动重装值为0XFFFFTIM_TimeBaseInitStructure.TIM_Period = 0XFFFF;					//配置计数模式为向上计数TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//配置定时器时钟频率与数字滤波器所使用的采样时钟之间的分频比TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//配置重复计数器的值为0TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//初始化时基单元TIM_TimeBaseInit(TIM9, &TIM_TimeBaseInitStructure);				//定义输入捕获单元初始化结构体TIM_ICInitTypeDef TIM_ICInitStruct;//初始化上述结构体TIM_ICStructInit(&TIM_ICInitStruct);//选择通道TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//配置输入捕获通道的滤波器TIM_ICInitStruct.TIM_ICFilter = 0x6;//选择触发的边沿类型TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//配置输入捕获通道的分频器TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//输入信号选择TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//初始化输入捕获单元TIM_ICInit(TIM9, &TIM_ICInitStruct);//配置TIM,使其可测占空比TIM_PWMIConfig(TIM9, &TIM_ICInitStruct);//上面这句等同于下面这段注释内容
    //	//初始化上述结构体
    //	TIM_ICStructInit(&TIM_ICInitStruct);
    //	//选择通道
    //	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
    //	//配置输入捕获通道的滤波器
    //	TIM_ICInitStruct.TIM_ICFilter = 0x6;
    //	//选择触发的边沿类型
    //	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
    //	//配置输入捕获通道的分频器
    //	TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    //	//输入信号选择
    //	TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    //	//初始化输入捕获单元
    //	TIM_ICInit(TIM9, &TIM_ICInitStruct);//选择从模式触发源TIM_SelectInputTrigger(TIM9, TIM_TS_TI1FP1);//选择从模式的执行动作TIM_SelectSlaveMode(TIM9, TIM_SlaveMode_Reset);//开启TIM9,此时计数器开始工作TIM_Cmd(TIM9, ENABLE);	
    }/*** @摘要  		获得输入捕获通道信号的频率* @参数  		无* @返回值  	输入捕获通道信号的频率* @说明  		无*/
    uint32_t IC_GetFreq(void)
    {uint32_t cnt = TIM_GetCapture1(TIM9);if(cnt == 0)return 0;elsereturn 1000000/cnt;//周期=计数值/计数频率,频率=计数频率/计数值
    }/*** @摘要  		获得输入捕获通道信号的占空比* @参数  		无* @返回值  	输入捕获通道信号的占空比* @说明  		无*/
    double IC_GetDutyRatio(void)
    {uint32_t cnt = TIM_GetCapture1(TIM9);if(cnt != 0)return (double)TIM_GetCapture2(TIM9)/cnt;//占空比=高电平持续时间/周期return 0;
    }
    
  • Timer.h文件内容如下
    #ifndef __TIMER_H
    #define __TIMER_H#include "stm32f4xx.h"                  // Device headervoid Timer_Init(void);
    uint32_t IC_GetFreq(void);
    double IC_GetDutyRatio(void);#endif
    

http://www.ppmy.cn/devtools/99065.html

相关文章

SpringCloud整合Nacos配置中心

版本说明 spring-cloud version &#xff1a;2021.0.5.0 spring-boot.version&#xff1a;2.6.13 1. 引入依赖 <!--Nacos config--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config<…

Java笔试面试题AI答之线程(4)

文章目录 19. Java编写多线程程序的时候你会遵循哪些最佳实践&#xff1f;1. 使用线程池2. 使用Callable和Future3. 保证变量可见性4. 保证线程安全5. 避免死锁6. 安全地终止线程7. 使用并发容器8. 使用ThreadLocal避免共享变量9. 合理使用原子类10. 编写可测试的代码 20. 解释…

K8S - Java微服务配置之ConfigMap

前言 参考文档&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-pod-configmap/#interim-cleanup 使用 ConfigMaps 和 Secrets 配置环境变量&#xff0c;使用 MicroProfile Config 来消费这些变量 可以使用以下方式为docker容器设置环…

汽车功能安全--AutoSAR中的功能安全机制

目录 1. Memory Partitioning 2. Timing\Excute Monitor 3. E2E 4.小结 大家好&#xff0c;这里是高温下认真码字的肌肉&#xff1b;许久没有聊中间件的问题&#xff0c;正巧可能要启动SafetyPack的开发&#xff0c;因此今天回顾回顾在AUTOSAR文档中关于Safety的一些机制。…

二叉树练习

1.认识树 树的根节点及其子树&#xff0c;都是相对的概念。在任何一棵树中都有一个根节点&#xff0c;而这棵树本身又可以是别的树的子树。树的基本概念有&#xff1a; A)双亲和孩子&#xff1a;一个节点的后继节点被称为该节点的孩子&#xff0c;该节点称为这些孩子的双亲。…

【微服务】Nacos配置中心和客户端数据同步模式

一、Nacos概述 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它提供了一组简单易用的特性集&#xff0c;帮助用户快速实现动态服务发现、服务配置、服务元数据及流量管理。 二、数据同步模式 1. 实时同步 Push模式&#xff1a;在服务端的配置信…

leetcode_59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目描述&#xff1a;给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a;​ 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&…

[Matsim]Matsim学习笔记-drt场景中车辆调度的学习

学习需求 在用matsim实现交通流模拟drt场景时&#xff0c;遇到这样一个问题&#xff1a;车辆接送完乘客后&#xff0c;在没有新的订单之前&#xff0c;车辆一直停在最后一个停靠点上&#xff0c;这样车辆的利用率会较低&#xff0c;想实现一个送完最后一个乘客后&#xff0c;车…