读书感悟--STM32库开发实战指南——基于STM32F4(有空更新)
上周日的某一天,突然收到了一份快递,开始还以为是双十一的快递,后来看到快递包装如下:看着上面的署名为——刘野火,感觉十分震惊,火哥居然直接给我送书了?后来才知道,是ST论坛给我送书了,感谢论坛的工作人员了(我还打了电话过去骚扰,深感抱歉T.T)
近期正好在用STM32F429做一些项目,而此时到来的这本书可谓是“雪中送碳”,来得太是时候了。下面发一张手里用了快2年的STM32F429的秉火开发板和刚刚到的书的合照,在这一刻,可以说“硬软合璧”了吧。
因为之前已经看过了一些基础的视频,所以会跳过一些基本的定义章节,预计最近会着重看关于存储区的这一块地方,直到本次项目的完成,先开了这个帖子,后续会陆续更新。所以买了这本书的新手朋友,请千万不要学我,要按照下图中的“学习方法”:一定要按部就班的一步一步学习。
希望看到此帖的各位论坛朋友能够在F429上技术进步、项目早成。
加油 谢谢分享~好好学习呀 支持一下!! 更新一下,最近自己根据书和秉火的原理图做了一块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系列的引脚,少接、漏接一个,都有可能不运行。
页:
[1]