stm32初始化位置的尝试

www123   2009-11-18 20:57 楼主


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"


不知各位大虾可有其他的更好的解决方法。反正我是觉得集中初始化不太好用,打算废除之,大家觉得集中初始化有优点吗?——反正我现在没体会到。

回复评论 (4)

                                 可以在初始化函数中定义局部变量,初始化结束函数退出后,所有相关的存储空间会被自动释放。
点赞  2009-11-19 09:41


恩,这样也是一种方法。
但是比如说:有一个模块DlyTmr中有四个函数
void DlyTmrInit(void);
void TmrDelayUS(u16 cnt);
void TmrDelayMS(u16 cnt);
void TmrDelayS(u16 cnt);
他们都用到了变量TIM_TimeBaseStructure,那么就得在四个函数都进行如下定义:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

这样是不是太啰嗦啦!而且这还仅仅是四个,要是GPIO_InitStructure的话那就更是
到处都是定义了。
所以,我觉得这不是一个好的方法!
点赞  2009-11-19 11:17
                                 问题不在于是否啰嗦,在于你对模块化程序设计的理解。
点赞  2009-11-19 11:34
问题不在于是否啰嗦,在于你对模块化程序设计的理解。
那再问一下:你进行STM32设计时,对外设的时钟和引脚配置,使用集中初始化呢,还是在各个模块中单独初始化呢!
点赞  2009-11-19 12:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复