前言
目前使基于STM32F407的总结
一. 新建工程的步骤:
1、新建6个文件夹,用于不同文件的管理。分别是USER, HARDWARE, FWLIB, SYSTEM, CORE, OBJ;
2、新建工程,工程目录也按上述文件夹归类
3、通过魔术棒按键,设置路径,使软件能自动查找头文件
4、通过魔术棒按键,设置全局宏定义,程序中头文件自动配置芯片型号相对应的宏定义
5、选择仿真器并设置编译后自动执行,设置编译后的输出地址(OBJ文件夹)
二、编程方法
2.1梳理模块
阅读参考手册对应内容,或者阅读《STM32F4开发指南-库函数版》,后者是已经整理好的内容。
梳理的具体过程
梳理程序流程的过程包含:
(1) 统计所有用到的模块,以及基本信息,包括:各模块分别挂载在什么下面,配置什么时钟,有什么样的电路结构;
a)外围挂载在哪?需要激活什么时钟信号?
要看存储器映射(stm32f4参考手册page52),也可以在stm32f4xx.h文件里面查找如下的宏定义:
#define RCC_AHB1Periph_GPIOA ((uint32_t)0x00000001)
#define RCC_AHB1Periph_GPIOB ((uint32_t)0x00000002)
上述代码说明GPIOA和GPIOB挂载在AHB上
b)搜索相应的使能时钟;
c)电路结构、相关寄存器的配置要看参考手册模块的说明。
(2) 梳理梳理模块的配置流程;
(3) 搜索对应的库函数。搜索库函数的方法如下:
a) 看文件头注释,熟悉不同库函数文件的作用,去对应文件内查找;
b) 先通过手册查询模块需要配置的寄存器;再通过keil中Edit–>Find功能,或者.chm的库函数说明文件,搜索寄存器名,一般属于一个结构体;最后搜索哪个函数调用了该结构体指针的成员(该成员用于配置相应寄存器),即找到对应函数。
2.2写模块程序
一般而言,模块配置的顺序为:
(1) 时钟的配置;
(2) GPIO的基础配置,以及复用;
(3) 屏蔽相应模块;
(4) 模块电路结构的配置;
(5) 模块工作模式的配置;
(6) 使能相应模块;
(7) 中断优先级;
(8) 中断函数;(这些是配置模块的顺序,并不是程序执行的顺序)
如何了解函数参数的取值范围?
从语法层面:
定义函数,函数的输入参数是结构体指针,以及宏定义的参数。
通过宏定义来声明函数的输入参数,实际上是寄存器的配置值;输入参数若是结构体指针,用于对实际寄存器赋值。
(1) 函数定义中assert_param部分,查看类似“IS_GPIO_ALL_PERIPH”的判断参数有效性的函数。能看到具体的参数范围。
(2) 查看参数类型的定义,注释部分会说明参数范围
关于确定模块配置时程序的执行顺序
一般来说,电子系统要先满足输入条件才能产生预期输出。如果模块初始化时间较短,电路配置结束前相当于瞬态,几乎不会受到启动流程和初始化的影响而产生错误输出。所以我们配置某个模块,必须保证中间过程短,规避出现不符合设计要求的情形。