江科大STM32教程:点灯大师
声明:文章中出现的资料多数来自江科大视频资料,本文是我学习stm32的随手笔记
目录
一、准备
二、实现星星点灯
1、接线图
2、原理
3、步骤
(1)使用RCC开启GPIO时钟
(2)使用GPIO_Init函数初始化GPIO
(3)用输出或者输入函数控制GPIO口
三、点灯大师
一、准备
本次学习内容是经典的点灯入门到成为能实现流水灯的“点灯大师”
先新建一个工程
同时在工具选项中把Debug设置为stlink
有关工程创建过程可以移步到我上一篇笔记:https://blog.csdn.net/weixin_61968569/article/details/135986156?spm=1001.2014.3001.5501
二、实现星星点灯
1、接线图
所需配件:面包板,四根跳线,一个LED(长脚正极,短脚接负极),stlink
2、原理
要实现IO口的输出,一般有三个步骤:
(1)使用RCC开启GPIO时钟
(2)使用GPIO_Init函数初始化GPIO
(3)用输出或者输入函数控制GPIO口
3、步骤
(1)使用RCC开启GPIO时钟
图1 GPIO基本结构
由图1可知,若LED接A0口,需要用到APB2外设GPIOA,打开库函数后缀名为rcc.h
图2 rcc.h
不难找到 RCC_APB2PeriphClockCmd,该函数作用是开启时钟,将其复制粘贴到主函数中,右键定位,可查看所需参数
图3 rcc.c
结合图1可以得知,我们需要使用到APB2外设GPIOA,同时第二个参数起使能—ENABLE
(2)使用GPIO_Init函数初始化GPIO
时钟打开后,就要进行GPIO口的初始化,我们先使用GPIO_Init(); 查看所需要的参数
图4 GPIO_Init
由图4可知,我们需要传入一个GPIOx 和 GPIO_InitStruct的结构体,那么就简单了,右键GPIO_InitTypeDef定位
图5 InitTypeDef
如图5所示,结构体里有三个变量,则初始化如下:
图6 初始化变量
对于变量如何详细初始化,这里我介绍其中一个步骤,其余类似:
图7 Mode
初始化的时候一步一步来,先定位Mode,如图8所示
图8 定位
选中蓝色标注的GPIOMode_TypeDef,按住ctrl+f,如图9所示
图9 Mode_TypeDef
这里介绍一下mode各个定义:
AIN是模拟输入
IN_FLOATING是浮空输入
IPD 下拉输入
IPU 上拉输入
OUT_OD 开漏输出
OUT_PP 推挽输出
AF_OD 复用开漏
AF_PP 复用推挽
(3)用输出或者输入函数控制GPIO口
/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平
Delay_ms(500); //延时500ms
GPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平
Delay_ms(500); //延时500ms
/*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平
Delay_ms(500); //延时500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平
Delay_ms(500); //延时500ms
/*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平
Delay_ms(500); //延时500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平
Delay_ms(500); //延时500ms
注意要添加Delay.h
三、点灯大师
取反符号可以自己尝试一下加或者不加,有不同的效果,大致思路是一样的,就是Pin的引脚需要全部赋值,而不是单纯赋值0号引脚,接着就是GPIO函数的调用,需要自行体会
#include "stm32f10x.h"
#include <Delay.h>
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开时钟
GPIO_InitTypeDef GPIO_InitStruct;//初始化结构体
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All; //GPIO引脚,赋值全部引脚
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA,&GPIO_InitStruct);
while(1){
GPIO_Write(GPIOA,~0x0001);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0002);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0004);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0008);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0010);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0020);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0040);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0080);
Delay_ms(100);
}
}