首页 > 其他分享 >stm32系列--同一定时器双通道捕获

stm32系列--同一定时器双通道捕获

时间:2024-06-05 16:48:52浏览次数:12  
标签:TIM3 -- NVIC 双通道 stm32 TIM GPIO myt3 ICInitStructure

 

void TIM3_Cap_Init(u16 arr,u16 psc)//定时器3通道2输入捕获配置
{
    TIM_ICInitTypeDef  TIM_ICInitStructure; 
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
         GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//从优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
    //INIT_GPIO(RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_6,GPIO_Mode_IPU); //初始化A06为上拉输入,用于输入捕捉
    

     
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //使能PA端口时钟
            
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                      
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;          //上拉输入
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
         GPIO_Init(GPIOA, &GPIO_InitStructure);    
 
         //初始化定时器4 TIM2     
        TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
        TIM_TimeBaseStructure.TIM_Prescaler =psc;     //预分频器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;    //选择输入端,
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //双沿捕获
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   //配置输入分频,不分频
    TIM_ICInitStructure.TIM_ICFilter = 0x0;     //配置输入滤波器 不滤波  
    TIM_ICInit(TIM3, &TIM_ICInitStructure); //初始化参数
        
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;    //选择输入端,
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //双沿捕获  //TIM_ICPolarity_Rising
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;   //配置输入分频,不分频
    TIM_ICInitStructure.TIM_ICFilter = 0x0;     //配置输入滤波器 不滤波  
    TIM_ICInit(TIM3, &TIM_ICInitStructure); //初始化参数
    
        TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2 ,ENABLE);
        TIM_Cmd(TIM3, ENABLE);      //使能定时器3
}

void TIM3_IRQHandler(void)   //TIM3中断服务函数
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)     
        {        
             TIM_ClearITPendingBit(TIM3, TIM_IT_Update);             //清除中断标志位
        }
        if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)            //捕获1发生捕获事件
        {    
            myt3.TIM3CH1_CAPTURE_VAL=TIM_GetCapture1(TIM3);

            TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);             //清除中断标志位 
        }    
        if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
        {    
            myt3.TIM3CH2_CAPTURE_VAL=TIM_GetCapture2(TIM3);
            myt3.timout=5;
            myt3.handle_timout=5000;//不再有测量 5s后输出结果
            TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);             //清除中断标志位 
        }            
}
TIM3_Cap_Init
    TIM3_Cap_Init(0xffff,71); //PA6
main
void TIM4_IRQHandler(void)   //TIM3中断 1MS
{
    u8 st;
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    {      
        st= TIM_GetFlagStatus(TIM4, TIM_FLAG_Update);    
        if(st==SET)
        {
          TIM_ClearFlag(TIM4, TIM_FLAG_Update);
            
            if(myusart.timout>0)//5MS 开始处理数据
            {
                if(--myusart.timout==0)
                {
                    myusart.reflag=1;  //收到一帧数据

                }
            }
            if(myt3.timout>0)//5MS 开始处理数据
            {
                if(--myt3.timout==0)
                {
                    myt3.sum++;    
          myt3.TIM3CH1_CAPTURE_VAL += 400;
                    myt3.TIM3RET=myt3.TIM3CH1_CAPTURE_VAL-myt3.TIM3CH2_CAPTURE_VAL;
                    if(myt3.TIM3RET<2000 && myt3.TIM3RET>0)
                    myt3.pass++;
                    
//                    if((myt3.k_num>=3) && (myt3.pass >= 3))
//                    {
//                        printf("pass\r\n");
//                        GPIO_SetBits(GPIOA,GPIO_Pin_0);;
//                    }
//                    printf("TIM3RET= %d\r\n",myt3.TIM3RET);
                }
            }
            if(myt3.judge_count++ >= 500)//没500MS 做一次判断;还是不行,会把测试通过的结果清除掉
            {
                myt3.judge_count=0;    
                if(myt3.finish_flag==0)
                {
                    if((myt3.pass >= myt3.sum/2) && (myt3.pass >= 3))
                    {
                        GPIO_SetBits(GPIOA,GPIO_Pin_0);
                        myt3.finish_flag=1;
                        
                    }
                    else
                    {
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                        myt3.finish_flag=0;
                    }
                }        
            }
            if(myt3.handle_timout>0)//5S 开始处理数据
            {
                if(--myt3.handle_timout==0)
                {
                    if((myt3.pass >= myt3.sum/2) && (myt3.pass >= 3))
                    {
                        printf("pass\r\n");
                        GPIO_SetBits(GPIOA,GPIO_Pin_0);
                        myt3.finish_flag=1;
                    }
                    else
                    {
                        printf("null\r\n");
                        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                        myt3.finish_flag=0;
                    }
                    
                    myt3.pass=0;
                    myt3.sum=0;
                }
            }            
        }    
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
    }
}
TIM4_IRQHandler

 

标签:TIM3,--,NVIC,双通道,stm32,TIM,GPIO,myt3,ICInitStructure
From: https://www.cnblogs.com/zhouyuqing1024/p/18233299

相关文章

  • centos 安装pyenv
    下载pyenvwget https://github.com/pyenv/pyenv/archive/refs/tags/v2.4.1.tar.gz-Opyenv.tar.gz yuminstallgcczlib-develbzip2bzip2-develreadline-develsqlitesqlite-developenssl-develtk-devellibffi-develxz-devel 解压缩:下载完成后,使用以下命令解压......
  • 赛博斗地主——使用大语言模型扮演Agent智能体玩牌类游戏。
    通过大模型来实现多个智能体进行游戏对局这个想对已经比较成熟了无论是去年惊艳的斯坦福小镇还是比如metaGPT或者类似的框架都是使用智能体技术让大模型来操控,从而让大模型跳出自身“预测下一个token”的文字功能去探索更多的应用落地可能性。不过一直没有真正操作过,直到前段时间......
  • 2024流行的前端框架
     随着技术的进步,一些前端框架的设计是为了让开发人员获得最高的效率。所有框架都有其独特的功能,使得开发人员很难选择一个。由于每个企业都有不同的需求和目标,因此其网站和应用程序的开发也应根据其需求和梦想进行管理。市场上最好的前端框架一直存在争议。然而,最近的......
  • python用于类型注解的库- typing
    一、简介动态语言的灵活性使其在做一些工具,脚本时非常方便,但是同时也给大型项目的开发带来了一些麻烦。自python3.5开始,PEP484为python引入了类型注解(typehints),虽然在pep3107定义了函数注释(functionannotation)的语法,但仍然故意留下了一些未定义的行为.现在已经拥有许......
  • 七种方法让 Python 代码更容易维护
    随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准)。然而,在代码库中保持一致的代码风格和测试标准能够显著减轻维护的压力,也能确保新的开发者能够快速了解项目的情况,同时能更好地全程保持应用程序的质量。使用外部库来检查代码的......
  • python内置函数——sorted
    对List、Dict进行排序,Python提供了两个方法对给定的ListL进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变--------------------------------sorted----------------------------------......
  • network xxx was found but has incorrect label com.docker.compose.network set to
    在执行docker-composedown之后,再执行docker-composeup-d提示已有同名称标签的虚拟网卡  解决1、执行dockernetworkls命令展示所有的虚拟network2、执行dockernetworkrm<networkId>删除已存在的network3、再重新运行docker-composeup-d启动容器  扩......
  • Python中os.walk()模块
    语法walk()方法语法格式如下:os.walk(top[,topdown=True[,onerror=None[,followlinks=False]]])参数top--是你所要遍历的目录的地址,返回的是一个三元组(root,dirs,files)。root所指的是当前正在遍历的这个文件夹的本身的地址dirs是一个list,内容是该文件夹中所有......
  • 方案设计|汽车轮胎数显胎压计方案
    一、引言数显轮胎胎压计是一个专门测量车辆轮胎气压的工具,它具有高精度测量的功能,能够帮助快速准确获取轮胎气压正确数值,保证轮胎使用安全。本文将对数显轮胎胎压计的方案技术进行分析,包括其基本原理、硬件构成、软件设计等方面。二、轮胎胎压计的基本原理轮胎......
  • WPF界面反编译神器Snoop使用介绍
    Snoop介绍Snoop是一款开源的WPF监视工具,它能够监视或浏览任何正在运行的WPF应用程序的可视化、逻辑和自动化树(无需调试器),还可以更改属性值、查看触发器、在属性更改时设置断点等。项目地址:https://github.com/snoopwpf/snoopwpf 运行可以到githubrelease下载已经编译......