STM32
直播中

王凯

7年用户 1290经验值
私信 关注
[问答]

STM32F051使用J-flash烧录完固件文件后,按键复位(NRST脚)后程序总是卡在Delay()的原因?

我使用的是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);
    ……
}


回帖(2)

李瑜刈

2024-4-7 14:22:11
第一,引脚电平复位MCU并不是会把所有的寄存器重置为初始状态,若是全部重置了一些复位前的重要信息是没办法保存的,比如说实时时钟模块中的寄存器,若复位就重置了岂不是每次都得调时间吗?
第二,有些上电状态绑定引脚的状态寄存器也是不会在nRST时重置的,这些状态只在上电时保存一次,例如网络phy芯片的MII或RMII方式的选择,或者有些MCU启动方式的配置脚等,例如系统更新完程序,希望重启,若变更了启动位置岂不是乱套了。
所以,nRST信号就是为了在保存一定信息状态的情况下使系统的大部分寄存器(包括PC指针)重置。
举报

无人岛

2024-4-7 15:07:19
这种情况可能是由于按键复位(NRST脚)不会重置SysTick计数器导致的。在按键复位后,SysTick计数器仍然保持在上一次的值,导致中断服务函数不会被调用。

解决方法是在按键复位时显式地将SysTick计数器清零。可以在按键复位时添加以下代码:

```c
if (SYSRESETREQ & SCB->AIRCR)
{
    SysTick->VAL = 0;
}
```

这样在按键复位后,SysTick计数器会被重置为0,使得SysTick中断可以正常触发。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分