#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
TIM_ICInitTypeDef TIM8_ICInitStructure;
void TIM8_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructuer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); ///使能TIM8时钟
GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_IPD;//下拉输入
GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructuer);
GPIO_InitStructuer.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructuer.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructuer.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructuer);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA.8 输出DI
//timer1 NVIC 配置 uint16_t TIM_Prescaler;
TIM_DeInit(TIM8);
TIM_TimeBaseInitStructure.TIM_Period = arr;//自动重装载值 uint16_t TIM_CounterMode;
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式 uint16_t TIM_Period;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//溢出多少次后进入中断
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructure);//初始化TIM8
NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn; //uint16_t TIM_ClockDivision;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 uint8_t TIM_RepetitionCounter;
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//TIM_ETRClockMode1Config(TIM8, TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted, 5);//5次采样滤波 外部时钟模式2
//TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次
TIM_TIxExternalClockConfig( TIM8, TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising, 0xF );
TIM8->CCMR1|=1;//CC1S[1:0]:捕获/比较1 选择。(Capture/Compare 1 selection) 位1:0 这2位定义通道的方向(输入/输出),及输入脚的选择: 00:CC1通道被配置为输出; 01:CC1通道被配置为输入,IC1映射在TI1上;
TIM8->SMCR|=0x07;//寄存器的SMS='111',选择定时器外部时钟模式1
TIM8->SMCR|=0x50;//置TIMx_SMCR寄存器中TS=101,选择TI1作为输入源。
TIM8->CCER|=1<<4;//中文资料坑人系列 捕获使能。
TIM8->CCER&=~(1<<5);//第6位置一0:不反相:捕获发生在IC1的上升沿;当用作外部触发器时,IC1不反相。
//TIM8->CR1|=1;
//TIM_ETRClockMode1Config
TIM_SetCounter(TIM8,0);//设置计数初值
TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM8,ENABLE); //使能定时器1
}
u16 COUN1=0;
u16 COUN2=0;
u8 n,m=0,y=0;
int main(void)
{
delay_init(); //延时函数初始化
TIM8_Cap_Init(10-1,0); //10次一溢出 、外部计数(减一应该是重要的影响到数据准确度)
delay_ms(1000);//
while(1)
{
for(n=0;n<22;n++)//共有11次上升沿出现
{
delay_ms(1);
PAout(1)=~PAout(1);//端口翻转
}
while(1)//总数
{
COUN2=(COUN1*10)+(TIM8->CNT);
}
//COUN1=TIM8->CNT;
}
}
void TIM8_UP_IRQHandler(void)
{
if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)
{
COUN1++;
TIM_SetCounter(TIM8,0);//清除计数器
}
TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位
}
void TIM8_CC_IRQHandler(void)
{
if (TIM_GetITStatus(TIM8, TIM_IT_CC1) != RESET)//捕获1发生捕获事件捕获中断 是指定期捕获到你设定的边沿信号(上升沿/下降沿) 时产生的中断
{
COUN1=100;
COUN2=200;
while(1);
}
TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);
}