输入捕获进入仿真停止在Default_Handler,特来请教!

2019-10-14 23:55发布

问题1:在做原子战舰V3的TIM5输入捕获实验,使用原子例程运行正常,就是板子接上串口,打开串口调试助手总会
进入booloader,需要关闭了串口工具,复位才能运行!
问题2:然而,学会了原子的思想,我就想自己来试验一下自己的写出代码,系统却无限进入Default_Handler,实在无语!
            已经辛苦跟原子的代码用beyond compare对比过,初始化,中断服务程序均无不同!下面贴出代码:

[mw_shl_code=c,true]static void tim5_cap_config( uint16_t hwARR, uint16_t hwPSC) { RCC->APB1ENR|=1<<3; //TIM5 时钟使能 RCC->APB2ENR|=1<<2; //使能PORTA时钟 GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置 GPIOA->CRL|=0X00000008; //PA0 输入 GPIOA->BRR|=1<<0; //PA0 下拉 TIM5->ARR=hwARR; //设定计数器自动重装值 TIM5->SC=hwPSC; //预分频器 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 上升沿捕获 TIM5->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中 TIM5->DIER|=1<<1; //允许捕获中断 TIM5->DIER|=1<<0; //允许更新中断 TIM5->CR1|=0x01; //使能定时器2 }[/mw_shl_code] 一下是中断服务程序:
[mw_shl_code=c,true]//定时器5中断服务程序 void TIM5_ISRHandler(void) { u16 tsr; tsr=TIM5->SR; if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 { if(tsr&0X01)//溢出 { if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 { if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 { TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++; } } if(tsr&0x02)//捕获1发生捕获事件 { if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 TIM5CH1_CAPTURE_VAL=TIM5->CCR1; //获取当前的捕获值. TIM5->CCER&=~(1<<1); //CC1P=0 设置为上升沿捕获 }else //还未开始,第一次捕获上升沿 { TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM5->CNT=0; //计数器清空 TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获 } } } TIM5->SR=0;//清除中断标志位 }[/mw_shl_code] 已经检查过20遍以上,除了纠正了原子教程中的TIM5->CCMR1 |= 0《《10 《==》 TIM5->CCMR1 |= 0《《2;之外,无他异样,
程序中,有tim6(用作定时),tim3,使用通道PA7作PWM输出,tim5用作捕获。

个人是认为这种错误应该是指针指错地方而导致的,但是我这两个代码横竖看不出来问题!
故此,在此问下原子和各位伙伴!我该如何排查!下面传上我的代码工程:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
our单片机
2019-10-15 12:16
回复【6楼】正点原子:
---------------------------------
仿真的汇编里面是:default_handler,谢谢原子,我已经找到答案了,是低级问题,然后还有printf有问题
重定向的那个,函数前,没有类型,需要加个void
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’ d in stdio.h. */
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}

一周热门 更多>