3881|5

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【零基础学习STM32】第一讲:GPIO输出实验——点亮三色LED [复制链接]

本帖最后由 heart蓝色CD 于 2018-1-24 16:34 编辑

一、概述:
1、发光二极管简介
     发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算:
                                                                                       R = (E - UF)/IF
式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。


2、STM32 GPIO简介
     STM32F4每组通用I/O 端口包括4 个32 位配置寄存器(MODER、OTYPER、OSPEEDR 和PUPDR)、2 个32 位数据寄存器(IDR 和ODR)、1 个32 位置位/复位寄存器(BSRR)、1 个32 位锁定寄存器(LCKR) 和2 个32 位复用功能选择寄存器(AFRH 和AFRL)等。
GPIO可以配置成以下8种工作模式:
  • 浮空输入:此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。
  • 上拉输入:上拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个上拉电阻,这个上拉电阻的阻值介于30K~50K欧姆,CPU可以随时在输入数据寄存器的另一端,读出I/O端口的电平状态。这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,处理器会觉得我们输入了高电平,这就避免了不确定的输入。该端口在默认情况下输入为高电平。
  • 下拉输入:下拉输入模式与浮空输入模式相比,仅仅是在数据通道上部,接入了一个下拉电阻。与上拉输入模式类似,这种模式的好处在于外部没有输入时,由于内部下拉电阻的原因,我们的处理器会觉得我们输入了低电平。
  • 模拟功能:STM32的模拟输入通道的配置很简单,信号从I/O端口直接进入ADC模块。此时,所有的上拉、下拉电阻和施密特触发器,均处于断开状态,因此输入数据寄存器将不能反映端口上的电平状态,也就是说,模拟输入配置下,信号不经过输入数据寄存器,CPU不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号。
  • 开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。
  • 推挽输出:推挽输出可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源决定。
  • 开漏复用输出:GPIO的基本功能是普通的I/O,而STM32有自己的各个功能模块,这些内置外设的外部引脚是与标准GPIO复用的,当作为这些模块的功能引脚时就叫复用。开漏复用输出功能模式与开漏输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连即与复用功能的输出端相连,此时,输出数据寄存器在输出通道被断开。
  • 推挽复用输出:推挽复用输出功能模式与推挽输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连,即与复用功能的输出端相连,而输出数据寄存器在输出通道被断开。


二、硬件电路:
      在icore3双核心开发板中(如图1-0,图1-1所示),采用一个独立的红绿蓝三色LEDSTM32F407相连,限流电阻为1K。其中,红色LEDPI5引脚相连,绿色LEDPI6引脚相连,蓝色LEDPI7引脚相连。

三、实验原理:



  本实验通过STM32的三个GPIO口驱动三色LED的三个通道,将GPIO设置为推挽输出模式,采用灌电流的方式与LED连接(如图1-2所示),GPIO输出高电平LED熄灭,GPIO输出低电平LED点亮,通过控制GPIO输出的电平高低从而控制LED的亮灭。

四、源代码:
1、主函数
  1. /*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. int main(void)
  15. {
  16.         int i;

  17.         led.initialize();
  18.         
  19.         //三色LED交替点亮
  20.         while(1){
  21.                 LED_RED_ON;
  22.                 LED_GREEN_OFF;
  23.                 LED_BLUE_OFF;
  24.                 for(i = 0;i < 10000000;i++);
  25.                 LED_RED_OFF;
  26.                 LED_GREEN_ON;
  27.                 LED_BLUE_OFF;
  28.                 for(i = 0;i < 10000000;i++);
  29.                 LED_RED_OFF;
  30.                 LED_GREEN_OFF;
  31.                 LED_BLUE_ON;
  32.                 for(i = 0;i < 10000000;i++);
  33.         }
  34. }
复制代码
2、GPIO初始化
  1. /*
  2. * Name                : initialize
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 11/21/2015
  10. *
  11. * create.
  12. * --------------------
  13. */
  14. static int initialize(void)
  15. {
  16.         GPIO_InitTypeDef   GPIO_uInitStructure;

  17.         //LED IO初始化
  18.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
  19.         GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;    //设置与三色LED相连的三个端口
  20.         GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_OUT;                          //设置IO为输出模式
  21.         GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;                         //设置IO输出类型为推挽输出
  22.         GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;                           //上拉
  23.         GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;                     //设置速度等级

  24.         GPIO_Init(GPIOI,&GPIO_uInitStructure);

  25.         //设置IO输出高电平,三色LED熄灭
  26.         GPIO_SetBits(GPIOI,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);

  27.         return 0;
  28. }
复制代码

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
这个函数两个参数,第一个参数是用来指定需要初始化的GPIO对应的GPIO组,取值范围为GPIOA~GPIOK。第二个参数为初始化参数结构体指针,结构体类型为GPIO_InitTypeDef。
结构体定义为
typedef struct{  
  uint32_t GPIO_Pin;                           //设置IO端口           
  GPIOMode_TypeDef GPIO_Mode;      //设置端口工作模式
  GPIOSpeed_TypeDef GPIO_Speed;    //设置端口的速度等级
  GPIOOType_TypeDef GPIO_OType;   //设置端口的类型
  GPIOPuPd_TypeDef GPIO_PuPd;       //设置上下拉  
}GPIO_InitTypeDef;

五、实验现象:
iCore3双核心板上与ARM相连的三色LED(PCB上标示为ARM·LED),红色、绿色、蓝色交替点亮。
六、代码包下载:
复制网址到浏览器可下载  pan.baidu.com/s/1o6w6Xnk

此内容由EEWORLD论坛网友heart蓝色CD原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自stm32/stm8论坛

最新回复

好好学习一下!  详情 回复 发表于 2018-4-26 11:46
点赞 关注
 

回复
举报

1903

帖子

0

TA的资源

版主

沙发
 
是够0基础的啊
此帖出自stm32/stm8论坛
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

从零开始,一步一步加深。
此帖出自stm32/stm8论坛
 
 

回复

1903

帖子

0

TA的资源

版主

4
 
是啊,起步都这样
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
好好好好好好好好好
此帖出自stm32/stm8论坛
 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

6
 
好好学习一下!
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表