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

查看: 755|回复: 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版