原子哥,各位大神们,请问一下我的TIM4_CH3的输入捕获实验为什么不能正常捕获?
下面是主要的程序,用TIM3_CH2输出PWM,TIM4_CH3捕获输入(MINI开发板 STM32F103RBT6)。
//输入捕获初始化程序
void TIM4_CH3_CC_Init(u16 arr,u16 psc) //PB8
{
RCC->APB1ENR|=1<<2; //使能TIM4时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRH&=0XFFFFFFF0; //清空
GPIOB->CRH&=0XFFFFFFF4; /*浮空输入模式 */
TIM4->ARR=arr;
TIM4->  SC=psc;
TIM4->CCMR2|=0X00000001; //IC1F[7:4]=0000无滤波; IC1PSC[3:2]=00 无分频; CC1S[1:0]=01 IC1映射在TI1上
TIM4->CCER|=0x0100; //CC3P[9]=0 上升沿捕获; CC3E[8]=1 捕获使能;
TIM4->DIER|=0X0009; //CC3IE[3]=1 允许捕获/比较3中断;UIE[0]=1 允许更新中断;
MY_NVIC_Init(1,2,TIM4_IRQChannel,2); //抢占1,子优先级2,编号,组2
TIM4->CR1|=0X01; //CEN[0]=1 使能计数器
}
u8 TIM4CH3_CC_STA=0;
//BIT7 捕获成功一次
//BIT6 捕获到高电平标志
//BIT[5~0] 捕获高电平后的溢出次数
u16 TIM4CH3_CC_VAL;
//输入捕获中断服务程序
void TIM4_IRQHandler(void)
{
u16 T4SR;
T4SR=TIM4->SR; //TIM4的状态寄存器值 UIE[0]更新中断标志位
if((TIM4CH3_CC_STA&0x80)==0) //还没捕获成功
{
if(T4SR&0X01) //如果产生溢出
{
if(TIM4CH3_CC_STA&0x40) //如果已经捕获到高电平
{
if(TIM4CH3_CC_STA&0x3ff==0x3ff) //如果高电平太长
{
TIM4CH3_CC_STA|=0x80; //标记成功捕获一次
TIM4CH3_CC_VAL=0XFFFF;
}
else TIM4CH3_CC_STA++;
}
}
if(T4SR&0X08) //如果捕获3发生捕获事件
{
if(TIM4CH3_CC_STA&0x40) //如果一ing捕获到了高电平,则此次捕获到一个下降沿
{
TIM4CH3_CC_STA|=0x80; //标记捕获成功一次
TIM4CH3_CC_VAL=TIM4->CCR1; //获取当前捕获值
TIM4->CCER&=~(1<<9); //CC3P[9]=0 设置上升沿捕获;
}
else
{
TIM4CH3_CC_STA|=0x40; //捕获到上升沿,标记高电平
TIM4->CNT=0; //计数器清空
TIM4->CCER|=1<<9; //设置下降沿捕获
}
}
}
TIM4->SR=0; //清空中断标志位
}
主函数中
int main(void)
{
u32 temp=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
TIM3_CH2_PWM_Init(200,7200); //PA7 OK 占空比1.5ms周期20ms,72M/7200=10kHz
TIM4_CH3_CC_Init(0XFFFF,7200); /*为什么TIM4不能正常捕获?串口收不到数据*/
while(1)
{
delay_ms(10);
TIM3_CH2_PWM_VAL++;
if(TIM3_CH2_PWM_VAL==300)TIM3_CH2_PWM_VAL=0;
if(TIM4CH3_CC_STA&0X80) //如果捕获成功到了一次
{
temp=TIM4CH3_CC_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM4CH3_CC_VAL; //得到总的高电平时间
printf("HIGH:%d us\r\n",temp); //打印总的高点平时间
TIM4CH3_CC_STA=0; //开启下一次捕获
}
}
}
|