高级会员

- 积分
- 579
- 金钱
- 579
- 注册时间
- 2019-8-4
- 在线时间
- 187 小时
|
4金钱
捕获程序如下#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM5_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_setBits(GPIOA,GPIO_Pin_0);//按键下拉输入
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_Period=arr;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter=0x00;
TIM_ICInit(TIM5,&TIM_ICInitStructure);
TIM_Cmd(TIM5,ENABLE);
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
}
u8 TIM5_STA=0;//第七位为1完成高电平捕获,即按键按下的时间,第六位为0,按键刚刚按下,低5为为定时器溢出的次数
u16 TIM5_VAL=0;//高电平计时
void TIM5_IRQHandler()
{
if((TIM5_STA&0x80)==0)//还未捕获高电平
{ printf("liuxiaoke");//此语句用来测试程序是否能产生定时器更新中断
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
if(TIM5_STA&0x40)//按键已经按下
{
if((TIM5_STA&0x3F)==0x3F)
{
TIM5_STA|=0x80;
TIM5_VAL=0XFFFF;
}else TIM5_STA++;
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)!=RESET)
{
printf("QQQ")//此语句用来测试程序是否能产生定时器捕获中断
if(TIM5_STA&0x40)
{
TIM5_STA|=0x80;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising);
TIM5_VAL=TIM_GetCapture1(TIM5);
}
else
{
TIM5_STA=0;
TIM5_VAL=0;
TIM5_STA|=0x40;
TIM_SetCounter(TIM5,0);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//按键刚刚按下,改为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update|TIM_IT_CC1);
}
主函数如下
extern u8 TIM5_STA; //输入捕获状态
extern u16 TIM5_VAL; //输入捕获值
int main(void)
{
u32 temp=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 ,arr=2^16=65536
while(1)
{
delay_ms(10);
if(TIM5_STA&0X80)//成功捕获到了一次上升沿
{
temp=TIM5_STA&0X3F;
temp*=65536;//溢出时间总和
temp=(temp+TIM5_VAL)/1000000;//得到总的高电平时间
printf("HIGH:%d s\r\n",temp);//打印总的高点平时间
TIM5_STA=0;//开启下一次捕获
}
}
}
没有任何实验现象,其他的程序比如串口发送都是例程给的,我就仿写了主程序和捕获程序,对照一样,就是不行,按键按下,发现程序无法进入捕获中断
|
|