相信,大部分查找GPIO的人,都是刚刚接触STM32的人,而刚接触STM32的人,大部分是从51上来的人,所以我会由浅入深,从51和STM32的区别入手,通过对比这两个处理器的配置方法,来跟大家慢慢讲解(学知识可不能急于求成)。博主以stm32f1为主控芯片,以下均简称为stm32。
首先,上一张我的理解图(画不好。。。但能看),给个形象的概念
stm32的时钟是由内部或外部振荡器产生的“频率”,而被人们形象的称为“系统时钟”。最大为72MHz换成周期T为:1/72MHz≈13.9ns
因为耗电量,stm32功能强大,能做很多事,但与之同时带来的消耗也越严重,当stm32不引入时钟时钟的话,就像51一样外设全开,如果大家是使用电池的话,就会感到电量的珍贵(开机几分钟就没电了。。。),所以厂家(st公司)为了解决这个问题,引入了“时钟概念”,即使用哪个外设就给哪个外设时钟(频率),不使用的就关掉(不震荡)。此做法大大降低了功耗,续航持久。
我来个比喻吧,stm32是一个工厂,内部CPU是老板,而外设就是帮助CPU干活的工人。老板(CPU)想做某件事,于是就命令(指令)有这个能力的工人(外设)去做这件事,并给予研究经费(时钟频率)。工人拿了经费,就按照老板的命令来执行工作。这就是CPU和外设的关系(不可逆关系。。。)
另外,片内外设也可以等同于一块内部芯片,它有内部寄存器,CPU给出指令,片内外设得到指令,并配置其内部寄存器,以达到功能的实现。
外设的功能都是完全不同的,但是初始化都是大同小异,学会了GPIO这最简单的外设初始化,那么后面就很好办了。点灯是所有学单片机的人都应该学会的第一项技能,这样子才算入门。51单片机的点灯是,通过控制寄存器将片外引脚(我们称之为IO口)拉低拉高,输出高低电平,以控制LED亮灭。
51过程是这样子:单片机给指令->控制寄存器->给IO口电平->控制LED亮灭
而stm32的点灯则是,通过使能外设GPIO时钟,发出指令给外设GPIO,外设GPIO收到指令后,着手配置自己的寄存器,然后给IO口模式,让其实现各种功能(我说过STM32功能强大吧?IO口的配置也是有很多知识的,之后会介绍)。
stm32过程是这样子(参照上图):CPU给指令->GPIO收到指令->配置内部寄存器->配置IO口模式(注意是模式)->控制LED亮灭。
贴上代码:
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //定义初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; //配置哪个IO口
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置IO口速度,仅输出有效
GPIO_Init(GPIOA,&GPIO_InitStruct); //初始化GPIOA的参数为以上结构体
}
int main(void)
{
led_init(void); //调用LED初始化函数
GPIO_ResetBits(GPIOA,GPIO_Pin_0) //拉低电平
GPIO_SetBits(GPIOA,GPIO_Pin_0) //拉高电平
while(1); //死循环(停止程序)
}
1、首先必须先使能时钟,时钟总线可参考:中文参考手册P28页,这一页是时钟总线上挂载的片内外设,我就不上图了。时钟使能函数在官方库函数的对应头文件里有,比如找RCC函数则应该在“stm32f10x_rcc.h”里(拉到最后面void开头的那些函数)
2、定义初始化结构体,结构体是外设的初始化参数。
3、初始化结构体中的参数,复制并粘贴结构体然后按“.”这个符号,会出来个框,框内就是外设的参数。
3、调用外设初始化函数,初始化函数也是在官方库函数的对应头文件里。比如找GPIO函数则应该在“stm32f10x_gpio.h”里。符号“&”是取地址符,意思是:初始化的参数地址为。。。(然后MDK就寻找结构体的位置,以找到结构体的参数)。
4、初始化完成后,在主函数中调用初始化函数,再调用官方库函数,即可进行相应的操作。(调用的官方库函数说明,请在“STM32固件库使用手册”中查看,博主不多作说明)
小知识:
首先呢,初始化函数,都可以在“STM32固件库使用手册”中查到使用说明(我就不提供连接了);其次,点击函数并右键,会出现“go to definition of'函数名'”(或者按F12),接着画面会跳转到官方库的 .c 文件,那里有很详细的说明(说明中标明有哪些函数需要配置),还有,可以自定义库函数,具体我后面(可能会写),网上有攻略写得比我好。
以上。
flag(今后会更新的,正文是大概框架): 1、GPIO寄存器简单介绍及配置