打印
[STM32F1]

stm32新手入门之 01点亮LED

[复制链接]
2567|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 aizaixiyuanqian 于 2017-11-29 22:55 编辑

1   LED闪烁实验

STM32 最简单的外设莫过于 IO 口的高低电平控制了,本次实验将通过一个经典的 LED 闪烁程序,带大家进入 STM32 的学习, 通过本次的实验, 将了解到STM32 的 IO 口作为输出使用的方法。在本次实验中我们将通过代码控制STM32 开发板上的 8 个 LED,实现闪烁灯果。 本次实验要学会如下:
1、 知道 STM32 有几种 GPIO 模式,怎么配置。
2、学会设置 STM32 的 GPIO 输出高低电平控制 LED 灯。




来自 2楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:06 | 只看该作者
硬件设计
可以看到开发板上面 LED 的接线图如下,LED1~LED8 接到了单片机的PC0~PC7上面。

01.png (64.52 KB )

01.png

2.png (51.38 KB )

2.png

使用特权

评论回复
来自 3楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:22 | 只看该作者
从上面的原理图中,我们可以看到 LED 灯是接到STM32的 IO口的 PC0 到 PC7。点 亮一盏LED的原理就是把相应的IO口输出低电平, IO口 输出为高电平就能够熄灭 LED,要实现 LED 闪烁也就是将STM32管脚每间隔一段时间不输出一个高低电平脉冲即可。

使用特权

评论回复
来自 4楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:29 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2017-11-29 22:31 编辑

STM32 的  IO  口简介
STM32 的每个 IO 口都有 7 个寄存器来控制。分别是:配置模式寄存器 CRL 和 CRH; 数据存器 IDR 和ODR;置位/复位寄存器 BSRR;复位寄存器 BRR; 锁存寄存器 LCKR。如果想要了个寄存器的详细使用,可以参考 STM32 中文参考手册.配置模式如图3,图4,图5


3.png (33.9 KB )

3.png

4.png (53.3 KB )

4.png

5.png (33.96 KB )

5.png

使用特权

评论回复
来自 5楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:34 | 只看该作者
控制 LED 的时候, IO 口可以设置为推挽输出模式。我们为 什么不用开漏输出来控制 LED 灯呢?其实推挽输出和开漏输出学过模拟电路的 应该都知道它的工作原理,一般来说推挽输出:可以输出高,低电平,连接数 字器件;开漏输出:输出端相当于三极管的集电极, 要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma以内)。所以这里 我们选择推挽输出控制 LED 灯。

使用特权

评论回复
来自 6楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:41 | 只看该作者
设置  GPIO (主要是基于库函数版本的)
GPIO_Init( GPIO_TypeDef*GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)这么个函数,通过调用这个函数我们就可以配置 GPIO 口的模式 了。具体可以参考库函数手册。简单介绍一下 GPIO_Init( GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)这么个函数。这个函数有两个参数,第一个参数是用来指定要设置 GPIO,取值范围为GPIOA~GPIOG,比如你要设置 GPIOB,那么就是 GPIOB。第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。一共定义了三个参数如下

1.   GPIO_Pin:选择要设置的 Pin 口。
2.   GPIO_Speed:设置 IO 口的速率
3.   GPIO_Mode:选择要设置的 IO 模式。



使用特权

评论回复
来自 7楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:47 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2017-11-29 22:49 编辑

接下来我们来配置一下 LED GPIO的初始化。  大家不要怕麻烦。
void led_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    开启GPIO的时钟这个很重要,需要哪个GPIO就开启对应的时钟,这里我 们需要GPIOC
GPIO_InitStructure.GPIO_Pin=led;                                         选择你要设置的 IO 口    led已经被我们提前宏定义过 代替PC0~PC7

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;              设置推挽输出  这个毫无疑问


GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;             设置传输速率

GPIO_Init(GPIOC,&GPIO_InitStructure);                                  搞定
}



使用特权

评论回复
来自 8楼
aizaixiyuanqian|  楼主 | 2017-11-29 22:53 | 只看该作者
接下来写一下 LED 灯闪烁函数。
void led_display()
{
GPIO_SetBits(GPIOC,LED);      //GPIO PC0~PC7给高电平
delay(6000000);                     //延时约为 1s  这里的延时是软件延时,还没涉及到定时器 大家不要急
GPIO_ResetBits(GPIOC,LED);   //GPIO PC0~PC7给低电平
delay(6000000);
}
这样就实现了对LED的闪烁实验是不是很简单


使用特权

评论回复
9
戈卫东| | 2017-11-29 22:16 | 只看该作者
这是要做流水灯?

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2017-11-29 22:19 | 只看该作者
戈卫东 发表于 2017-11-29 22:16
这是要做流水灯?

想做个基础的学习教程吧

使用特权

评论回复
11
戈卫东| | 2017-11-29 22:22 | 只看该作者
aizaixiyuanqian 发表于 2017-11-29 22:19
想做个基础的学习教程吧

哦~~~楼主君辛苦了

使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2017-11-29 22:24 | 只看该作者
戈卫东 发表于 2017-11-29 22:22
哦~~~楼主君辛苦了

学习使我快乐

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2017-11-29 22:54 | 只看该作者
LED的操作,就先到这里,如果有什么需要解释的欢迎留帖

使用特权

评论回复
14
一路向北lm| | 2017-11-29 23:01 | 只看该作者
红色字体注释不错,辛苦了

使用特权

评论回复
15
sopc12| | 2017-11-30 14:17 | 只看该作者
好,写的不错,感谢感谢

使用特权

评论回复
16
hello牟| | 2017-11-30 21:38 | 只看该作者
LED都烂大街了。

使用特权

评论回复
17
zhuotuzi| | 2017-11-30 22:00 | 只看该作者
好多接口都可以io实现

使用特权

评论回复
18
zhuotuzi| | 2017-11-30 22:01 | 只看该作者
hello牟 发表于 2017-11-30 21:38
LED都烂大街了。

是不是觉得他小菜鸟了

使用特权

评论回复
19
yiyigirl2014| | 2017-11-30 23:15 | 只看该作者
时钟配置好,端口模式选择正确就可以了

使用特权

评论回复
20
aizaixiyuanqian|  楼主 | 2017-12-1 22:19 | 只看该作者
int main()
{
led_Init();  //led 端口及时钟初始化
while(1)
{
led_display(); //led 显示
}
}
我们直接将 LED 初始化及闪烁的子函数调用即可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝