这是一个超声波测距的程序,一直收不到上升沿信号,(一直进不了触发中断),拜托大神帮我看看,十分感谢,PC1是触发信号 PA0是收信的
int main (void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart1_init(72,115200);
chaoshengbo_init(); //测距模块初始化
TIM5_Cap_Init(59999,71); //测量周期 60ms
while(1)
{
cejuxinhao(); //一个大于10us的开始信号
delay_ms(1000);
}
}
void chaoshengbo_init(void) //超声传感器的初始化程序,20us
{
//传感器管脚接线配置
//PC1管脚上拉20us,
RCC->APB2ENR|=1<<4; //IO口C时钟使能
GPIOC->CRL&=0XFFFFFF0F;//管脚8设置为输出
GPIOC->CRL|=0X000000B0;//GPIO_Mode_Out_PP 50MHz复用推挽输出
GPIOC->ODR|=1<<1; //PC1 上拉
delay_us(20);
GPIOC->ODR|=0<<1; //PC1 下拉
}
void cejuxinhao(void) //发送一个大于10us的开始信号
{
printf("触发/n");
GPIOC->ODR|=1<<1; //PC1 上拉
delay_us(20);
GPIOC->ODR|=0<<1; //PC1 上拉
}
void TIM5_Cap_Init(u16 arr,u16 psc) //定时器5通道1输入捕获配置
{
MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占2,子优先级0,组2
//PA0口位脉冲捕获口
RCC->APB1ENR|=1<<3; //TIM5 时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
GPIOA->CRL|=0X00000008; //PA0 输入
GPIOA->ODR|=0<<0; //PA0 下拉
TIM5->ARR=arr; //设定计数器自动重装值
TIM5->
SC=psc; //预分频器
TIM5->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1映射到TI1上
TIM5->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
TIM5->CCMR1|=0<<2; //IC2PS=00 配置输入分频,不分频
TIM5->CCER|=0<<1; //CC1P=0 上升沿捕获****************************************** 1
TIM5CH1_CAPTURE_STA=0x01; //设置标志
TIM5->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
TIM5->DIER|=1<<1; //允许捕获中断
//TIM5->DIER|=1<<0; //允许更新中断
TIM5->CR1|=0x0080; //设置第7位 使能缓冲器
TIM2->EGR|=1<<0; //定时器的计数器恢复初始化
TIM5->CR1|=0x01; //使能定时器5
}
void TIM5_IRQHandler(void) //定时器5中断服务程序
{
int tsr;
tsr=TIM5->SR;
printf("中断");
if(tsr&0x02) //出发捕获中断
{
switch (TIM5CH1_CAPTURE_STA)
{
case 0x01: //已捕获上升沿
{
TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
TIM5CH1_CAPTURE_STA=0x02;
//TIM2->EGR|=1<<0; //定时器的计数器恢复初始化
TIM5->CNT=0;
TIM5CH1_CAPTURE_VAL=0;
printf("上升沿");
}break;
case 0x02: //已捕获下降沿
{
TIM5CH1_CAPTURE_VAL=TIM5->CCR1; //获取当前的捕获值
while((USART1->SR&0X40)==0);
printf("%d",TIM5CH1_CAPTURE_VAL);
TIM5->CCER|=0<<1; //CC1P=0 设置为上升沿捕获
TIM5CH1_CAPTURE_STA=0x01;
printf("下降沿");
//TIM2->EGR|=1<<0; //定时器的计数器恢复初始化
}break;
}
}
TIM5->SR=0;//清除中断标志位
}
一周热门 更多>