我使用的是STM32F051,使用J-flash烧录完固件文件后,按键复位(NRST脚)后程序总是卡在Delay(),调试发现原来是systick的中断没有。但是如果烧录完固件后重新上电的话程序就可以正常运行。请问是什么原因???
/*systick初始化*/
void Systick_Init(void)
{
if (SysTick_Config(SystemCoreClock / 1000))//1ºÁÃë
{
/* Capture error */
while(1)
{}
}
}
/*systick中断函数,其实就是调用TimingDelay_Decrement,对TimingDelay做减
发现使用按键复位后,这个中断服务函数一直没有进入*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
/*延时函数*/
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0)
{};
}
int main(void)
{
……
Delay(300);
……
}
复位(reset)是向MCU的复位引脚输入一个高或低电平,然后触发MCU中断。这个中断的作用就是停止跳出当前运行的程序,然后强制将MCU内部所有寄存器复写为默认状态。
复位中断都是硬件中断,而且优先级是最高的。
重新上电复位是通过内置的独立电压比较器监测VDD的电压,在电压达到阈值后会在一段时间内强制把MCU设置在复位状态,过了才会释放。
有个选项, 你在JLINK烧写时配置下, 烧写完自动重启, 就可以了。
给你说说复位相关:
1、复位是所有逻辑芯片基本上都需要的一个功能。一般包括硬复位, 软复位。 硬复位是确保硬件的时序为ready 态, 软复位是确保里面的命令逻辑在INIT态。
2、复位电路有的CPU内置, 有的需要外接。 外接的情况下, 低成本的是 RC 复位电路, 不计成本的是专用的复位芯片, 可以将所有电路上需要统一时序的IC的复位都接在一起,
这样不会导致上电时序的滞后问题, 很多软件都会出现这种现象而出现BUG。
3、一般复位OK后,可以通过读寄存器来判断, 或者通过测量相关管脚的状态来获悉。
希望能够帮到你。
都是复位操作,本质上没有什么区别
第一,引脚电平复位MCU并不是会把所有的寄存器重置为初始状态,若是全部重置了一些复位前的重要信息是没办法保存的,比如说实时时钟模块中的寄存器,若复位就重置了岂不是每次都得调时间吗?
第二,有些上电状态绑定引脚的状态寄存器也是不会在nRST时重置的,这些状态只在上电时保存一次,例如网络phy芯片的MII或RMII方式的选择,或者有些MCU启动方式的配置脚等,例如系统更新完程序,希望重启,若变更了启动位置岂不是乱套了。
所以,nRST信号就是为了在保存一定信息状态的情况下使系统的大部分寄存器(包括PC指针)重置。
一样的,引起复位的原因不一样,结果是一样的
NRST引脚复位可清空所有寄存器,重新上电其实也是利用了NRST引脚复位,因为在设计PCB时会设计回复电路
都是为了实现复位功能,目的是一样的
结果是一样的,实现方式不同而已,断电操作不同而已。