c语言tim1->smcr是什么意思,定时器外部脉冲计数问题,求助。。。

该博客介绍了如何在STM32微控制器上利用TIM1定时器生成周期性脉冲,并通过PC.2端口输出。同时,PA.8端口连接的LED灯用于验证脉冲正常。此外,通过杜邦线将PC.2的脉冲输入到TIM3的CH1通道,配置TIM3为外部脉冲计数模式,以控制PD.2上的LED灯亮度。然而,作者遇到的问题是TIM3的计数器未正常工作,没有进行计数。
摘要由CSDN通过智能技术生成

[图]方案:用TIM1定时器产生周期性的脉冲,在PC.2端口输出周期性的脉冲,PA.8接LED灯,也是输出与PC.2相同的周期的脉冲,用于查看脉冲产生是否正常,再用杜邦线将PC.2脚和TIM3_CH1脚(P... 显示全部

方案:用TIM1定时器产生周期性的脉冲,在PC.2端口输出周期性的脉冲,PA.8接LED灯,也是输出与PC.2相同的周期的脉冲,用于查看脉冲产生是否正常,再用杜邦线将PC.2脚和TIM3_CH1脚(PA.6),即将PC.2上的脉冲输入到TIM3_CH1通道上,TIM3设置成外部脉冲计数,最终控制PD.2上接的LED灯。

问题:能产生脉冲,但TIM3这部分的计数器好像没反应,没计数

主函数main()

#include "sys.h"

#include "led.h"

#include "tim1ti.h"

#include "delay.h"

#include "tim2.h"

int main(void)

{

u16 t,j=0;

Stm32_Clock_Init(72);

delay_init(72);

led_init();

tim1ti_init(4999,7999);

tim2_init(1000,1);

while(1)

{

t=TIM2->CNT;

if(t>5)

{

j++;

if(j>10)

{

PDout(2)=!PDout(2);     //led灯

delay_ms(500);

}

}

}

}

子程序LED.C

#include "led.h"

void led_init(void)

{

RCC->APB2ENR|=1<<5;    //设置PD时钟

RCC->APB2ENR|=1<<4;     //设置PC时钟

RCC->APB2ENR|=1<<2;      //设置PA时钟

GPIOC->CRL|=1<<8;              //配置PC.2为推挽输出,10M模式

GPIOC->ODR|=1<<2;               //初始化PC.2输出为高电平

GPIOD->CRL|=1<<8;              //配置PD.2为推挽输出,10M模式

GPIOD->ODR|=1<<2;               //初始化PD.2输出为高电平

GPIOA->CRH|=1;   //设置端口PA.8为推挽输出,10M模式

GPIOA->ODR|=1<<8;                //初始化PA.8输出为高电平

}

上面的子程序函数LED的led.h文件

#ifndef __LED_H

#define __LED_H

#include "sys.h"

void led_init(void);

#endif

TIM1产生定时中断的子程序函数

#include "tim1ti.h"

#include "led.h"

#include "delay.h"

void tim1ti_init(u16 arr,u16 psc)

{

RCC->APB2ENR|=1<<11;           //设置TIM1定时器时钟开启

TIM1->SMCR&=0XFFF0;    //选择定时器TIM1时钟源为内部时钟,即SMS[2:0]为000B

TIM1->ARR=arr;                //设置自动重装载寄存器,16为寄存器

TIM1-&gt

si7uy62ww5k5akl4ssgzqssnie0jvpn0.jpgSC=psc;                 //设置TIM1 预分频器,16为寄存器

TIM1->RCR=0;     //设置重复计数器的值为0,即REP[7:0]为0

TIM1->CR1&=0xffef;   //设置DIR为0,即计数器向上计数

TIM1->CR1|=1<<2;      //选择更新请求源,设置URS

TIM1->DIER|=1;    //UIE=1;允许更新中断

TIM1->CR1|=1;        // 使能计数器,CEN=1

MY_NVIC_Init(1,3 ,TIM1_UP_IRQChannel,1);

}

TIM1定时器的中断函数

void TIM1_UP_IRQHandler(void)

{

PCout(2)=!PCout(2);           //输出脉冲

PAout(8)=!PAout(8);          //此脚接LED灯,用于查看产生的脉冲是否正常

delay_ms(100);

TIM1->SR|=1;       //清除更新中断标志

}

上面的TIM1子程序函数的tim1ti.h文件

#ifndef __TIM1TI_H

#define __TIM1TI_H

#include "sys.h"

void tim1ti_init(u16 arr,u16 psc);

#endif

TIM3定时器,外部脉冲计数子程序函数

#include "tim2.h"

void tim2_init(u16 arr,u16 psc)

{

RCC->APB1ENR|=1<<1;       //设置TIM3时钟

RCC->APB2ENR|=1<<2;   //PA时钟开启

GPIOA->CRL|=4<<24;           //设置PA.6为浮空输入模式

TIM3->SMCR&=0XFF80;

TIM3->SMCR|=0X0057;   //设置TS[2:0]为101B,即:选择用于同步计数器的触发输入为滤波后的定时器输入1(TI1FP1).

//SMS[2:0]为111B,即:从模式选择,为外部时钟模式1,选择触发输入TRGI的上升沿驱动计数器

TIM3->CCMR1&=0XFFFC;

TIM3->CCMR1|=1;           //CC1S[1:0]=10,设置CC1通道配置为输入,IC1映射在TI1上 ,无滤波器

TIM3->CCER&=0XFFFD;   //设置CC1P=0,即不反相,上升沿有效

TIM3->ARR=arr;              //设置自动装载寄存器值

TIM3->RCR=0;                //重复寄存器值为0

TIM3-&gt

try6k37yn7m10yqnud3yjekl0dsmhxiz.jpgSC=psc;

TIM3->CR1&=0xFFEF;  //设置计数器方向为向上计数,即DIR=0

TIM3->CR1|=1;             //启动计数器,CEN=1

}

上面的TIM3定时器的子函数的tim2.h文件

#ifndef __TIM2_H

#define __TIM2_H

#include "sys.h"

void tim2_init(u16 arr,u16 psc);

#endif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值