方案:用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->
SC=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->
SC=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
void TIM5_Excnt_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<3; //TIM5 时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
TIM5->ARR=arr; //设定计数器自动重装值
TIM5->SC=psc; //预分频器
TIM5->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM5->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
TIM5->CCER|=0<<1; //CC1P=0 上升沿计数
TIM5->SMCR|=5<<4; //触发选择:滤波后的定时器输入1(TI1FP1)
TIM5->SMCR|=7<<0; //外部时钟模式1
TIM5->CR1|=1<<0; //启动计数器,CEN=1
}
int main(void)
{
u32 oldcnt=0;
Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72); //延时初始化
TIM5_Excnt_Init(0XFFFF,0); //外部计数,最大值0xffff
while(1)
{
delay_ms(10);
if(oldcnt!=TIM5->CNT)
{
oldcnt=TIM5->CNT;
printf("cnt:%d ",oldcnt);
}
}
}
以上代码,在战舰板实测OK.
----------------------------
楼主主函数没写对啊 用的是tim3 而你用的是T=TIM2->CNT
---------------------------------
是额。没注意呵呵,谢那,不过还是不行
---------------------------------
灰常感谢,太给力了。。。
一周热门 更多>