原创文章,欢迎转载,转载请注明出处

这个星期进度比较慢哈,只有周末和晚上下班回来才能做,事件不连续,琐碎的事情又比较多,挺烦的,有多琐碎呢?
           1.本人有点小强迫症哈,虽然RTT将文件夹已经分类的很好了,但是在一个项目跟目录下这样放着看起来还是很不舒服的哈,于是强迫症范了,要整理下它。按照以前做项目的习惯,将程序分为四个层次,硬件层,驱动层,系统层和应用层,我们就整理下,对三个文件夹,其中硬件层和驱动层放在BSP文件夹里面,BSP文件里面再分硬件和驱动的文件夹,同时添加一个库文件夹。系统层就是RTT了,里面有components,include,libcpu,src文件夹,这些都是RTT比较紧密相关的文件夹。最后是应用层, 文件名是applications,applications和库文件文件夹都是从官方下下来的RTT里面分出来的。外面还加一个Prj文件夹,用来放keil的工程项目文件,和一个cfg文件夹,这个文件夹专门放置一些配置代码。这样分都是看各人喜好了。如图:

清爽很多。。哈。。SI用来放source insight的项目文件。
        2.系统时钟的配置。
           刚拿到一个新单片机的时候,往往第一个需要会的就是I/O口控制了,也就是流水灯了。可是还有一个关键的需要最开始就弄名清楚的就是系统里面各种时钟的配置。51比较简单,不需要配置,晶振是多少就是多少,一条指令运行的事件是晶振的12分之一。AVR的时候就已经复杂一点了,I/O口需要配置下,时钟也需要配置, 可以选择外部的内部的,然后时钟速度级别等等。到了430的时候,时钟配置就更为复杂了,系统里面就不止一个时钟源了,有好几个,分别分频了可以。还是说407吧,这个时钟比430的还复杂,哈。。

这个图有够唬人的哈,从左边开始说,没用过STM32增强系列单片机的以太网模块哈,这里就不说了。整个系统时钟可以有四个来源,外部高频,外部低频,内部高频和内部低频。选择好时钟源后,然后用设置PLL进行倍频,送到SYSCLK处,这也是系统运行的速度,然后配置AHB桥上的APB1和APB2上外部设备的时钟,其中APB1上挂的是一些低速设备,APB2上挂的是高速设备,下一面一张图会更得更清楚一些:

说了这么多,代码到底怎么配置呢。哈。。代码设置在系统startup里面已经设置过了哈,在main之前就设置好了,在startup_stm32f40xx.s里面可以看到这样一段汇编:

                  LDR     R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
可以看到线调用了Systeminit函数,然后才进入我们通常的main函数的哈,为什么要先调用Systeminit函数呢,我也不是很清楚哈,不过好像CMSIS(ARM公司规定的什么标准)规范规定系统初始化函数名字必须为SystemInit.我们看看这个函数做了什么,首先对FPU做了下设定,然后就是开外部晶振端口,通过PLL_M、PLL_Q、PLL_N、PLL_P设置倍频等等。通过上面的图可以清楚看到分频和倍频的设置。至于怎么配置这里就先不说了,下面的库升级会说的比较清楚,就不重复说了。
3:标准库升级
   我们下的是RTT1.2.1稳定版本,没下2.0.0(Alpha)内测版本(α(Alpha)版:内测版,β(Beta)版:公测版γ(Gamma)版:相当成熟的测试版,),这可不开玩笑啊,飞机飞着飞着当机了,那炸鸡了损失可不小,而且2.0.0里面的库也是1.0.0的。 

说说我为什么要将标准库更新到1.3.0,据说IIC有bug,应该好多人都是用1.0.0的时候有bug,而且是30-September-2011的时候出的,已经比较久远了,中间还出现过1.0.1,1.0.2版本,说明小更新挺平凡的,应该还是有不少缺陷的,最新的1.3.0是08-November-2013的,离现在9个月,算比较新的哈。用新的稳定版可以避免一些无解的错误哈,尽量减少我们以后开发的麻烦。下面说说怎么升级。
 升级库的时候还是需要注意点的。

(1):首先是单片机的定义
   涉及到的文件是:stm32f4xx.h,1.0.0里面对407采用的是 STM32F40XX 的宏定义,如果没有在keil里面的预处理添加宏定义的地方添加 STM32F40XX 编译肯定通不过,如果定义了那就没问题了,因为在.h文件里面有

 #ifdef STM32F40XX
#define STM32F40_41xxx
#endif /* STM32F40XX */
一句话,就是为了和之前定义兼容的。1.3.0的正确定义407的方法是定义宏 STM32F40_41xxx,可以在keil预处理里面添加这个宏,也可以在stm32f4xx.h添加,我们选择在stm32f4xx.h里面添加
(2):外部晶振的频率的宏定义
   系统默认的定义外部晶振是25mhz,在stm32fxx.h里面有

 #if !defined  (HSE_VALUE)
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

我们的板子是8mhz,我们对这个宏定义进行覆盖,在stm32fxx_conf.h里面重新定义如下:

 //sky.zhou,定义外部晶振8mhz
#if defined (HSE_VALUE)
/* Redefine the HSE value; it's equal to 8 MHz on the STM32F4-DISCOVERY Kit */
#undef HSE_VALUE
#define HSE_VALUE ((uint32_t)8000000)
#endif /* HSE_VALUE */
虽然这个可以不定义,只要对系统时钟的PLL_M、PLL_Q、PLL_N、PLL_P设置正确就可以的到正确的时钟了,可是但调用RCC_GetClocksFreq()函数的时候,我们是得不到正确的时钟的,因为这个函数是根据PLL_M、PLL_Q、PLL_N、PLL_P和HSE_VALUE 数值进行计算然后返回给我们,所以定义正确的HSE_VALUE数值是很有必要的。
 
(3):根据外部晶振大小对RCC的调整
   这个涉及到system_stm32f4xx.c文件,里面根据25mhz的频率设置好了PLL,也就是PLL_M、PLL_Q、PLL_N、PLL_P,我们蒋PLL_M设置为8就可以了。为什么PLL_M要为25呢?为什么默认设置外部晶振为25mhz呢?哈,为了防止超频,如果外面默认设置8mhz,我们接个16mhz,那倍频率后不是要到168*2=336mhz了,估计会发热很严重烧掉吧,电脑超频两倍的都很少呢,出发发烧级的,用液氮冷却,否则也是瞬间烧。手册规定晶振是4~26mhz,算一下,如果按照默认配置,接最大晶振26mhz的话,频率可以PLL到174.7mhz,估计这个407应该是可以承受的花,ST肯定考虑到了这种情况,不过我没试哈,钱不能这样浪费。。哈。。
(4):中断入口文件
   涉及到的文件是stm32f4xx_it.c,因为用的是RT_Thread RTOS,所以里面需要注释掉几个中断入口,分别为 HardFault_Handler(void)、PendSV_Handler(void)、void SysTick_Handler(void)和void PPP_IRQHandler(void),因为他们在RTT的 context_*.S和boarc.c里面定义过了,这里不注释会出错,然后可以把RTT其他的中断函数放进来,不过我觉得自己的终端函数还是不要放这里好,免得升级库的时候麻烦,耦合越少越好,独立性越强越好。

四轴飞行器1.2.3 STM32F407时钟配置和升级标准库文件的更多相关文章

  1. Eclipse CDT 配置C /C ++ 标准库 (UBUNTU 12 )

    http://blog.csdn.net/wudiwo/article/details/7682320

  2. STM32F4系统时钟配置及描述

    STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置

  3. STM32F072从零配置工程-自定义时钟配置详解

    从自己的板子STM32F407入手,参考官方的SystemInit()函数: 核心在SetSysClock()这个函数,官方默认是采用HSE(设定为8MHz)作为PLL锁相环的输入输出168MHz的S ...

  4. 四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法

    四轴飞行器1.3 MPU6050(大端)和M4的FPU开启方法  原创文章,欢迎转载,转载请注明出处      最近时间花在最多的地方就是STM32的I2C上了.之前就知道STM32的I2C并不好用, ...

  5. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  6. STM32F0xx_RTC实时时钟配置详细过程

    Ⅰ.概述 今天总结RTC(Real Time Clock)实时时钟相关的知识,顺带将BKP简单总结一下. STM32的RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待 ...

  7. 四轴飞行器1.5 各种PID对比分析及选择

    原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...

  8. 四轴飞行器1.2.2 RT-Thread 串口

    四轴飞行器1.2.2 RT-Thread 串口        本来是打算说根据RT-Thread的设备管理提供的驱动接口些串口驱动的,但是仔细一看,我去,串口驱动写好了,只需要调用就可以了.下面我们说 ...

  9. 四轴飞行器1.1 Matlab 姿态显示

    四轴飞行器1.1 Matlab 姿态显示 开始做四轴了,一步一步来,东西实在很多,比较杂.先做matlab上位机,主要用来做数据分析,等板子到了可以写飞控的程序了,从底层一层一层开始写..希望能好好的 ...

随机推荐

  1. Phoegap(cordova)开发跨平台app之HelloWorld

    PhoneGap(cordova)的hellworld程序 1           安装JDK 配置环境变量: 2           安装android-sdk 配置环境变量: set Path=E ...

  2. TreeSet类的排序问题

     http://www.cnblogs.com/lixiaolun/archive/2012/12/25/2832775.html TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默 ...

  3. linux安装桌面软件

    CentOS 作为服务器的操作系统是很常见的,但是因为需要稳定而没有很时髦的更新,所以很少做为桌面环境.在服务器上通常不需要安装桌面环境,最小化地安装 CentOS(也就是 minimal CentO ...

  4. leetcode Search in Rotated Sorted Array python

      #Suppose a sorted array is rotated at some pivot unknown to you beforehand. #(i.e., 0 1 2 4 5 6 7  ...

  5. QF——关于iOS的强引用,弱引用及strong,retain,copy,weak,assignd的关系

    强引用和弱引用: 我们已经知道OC中的内存管理是通过“引用计数器”来实现的.一个对象的生命周期取决于它是否还被其他对象引用(是否retainCount=0).但在有些情况下,我们并不希望对象的销毁时间 ...

  6. [转]前端CSS规范整理

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core  通用 ...

  7. 常用js表单文本域验证

    1.验证是否为正确的邮箱地址 注意:本方法只能验证以@a.b结尾的邮箱地址,对于三级及三级以上的邮箱,比如@iie.ac.cn结尾的会出现错误 function isEmail(o){ var reg ...

  8. JQuery easyui (3) Resizable(调整大小)组件

    Resizable  动态调整元素大小  不依赖其他组件 Resizable的加载方法 <div class="easyui-resizable"></div&g ...

  9. IS--A与 Has-a 区别

  10. 限制转交订单-采购直接批准PO

    应用 Oracle   Purchasing 层 Level Function 函数名 Funcgtion Name CUXPOXPOEPO 表单名 Form Name POXPOEPO 说明 Des ...