学习STM32 有一段时间了,发现在查找资料时候,基本上都是千篇一律, 所以把自己学习的过程分享出来,做个记录,话不多说,开始
对于我们想要点亮LED,首先主要就是控制IO口, 而IO口无非是输出高低电平("0" "1")两种状态,
电路图如下
如果我们要想点亮D0/D1, 首先必须使发光二极管能够正向导通, 形成回路,如下图
如果LED0的状态为0,那么电压将会从正极流向负极,从而使二极管D0正向导通, D0被点亮,
同理如果LED1状态为1, 那么二极管左右两端电压相等, 二极管D1不能导通,所以 D1被熄灭
所以我们通过在二极管的另外一端输出不同的电压,也就是说在单片机的IO口上输出不同的电压, 就可以实现二极管的点亮和熄灭了
那么如何才能实现 控制单片机IO口输出高低电平呢?
GPIO 配置
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA, ENABLE);
//使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOD.2
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
}
IO输出高电平
GPIO_SetBits(GPIOA,GPIO_Pin_8); //LED1对应引脚GPIOA.8拉高,灭 等同LED1=1;
GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED0对应引脚GPIOD.2拉高,灭 等同LED0=1;
IO输出低电平
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //LED0对应引脚GPIOD.2拉低,亮 等同LED0=0;
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //LED1对应引脚GPIOA.8拉低,亮 等同LED1=0;
当然IO口输出电平控制方式有很多种, 如上方法是最简单,也是最常用的,直接调用库函数来实现
以下是直接操作寄存器,方法也简单, 当我们对寄存器不是很了解的情况下就不是很好理解了
GPIOD->BRR=GPIO_Pin_2; //LED0亮
GPIOA->BRR=GPIO_Pin_8; //LED1亮
GPIOD->BSRR=GPIO_Pin_2; //LED0灭
GPIOA->BSRR=GPIO_Pin_8; //LED1灭
如上是关于两个寄存器介绍,
完整代码如下:
/*功能: LED0/LED1交替闪烁, 间隔时间是300ms*/
main.c
#include "sys.h"
#include "delay.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA, ENABLE);
//使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED1-->PD.2 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化GPIOD.2
GPIO_SetBits(GPIOD,GPIO_Pin_2); //PD.2 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
GPIO_SetBits(GPIOA,GPIO_Pin_8); //PA.8 输出高
}
int main(void)
{
delay_init(); //初始化延时函数
LED_Init(); //初始化LED端口
while(1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //LED0对应引脚GPIOD.2拉低,亮 等同LED0=0;
GPIO_SetBits(GPIOA,GPIO_Pin_8); //LED1对应引脚GPIOA.5拉高,灭 等同LED1=1;
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOD,GPIO_Pin_2); //LED0对应引脚GPIOD.2拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //LED1对应引脚GPIOA.8拉低,亮 等同LED1=0;
delay_ms(300); //延时300ms
}
}
有问题请留言,