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

xujianxiang 2013-04-26 05:40:52
我有一个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();


太恶搞了。
...全文
1647 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Toyal888 2014-07-21
  • 打赏
  • 举报
回复
楼主,请问最后怎么解决了?我现在也碰到上电复位不成功,再软复位一次就成功的现象,急切需要楼主的帮忙。楼主能留个QQ吗?或者直接加我QQ:417840217。谢谢。
a6713827 2014-07-18
  • 打赏
  • 举报
回复
问题已解决..
fish_fendou 2013-08-09
  • 打赏
  • 举报
回复
你好,我最近在捣鼓STM32, GPIOD>CRL&=0XFFFFF0FF; GPIOD->CRL|=0X00000300;比如说这两句是对PD2的一些设置,但是如果我要设置PD3呢?应该怎样写啊?也就是说我没有理解这两个0XFFFFF0FF,0X00000300的意思。希望你能帮助我解决这个困惑谢谢!!!期待你的回复。
xujianxiang 2013-04-27
  • 打赏
  • 举报
回复
就是程序要跑两遍才有用。延时也没有用啊。好惨啊。
xujianxiang 2013-04-26
  • 打赏
  • 举报
回复
问题是跑到GPIO_Configuration再reset才有用。之前复位没有用。真是太奇怪了。GPIO_Configuration是对网口脚作配置但是做两遍也没有用啊,要么加点延时试一下。
lbing7 2013-04-26
  • 打赏
  • 举报
回复
从STM32的复位结构看,不管是看门狗复位,还是上电复位以及软件复位什么的,都是一样的 LZ这情况,看一下复位电路的焊接,如果有以太网芯片的话,好好也查一下它的复位的情况

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧