在线时间82 小时
UID3495067
ST金币0
蝴蝶豆50
注册时间2018-7-17
金牌会员
- 最后登录
- 2019-12-16
|
楼主 |
发表于 2019-1-22 17:18:21
|
显示全部楼层
a4a.1 32b0c
更新一下,最近自己根据书和秉火的原理图做了一块STM32F429IGT6的最小子系统,基本上把所有引脚都引出来了,方便后续接其他外设,硬件已经正常工作,证明没有问题。发图供各位参考,原理图如下:
各位可能比较奇怪了,为啥不画晶振呢?因为,STM32F429IGT6外接晶振可以是8M,也可以是25M,不画出来是为了不误导各位形成定式。根据最后的实际运行效果,比较推荐25M的外部晶振(二脚或者四脚无源都可以,没有试过有源的,不太清楚是否会造成什么后果)。
如果用了8M的外部晶振的,在stm32f4xx.h中,是需要更改HSE的值,即
#define HSE_VALUE ((uint32_t)25000000) ——〉#define HSE_VALUE ((uint32_t)8000000)
以及对应的PLL分频,备频值。
我在此给出一个火哥例程里的通用的调整时钟函数
- void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)
- {
- <p style="line-height: 30px; text-indent: 2em;">__IO uint32_t HSEStartUpStatus = 0;</p>
- <p style="line-height: 30px; text-indent: 2em;"> RCC_HSEConfig(RCC_HSE_ON);</p>
- <p style="line-height: 30px; text-indent: 2em;"> HSEStartUpStatus = RCC_WaitForHSEStartUp();</p>
- <p style="line-height: 30px; text-indent: 2em;"> if (HSEStartUpStatus == SUCCESS)
- <div style="text-align: left;"><span style="text-indent: 2em;">{</span></div><div style="text-align: left;"><span style="text-indent: 2em;">RCC->APB1ENR |= RCC_APB1ENR_PWREN;</span></div><div style="text-align: left;"><span style="text-indent: 2em;">PWR->CR |= PWR_CR_VOS;</span></div> <div style="text-align: left;">
- </div><div style="text-align: left;"><span style="text-indent: 2em;">// HCLK = SYSCLK / 1</span></div><div style="text-align: left;"><span style="text-indent: 2em;">RCC_HCLKConfig(RCC_SYSCLK_Div1);</span></div> <div style="text-align: left;">
- </div><div style="text-align: left;"><span style="text-indent: 2em;">// PCLK2 = HCLK / 2</span></div><div style="text-align: left;"><span style="text-indent: 2em;">RCC_PCLK2Config(RCC_HCLK_Div2);</span></div> <div style="text-align: left;">
- </div><div style="text-align: left;"><span style="text-indent: 2em;">// PCLK1 = HCLK / 4</span></div><div style="text-align: left;"><span style="text-indent: 2em;">RCC_PCLK1Config(RCC_HCLK_Div4);</span></div></p>
- <p style="text-align: left; line-height: 30px; text-indent: 2em;"> RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);</p>
- <p style="text-align: left; line-height: 30px; text-indent: 2em;"> RCC_PLLCmd(ENABLE);</p>
- <p style="line-height: 30px; text-indent: 2em;"><div style="text-align: left;"><span style="text-indent: 2em;">while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)</span></div><div style="text-align: left;"><span style="text-indent: 2em;">{</span></div><div style="text-align: left;"><span style="text-indent: 2em;">}</span></div></p>
- <p style="line-height: 30px; text-indent: 2em;"><div style="text-align: left;"><span style="text-indent: 2em;">/*-----------------------------------------------------*/</span></div><div style="text-align: left;"><span style="text-indent: 2em;">PWR->CR |= PWR_CR_ODEN;</span></div><div style="text-align: left;"><span style="text-indent: 2em;">while((PWR->CSR & PWR_CSR_ODRDY) == 0)</span></div><div style="text-align: left;"><span style="text-indent: 2em;">{</span></div><div style="text-align: left;"><span style="text-indent: 2em;">}</span></div><div style="text-align: left;"><span style="text-indent: 2em;">PWR->CR |= PWR_CR_ODSWEN;</span></div><div style="text-align: left;"><span style="text-indent: 2em;">while((PWR->CSR & PWR_CSR_ODSWRDY) == 0)</span></div><div style="text-align: left;"><span style="text-indent: 2em;">{</span></div><div style="text-align: left;"><span style="text-indent: 2em;">} </span></div><div style="text-align: left;"><span style="text-indent: 2em;">FLASH->ACR = FLASH_ACR_PRFTEN </span></div><div style="text-align: left;"><span style="text-indent: 2em;"> | FLASH_ACR_ICEN </span></div><div style="text-align: left;"><span style="text-indent: 2em;"> | FLASH_ACR_DCEN </span></div><div style="text-align: left;"><span style="text-indent: 2em;"> | FLASH_ACR_LATENCY_5WS;</span></div><div style="text-align: left;"><span style="text-indent: 2em;">/*-----------------------------------------------------*/</span></div></p>
- <p style="text-align: left; line-height: 30px; text-indent: 2em;"> RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);</p>
- <p style="line-height: 30px; text-indent: 2em;"><div style="text-align: left;"><span style="text-indent: 2em;">while (RCC_GetSYSCLKSource() != 0x08)</span></div><div style="text-align: left;"><span style="text-indent: 2em;">{</span></div><div style="text-align: left;"><span style="text-indent: 2em;">}</span></div><div style="text-align: left;"><span style="text-indent: 2em;">}</span></div><div style="text-align: left;"><span style="text-indent: 2em;">else</span></div><div style="text-align: left;"><span style="text-indent: 2em;">{</span></div></p>
- <p style="line-height: 30px; text-indent: 2em;"><div style="text-align: left;"><span style="text-indent: 2em;"> while (1)</span></div><div style="text-align: left;"><span style="text-indent: 2em;"> {</span></div><div style="text-align: left;"><span style="text-indent: 2em;"> }</span></div><div style="text-align: left;"><span style="text-indent: 2em;">}</span></div></p>}
复制代码- #ifndef __CLKCONFIG_H
- #define __CLKCONFIG_H
- #include "stm32f4xx.h"
- void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q);
- #endif /* __CLKCONFIG_H */
复制代码 在main.c之前初始化时,进行一下设置时钟:
如果是8MHz,设置为
- HSE_SetSysClock(8,360,2,8);
复制代码 如果是25MHz,设置为- HSE_SetSysClock(25, 360, 2, 7);
复制代码 注意:根据实测,如果实际晶振和软件设置晶振不一致,芯片是不会工作的!所以各位发现STM32不工作的,请注意一下设置时钟。
另外,STM32不运行(抛开编程方面的问题),硬件上一般是以下几点的Bug:
1、复位电路设计直接拉地,无限复位。
2、VBAT不用,也没有直接接3.3V。
3、VCAP系列的引脚对应的电容不对。
4、晶振电路不工作(容阻不匹配),或者晶振频率和工程内含的不一致。
5、VDD和VSS系列的引脚,少接、漏接一个,都有可能不运行。
|
|