初级会员

- 积分
- 172
- 金钱
- 172
- 注册时间
- 2015-5-14
- 在线时间
- 36 小时
|
5金钱
u8 TIM3CH1_CAPTURE_STA = 0; // bit7 捕获完成标志 bit6 捕获到高电平标志 bit5~0 捕到高后定时器溢出次数
u16 TIM3CH1_CAPTURE_VAL; // 捕获下降沿的时候 TIM5_CNT值
void led_init()
{
GPIOA->CRH &= 0XFFFFFFF0;
GPIOA->CRH |= 0X00000003; // 复用推挽
GPIOA->ODR |= 1<<0;
}
void Timer2_init( u16 arr, u16 psc )
{ RCC->APB2ENR = 1<<0; //
RCC->APB2ENR |= 1<<2; //GPIOA
GPIOA->CRL &= 0XFFFFFFF0;
GPIOA->CRL |= 0X0000000B;
GPIOA->ODR |= 1<<0; // 上拉
RCC->APB1ENR |= 1<<0; //时钟2
TIM2->ARR = arr;
TIM2-> SC = psc;
TIM2->CCMR1 |= 0X74;
TIM2->CCER |= 1<<0;
TIM2->CCR1 = 1000;
TIM2->CR1 |= 1<<8; //ENABLE 预装载
TIM2->CR1 |= 1<<0;
}
void Timer3_init( u16 arr, u16 psc )
{
GPIOA->CRL &= 0XF0FFFFFF;
GPIOA->CRL |= 0X08000000;
GPIOA->ODR |= 0<<6; //PA6 下拉
RCC->APB1ENR |= 1<<1; //使能时钟3
TIM3->ARR = arr; //
TIM3-> SC = psc; // 计数 1us 周期
// TIM3->SMCR |= 0X00D4; //主、从 滤波后定时器输入
TIM3->CCMR1 |= 1<<0; // 映射 通道1输入
TIM3->CCMR1 |= 0<<2; // 无预分频
TIM3->CCMR1 |= 0<<4; //配置滤波器 无滤波Fdts采样
// TIM3->CCMR1 |= 1<<8; //通道2输入
// TIM3->CCMR1 |= 0<<10; // 无预分频
// TIM3->CCMR1 |= 0<<12; //配置滤波器
TIM3->CCER |= 1<<0; // 通道1 捕获使能
TIM3->CCER |= 0<<1; //上升沿有效
TIM3->DIER |= 1<<1; // 通道 1 捕获中断
TIM3->DIER |= 1<<0; // 更新中断
TIM3->CR1 |= 0X01; //使能定时器1
MY_NVIC_Init( 2, 0, TIM3_IRQChannel, 2 ); // 设置定时器中断
LED0 = 0; // 灯亮
}
void ITM3_IRQHandler( void )
{
u16 tsr;
tsr = TIM3->SR;
//读成功标志位 bit7置1 主函数处理
if(( TIM3CH1_CAPTURE_STA&0X80 ) == 0 ) // 还未成功捕获 只要bit7为1 就不会进行第二次捕获
{
if( tsr & 0x01 ) // 计数器溢出( 更新事件 ) 更新中断标志 UIF置1 硬件置1软件清零
{
if( TIM3CH1_CAPTURE_STA & 0X40 ) //已经捕获高电平
{
if( TIM3CH1_CAPTURE_STA & 0X3F) //溢出计数满 0x3F 高电平时间太长
{
TIM3CH1_CAPTURE_STA |= 0x80; //标记成功捕获一次
TIM3CH1_CAPTURE_VAL = 0XFFFF;
}
else
TIM3CH1_CAPTURE_STA++;
}
}
//读寄存器
if( tsr &0x02 ) // 通道1捕获中断位
{
if( TIM3CH1_CAPTURE_STA &0x40 ) // 高电平位 捕获到一个下降沿
{
TIM3CH1_CAPTURE_STA |= 0x80; // 标记成功捕获到一个高电平脉宽
TIM3CH1_CAPTURE_VAL |= TIM3->CCR1; // 获取当前捕获值
TIM3->CCER &= ~( 1<<1 ); //CC1P=0 上升沿有效 回到初始状态
}
else // 第一次捕获上升沿 清空 标记高电平 设置下降沿有效
{
TIM3CH1_CAPTURE_STA = 0; //清空
TIM3CH1_CAPTURE_VAL = 0;
TIM3CH1_CAPTURE_STA = 0x40; // 高电平标志 计数清零
TIM3->CNT = 0;
TIM3->CCER |= 1<<1; //CC1P=1 通道1 设置下降沿有效
}
}
}
TIM3->SR = 0; //清除中断标志位
LED0 = 1; // 灯灭
}
如果能进入中断我的灯会灭吧?但是一直亮着 |
|