本帖最后由 wmx0901 于 2009-11-18 20:59 编辑
MCU开发时肯定会涉及到外设初始化这个问题,对于初始化外设通常来说有两种做法:
1、在程序初始化时集中把所有程序中要用的外设依次全部初始化,这样,在写各个模块功能时就不再管初始化问题了,
2、在每个功能模块中单独写一个本功能模块要使用的外设的初始化函数,只初始化本功能要使用的外设。
在之前的学习开发中我一直都使用第二种方法,而且我也认为第二种方法更方便、更合理;但是当使用STM32的官方库进行开发时发现第二种方法有个严重的问题,就是必须在功能模块实现文件中进行类似以下变量的声明:
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
但是这样又会引起重复定义的问题。当然这可以通过以下方式解决:
static GPIO_InitTypeDef GPIO_InitStructure;
但我觉得这样做会造成内存资源的严重浪费;或者可以这样也可以解决:
extern GPIO_InitTypeDef GPIO_InitStructure;
但是我觉得这样程序会被搞得很混乱,甚至连变量在哪里定义的都搞不清楚。
之前用了一段时间集中初始化的方法(即上面说的第一种方法),但发现这样很不方便:比如
说在另一个程序中也用到同样的一个功能模块TmrDly,如果使用第二种方法的话,我只要把
TmrDly.c 和TmrDly.h拷过去就可以了;但如果使用集中初始化的话就还得另外拷贝Timer
的初始化代码,而且这个初始化代码还可能涉及到多个函数(时钟初始化、引脚初始化之类
的),所以感觉很不方便。
想起TI DSP的处理方法,参照后觉的以下方法也许可行:
driver.c
GPIO_InitTypeDef GPIO_InitStructure;
driver.h
extern GPIO_InitTypeDef GPIO_InitStructure;
module.c
#include"driver.h"
不知各位大虾可有其他的更好的解决方法。反正我是觉得集中初始化不太好用,打算废除之,大家觉得集中初始化有优点吗?——反正我现在没体会到。 |