STM32经验总结(2)
2016-10-13 来源:eefocus
1、时钟系统
STM32本身非常复杂,外设非常的多,但是,并不是所有的外设都需要系统时钟这么高的频率,比如看门狗以及RTC时钟只需要几十K的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也越弱,所以对于较复杂的MCU一般都是采用多时钟源的方法来解决这些问题。
进入单片机查看更多内容>>
STM32本身非常复杂,外设非常的多,但是,并不是所有的外设都需要系统时钟这么高的频率,比如看门狗以及RTC时钟只需要几十K的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也越弱,所以对于较复杂的MCU一般都是采用多时钟源的方法来解决这些问题。
2、MDK固件库快速组织代码技巧
现在以简单的GPIO初始化函数为例:
现在以简单的GPIO初始化函数为例:
现在我们要初始化某个GPIO端口,我们要怎么快速操作呢?在头文件stm32f10x_gpio.h头文件中,定义GPIO初始化函数为:
void GPIO_Init(GPIO_Type_Def* GPIOx , GPIO_InitTytpeDef* GPIO_InitStruct);
现在我们想写初始化函数,那么我们在不参考其他代码的情况下,怎么组织代码呢?
首先,我们可以看出,函数的入口参数是GPIO_Type_Def类型指针和GPIO_InitTytpeDef类型指针,因为GPIO_Type_Def入口参数比较简单,所以我么通过第二个入口参数GPIO_InitTytpeDef类型指针来讲解。双击GPIO_InitTytpeDef后右键选择“Go To Define ……”
于是定位到 stm32f10x_gpio.h中GPIO_InitTyoeDef的定义处:
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
可以看到这个结构体有3个成员变量,这也是告诉我们一个信息,一个GPIO口的状态是由这3个变量来决定的。我们首先要定义一个结构体变量,下面我们定义:
GPIO_InitTypeDef GPIO_InitStructure;
接着,我们要初始化结构体变量GPIO_InitStructure。首先我们要初始化成员变量GPIO_Pin,但是这个变量能设置哪些值呢?这些值的范围有什么规定么?
这里我们就要找到GPIO_Init()函数的实现处,同样,双击GPIO_Init(),右键点击“Go To Define ……”这样我们光标就定位到这个函数的开始处,我们可以看到如下函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
………………………………………………
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
………………………………………………
assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
………………………………………………
}
顾名思义,assert_param函数就是对入口参数的有效性进行判断,所以我们可以从这个函数入手,确定我们入口参数的范围。第一行是对第一个参数GPIOx进行有效性判断,双击IS_GPIO_ALL_PERIPH(GPIOx)右键点击“Go To Define ……”定位到了下面的定义:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
((PERIPH) == GPIOB) || \
((PERIPH) == GPIOC) || \
((PERIPH) == GPIOD) || \
((PERIPH) == GPIOE) || \
((PERIPH) == GPIOF) || \
((PERIPH) == GPIOG))
很明显可以看出,GPIOx的取值范围规定只允许是GPIOA~GPIOG。
同样的方法适用于GPIO_Speed和GPIO_Mode。
上一篇:STM32定时器中断实验
下一篇:STM32经验总结(1)
相关文章