stm32如何执行软复位_stm32 上电复位 和软复位有什么区别。该如何解决

本文探讨了STM32上电复位与软复位的区别,并提供了一个LWIP程序案例。在特定条件下,程序需要通过软复位才能正确执行。代码中使用了FLASH编程来判断是否需要执行软复位,同时展示了如何配置系统时钟、GPIO、ADC等。读者还提出了关于GPIO寄存器设置的问题。
摘要由CSDN通过智能技术生成

stm32 上电复位 和软复位有什么区别。

我有一个lwip的程序,

1.上电跑不正确。

2.上电同时按下复位键,跑也不正确。

3.上电跑不正确。跑一会按下复位键。再跑一次正确。

4跑一会儿,软复位。再跑能正确。代码如下。

const u16*  pBuffer = (const u16*)0x0803fc00;

RCC_ClocksTypeDef RCC_Clocks;

/* Setup STM32 clock, PLL and Flash configuration) */

SystemInit();

/* Enable USART2 clock */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

/* Enable ETHERNET clock  */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |

RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

/* Enable GPIOs and ADC1 clocks */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO |

RCC_APB2Periph_ADC1, ENABLE);

ADC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

if( *pBuffer==0)//第一次起跑,复位。

{

FLASH_Unlock();

FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_ErasePage(0x0803fc00);

FLASH_ProgramHalfWord((0x0803fc00 ),1);

FLASH_Lock();

SCB->AIRCR =0X05FA0000|(u32)0x04;

}

else//第二次起跑,不复位。

{

FLASH_Unlock();

FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

FLASH_ErasePage(0x0803fc00);

FLASH_ProgramHalfWord((0x0803fc00 ),0);

FLASH_Lock();

}

这样程序能正确执行。

5.同一个程序程序跑两遍,不正确。

const u16*  pBuffer = (const u16*)0x0803fc00;

RCC_ClocksTypeDef RCC_Clocks;

/* Setup STM32 clock, PLL and Flash configuration) */

SystemInit();

/* Enable USART2 clock */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

/* Enable ETHERNET clock  */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |

RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

/* Enable GPIOs and ADC1 clocks */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO |

RCC_APB2Periph_ADC1, ENABLE);

ADC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

//跑两遍

const u16*  pBuffer = (const u16*)0x0803fc00;

RCC_ClocksTypeDef RCC_Clocks;

/* Setup STM32 clock, PLL and Flash configuration) */

SystemInit();

/* Enable USART2 clock */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

/* Enable ETHERNET clock  */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |

RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

/* Enable GPIOs and ADC1 clocks */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO |

RCC_APB2Periph_ADC1, ENABLE);

ADC_Configuration();

NVIC_Configuration();

GPIO_Configuration();

太恶搞了。

------解决方案--------------------

你好,我最近在捣鼓STM32, GPIOD>CRL&=0XFFFFF0FF; GPIOD->CRL

------解决方案--------------------

=0X00000300;比如说这两句是对PD2的一些设置,但是如果我要设置PD3呢?应该怎样写啊?也就是说我没有理解这两个0XFFFFF0FF,0X00000300的意思。希望你能帮助我解决这个困惑谢谢!!!期待你的回复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值