单片机
返回首页

STM32经验总结(2)

2016-10-13 来源:eefocus

1、时钟系统
STM32本身非常复杂,外设非常的多,但是,并不是所有的外设都需要系统时钟这么高的频率,比如看门狗以及RTC时钟只需要几十K的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也越弱,所以对于较复杂的MCU一般都是采用多时钟源的方法来解决这些问题。
2、MDK固件库快速组织代码技巧
现在以简单的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。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 光控音效发生器电路

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 基于IC555的可变PWM振荡器电路

  • 如何使用LED驱动器LM3915制作振动计

  • 使用NE555和磁簧开关的橱柜照明电路

    相关电子头条文章