你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 823|回复: 4

[其他] 读书感悟--STM32库开发实战指南——基于STM32F4(有空更新)

[复制链接]

9

主题

299

回帖

50

蝴蝶豆

金牌会员

最后登录
2019-12-16
发表于 2018-11-28 20:09:59 | 显示全部楼层 |阅读模式
上周日的某一天,突然收到了一份快递,开始还以为是双十一的快递,后来看到快递包装如下:
2.jpg
看着上面的署名为——刘野火,感觉十分震惊,火哥居然直接给我送书了?后来才知道,是ST论坛给我送书了,感谢论坛的工作人员了(我还打了电话过去骚扰,深感抱歉T.T)
近期正好在用STM32F429做一些项目,而此时到来的这本书可谓是“雪中送碳”,来得太是时候了。下面发一张手里用了快2年的STM32F429的秉火开发板和刚刚到的书的合照,在这一刻,可以说“硬软合璧”了吧。
3.JPG
因为之前已经看过了一些基础的视频,所以会跳过一些基本的定义章节,预计最近会着重看关于存储区的这一块地方,直到本次项目的完成,先开了这个帖子,后续会陆续更新。所以买了这本书的新手朋友,请千万不要学我,要按照下图中的“学习方法”:一定要按部就班的一步一步学习。
4.JPG
希望看到此帖的各位论坛朋友能够在F429上技术进步、项目早成。

评分

参与人数 1ST金币 +20 收起 理由
STMCU + 20

查看全部评分

回复

使用道具 举报

7

主题

205

回帖

16

蝴蝶豆

高级会员

最后登录
2019-9-21
发表于 2018-11-29 08:52:14 | 显示全部楼层
加油
回复 支持 反对

使用道具 举报

1347

主题

1124

回帖

0

蝴蝶豆

管理员

最后登录
2020-12-9
发表于 2018-11-29 09:08:17 | 显示全部楼层
谢谢分享~好好学习呀
回复 支持 反对

使用道具 举报

31

主题

390

回帖

34

蝴蝶豆

金牌会员

最后登录
2020-12-9
发表于 2018-12-10 08:52:27 | 显示全部楼层
支持一下!!
回复 支持 反对

使用道具 举报

9

主题

299

回帖

50

蝴蝶豆

金牌会员

最后登录
2019-12-16
 楼主| 发表于 2019-1-22 17:18:21 | 显示全部楼层
更新一下,最近自己根据书和秉火的原理图做了一块STM32F429IGT6的最小子系统,基本上把所有引脚都引出来了,方便后续接其他外设,硬件已经正常工作,证明没有问题。发图供各位参考,原理图如下:
A.PNG B.PNG

各位可能比较奇怪了,为啥不画晶振呢?因为,STM32F429IGT6外接晶振可以是8M,也可以是25M,不画出来是为了不误导各位形成定式。根据最后的实际运行效果,比较推荐25M的外部晶振(二脚或者四脚无源都可以,没有试过有源的,不太清楚是否会造成什么后果)。
如果用了8M的外部晶振的,在stm32f4xx.h中,是需要更改HSE的值,即
#define HSE_VALUE ((uint32_t)25000000) ——〉#define HSE_VALUE ((uint32_t)8000000)
以及对应的PLL分频,备频值。
我在此给出一个火哥例程里的通用的调整时钟函数
  1. void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q)       
  2. {
  3. <p style="line-height: 30px; text-indent: 2em;">__IO uint32_t HSEStartUpStatus = 0;</p>
  4. <p style="line-height: 30px; text-indent: 2em;">  RCC_HSEConfig(RCC_HSE_ON);</p>
  5. <p style="line-height: 30px; text-indent: 2em;">        HSEStartUpStatus = RCC_WaitForHSEStartUp();</p>
  6. <p style="line-height: 30px; text-indent: 2em;">  if (HSEStartUpStatus == SUCCESS)
  7. <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;">
  8. </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;">
  9. </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;">
  10. </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>
  11. <p style="text-align: left; line-height: 30px; text-indent: 2em;">                RCC_PLLConfig(RCC_PLLSource_HSE, m, n, p, q);</p>
  12. <p style="text-align: left; line-height: 30px; text-indent: 2em;">                RCC_PLLCmd(ENABLE);</p>
  13. <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>
  14. <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>
  15. <p style="text-align: left; line-height: 30px; text-indent: 2em;">    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);</p>
  16. <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>
  17. <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>}
复制代码
  1. #ifndef __CLKCONFIG_H
  2. #define        __CLKCONFIG_H

  3. #include "stm32f4xx.h"
  4. void HSE_SetSysClock(uint32_t m, uint32_t n, uint32_t p, uint32_t q);

  5. #endif /* __CLKCONFIG_H */
复制代码
在main.c之前初始化时,进行一下设置时钟:
如果是8MHz,设置为
  1. HSE_SetSysClock(8,360,2,8);
复制代码
如果是25MHz,设置为
  1. HSE_SetSysClock(25, 360, 2, 7);
复制代码
注意:根据实测,如果实际晶振和软件设置晶振不一致,芯片是不会工作的!所以各位发现STM32不工作的,请注意一下设置时钟。
另外,STM32不运行(抛开编程方面的问题),硬件上一般是以下几点的Bug:


1、复位电路设计直接拉地,无限复位。
2、VBAT不用,也没有直接接3.3V。
3、VCAP系列的引脚对应的电容不对。
4、晶振电路不工作(容阻不匹配),或者晶振频率和工程内含的不一致。
5、VDD和VSS系列的引脚,少接、漏接一个,都有可能不运行。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版