OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2111|回复: 5

求助F103程序烧进去单片机就挂掉的问题

[复制链接]

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
发表于 2020-1-15 10:09:38 | 显示全部楼层 |阅读模式
现在我手里有两个工程APP和IAP,相同的时钟配置下,APP程序烧写进去正常运行,IAP烧进去单片机就挂掉了,必须硬复位再烧正常程序J-LINK才能找到设备,为了方便查问题,我两个工程都改为MAIN函数直接配置时钟,然后WHILE(1)什么都不干,还是相同的现象。
有问题的IAP工程我是从F107改成F103的,107上正常运行过,改得细节应该都对,启动文件宏定义芯片型号FLASH大小都改了,还是有问题,自我感觉就剩下两个工程的官方库函数我用的版本可能不一样,IAP是我从网上下载的工程然后自己改的,大佬们知道其他可能的原因么。另外我单片机用的25MHz外部晶振然后PLL5倍频125Mhz,虽然103不推荐使用这么高的主频,但是相同配置下我在APP工程上正常跑没问题。
  1. void RCC_Configuration(void)
  2. {
  3. ErrorStatus HSEStartUpStatus;
  4. RCC_ClocksTypeDef RCC_ClockFreq;
  5. /* RCC system reset(for debug purpose) */
  6. RCC_DeInit();
  7. /* Enable HSE */
  8. RCC_HSEConfig(RCC_HSE_ON);
  9. /* Wait till HSE is ready */
  10. HSEStartUpStatus = RCC_WaitForHSEStartUp();

  11. if(HSEStartUpStatus != ERROR)
  12. {
  13. /* Enable Prefetch Buffer */
  14. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  15. /****************************************************************/
  16. /* HSE=25MHz, HCLK=72MHz, PCLK2=72MHz, PCLK1=36MHz */
  17. /****************************************************************/
  18. /* Flash 2 wait state */
  19. FLASH_SetLatency(FLASH_Latency_2);
  20. /* HCLK = SYSCLK */
  21. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  22. /* PCLK2 = HCLK */
  23. RCC_PCLK2Config(RCC_HCLK_Div1);
  24. /* PCLK1 = HCLK/2 */
  25. RCC_PCLK1Config(RCC_HCLK_Div2);
  26. /* ADCCLK = PCLK2/4 */
  27. RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  28. /* Configure PLLs *********************************************************/
  29. /* PPL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
  30. //RCC_PREDIV2Config(RCC_PREDIV2_Div5);
  31. //RCC_PLL2Config(RCC_PLL2Mul_8);
  32. /* Enable PLL2 */
  33. //RCC_PLL2Cmd(ENABLE);

  34. /* Wait till PLL2 is ready */
  35. //while(RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
  36. //{}

  37. /* PPL1 configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
  38. //RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
  39. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_5);//4
  40. /* Enable PLL */
  41. RCC_PLLCmd(ENABLE);

  42. /* Wait till PLL is ready */
  43. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  44. {}

  45. /* Select PLL as system clock source */
  46. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  47. /* Wait till PLL is used as system clock source */
  48. while(RCC_GetSYSCLKSource() != 0x08)
  49. {}
  50. }

  51. RCC_GetClocksFreq(&RCC_ClockFreq);

  52. /* Enable GPIOs clocks */
  53. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
  54. RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
  55. }
复制代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-1-15 14:59:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-1-15 16:29:43 | 显示全部楼层
为了避嫌,你应该把时钟频率降低看看能不能过。125MHz已经太高,实际上超过120MHz已经很危险了。要高建议选择其它型号,比如GD32F1,初始108MHz,过120MHz轻轻松松。
我觉得不见得所有内部外设都支持超的那么高,一个可以另一个不可以的原因可能就是你这两个程序配置的外设不一样,某些或者某个外设不支持这样超频结果连累系统一起死,如果不开启就没事。
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-1-15 16:34:42 | 显示全部楼层
如果这个猜想成立的话,应该:1,仔细对比两个工程的外设使用差别,包括不同的配置尤其是有关于时钟分频的配置,建立不能工作的工程与能工作工程的外设配置差异清单;
2,按照清单,逐个尝试去除里面外设的使能,或者把不一样的参数配置为相同。如果都不行,那就一起全部改掉,消除差异。这样做可以确定是否是一个或者多个外设导致的问题。
回复 支持 反对

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2019-5-29
在线时间
28 小时
 楼主| 发表于 2020-1-16 14:00:57 | 显示全部楼层
0x00000000 发表于 2020-1-15 16:34
如果这个猜想成立的话,应该:1,仔细对比两个工程的外设使用差别,包括不同的配置尤其是有关于时钟分频的 ...

谢谢大佬,但是我两个工程都已经改成了最简单的配置时钟,然后while1 ,没有进行任何外设配置,我找来找去,两个工程唯一不同的地方就是库函数版本不一样,但是我全换了也还是不行,我目前在能用的那个工程上建了一个副本然后重新移植了,可以用。玄学问题,,
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-1-16 17:42:22 | 显示全部楼层
a524660466 发表于 2020-1-16 14:00
谢谢大佬,但是我两个工程都已经改成了最简单的配置时钟,然后while1 ,没有进行任何外设配置,我找来找 ...

你要这么说的话也有可能。这几天我也碰到一个玄学问题:
一个简单的语句写寄存器咋写都不对,查看反汇编结果发现STR指令的写偏移地址比设定值多了两个字节,结果非对齐访问写到其它寄存器里去了。心里大惊,以为之前创建的宏定义有问题,那还得了,赶紧检查发现宏定义没问题,宏要求偏移基地址4个字节写入,编译的指令偏移却是6。
高潮在后面,这条语句之后还有一条语句一模一样,结果那条之后的语句编译的指令确实对的,偏移为4,把那条复制,粘贴到之前的这条语句,编译,一切正常。顿时心里一大群草泥马。然后我反复按撤销和重做,仔细对比复制之前和之后的语句,确信没有一点区别。更操蛋的是,这么做完了以后,把文件撤销到最初的会出错的状态,再编译,结果错误不再出现,地址偏移完全正确。
本来还想发个帖子装个逼的,结果这样死无对证,还有比这个更玄学的吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 18:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表