方案:用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
下来学一学了。。。。。
一周热门 更多>