STM32学习1:GPIO输出实验——点亮三色LED

发布者:Blissful567最新更新时间:2021-03-25 来源: eefocus关键字:STM32  GPIO输出 手机看文章 扫描二维码
随时随地手机看文章

一、概述:


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不能在输入数据寄存器上读到有效的数据。该输入模式,使我们可以获得外部的模拟信号 开漏输出:开漏输出不可以直接输出高电平,开漏输出的输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。 开漏复用输出:GPIO的基本功能是普通的I/O,而STM32有自己的各个功能模块,这些内置外设的引脚是与标准GPIO复用的,当作为这些模块的功能引脚时就叫复用。开漏复用输出功能模式与开漏输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连即与复用功能的输出端相连,此时,输出数据寄存器在输出通道被断开。 推挽复用输出:推挽复用输出功能模式与推挽输出模式相比,不同的是输出控制电路的输入,是和片上外设的输出信号相连,即与复用功能的输出端相连,而输出数据寄存器在输出通道被断开。


二、硬件电路:

在iCore3双核心开发板中,采用一个独立的红绿蓝三色LED与STM32F407相连,限流电阻为1K。其中,红色LED与PI5引脚相连,绿色LED与PI6引脚相连,蓝色LED与PI7引脚相连。


三、实验原理:

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


四、源代码:


1、主函数


/*


* Name : main


* Description : ---


* Author : ysloveivy.


*


* History


* --------------------


* Rev : 0.00


* Date : 11/21/2015


*


* create.


* --------------------


*/


int main(void)


{


int i;


led.initialize();


//三色LED交替闪烁


while(1){


LED_RED_ON;


LED_GREEN_OFF;


LED_BLUE_OFF;


for(i = 0;i < 10000000;i++);


LED_RED_OFF;


LED_GREEN_ON;


LED_BLUE_OFF;


for(i = 0;i < 10000000;i++);


LED_RED_OFF;


LED_GREEN_OFF;


LED_BLUE_ON;


for(i = 0;i < 10000000;i++);


}


}


2、GPIO初始化


* Name : initialize


* Description : ---


* Author : ysloveivy.


*


* History


* --------------------


* Rev : 0.00


* Date : 11/21/2015


*


* create.


* --------------------


*/


static int initialize(void)


{


GPIO_InitTypeDef GPIO_uInitStructure;


//LED IO初始化


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);


GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //初始化连接三色LED灯的IO端口


GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置端口为输出模式


GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP; //设置输出类型为推挽输出模式


GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉输出


GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置速度等级


GPIO_Init(GPIOI,&GPIO_uInitStructure);


//PI5、PI6、PI7、接三色LED灯,置高电平,灯熄灭


GPIO_SetBits(GPIOI,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);


return 0;


}


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),红色、绿色、蓝色交替点亮。


关键字:STM32  GPIO输出 引用地址:STM32学习1:GPIO输出实验——点亮三色LED

上一篇:单片机上的按键检测框架
下一篇:中断与事件关系的解剖

推荐阅读最新更新时间:2024-11-13 10:18

结合STM32单片来讲讲结构体的运用
摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。 大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书。 这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了
[单片机]
怎样在Linux上开发STM32程序
步骤1:下载所需的一切 您需要下载三个部分才能正常工作: 用于ARM的GCC编译器 STM32固件文件 St-link实用程序 Sample Project 编译器是将我们的C代码和所有其他库文件编译成stm32控制器可以理解的机器语言的主要软件。下载此编译器的最新预编译版本。 包含STM32固件的文件夹是保存主处理器运行所需的所有启动文件和核心文件的文件夹。我们将使用HAL已超越的标准外围设备库。我更喜欢StPeriphLibrary,因为使用该处理器的公司都在使用它们,因为它功能强大,更老旧并且受支持。它也更坚固。它不会减少初始化外围设备或打开LED所需的工作,但是会迫使您学习这些处理器的工作方式。这样一来,您将对内部工作
[单片机]
怎样在Linux上开发<font color='red'>STM32</font>程序
再造STM32---第三部分:什么是寄存器?
本系列是基于STM32F429野火库进行学习。 3.1什么是寄存器? 我们经常说寄存器,那么什么是寄存器?这是我们本章需要讲解的内容,在学习的过程中,大家带着这个疑问好好思考下,到最后看看大家能否用一句话给寄存器下一个定义。 3.2 STM32 长啥样? 我们开发板中使用的芯片是 176pin 的 STM32F429IGT6,具体见图 3-1。这个就是我们接下来要学习的 STM32,它讲带领我们进入嵌入式的殿堂。芯片正面是丝印, ARM 应该是表示该芯片使用的是 ARM 的内核, STM32F429IGT6是芯片型号,后面的字应该是跟生产批次相关,最下面的是 ST 的 LOGO。芯片四周是引脚,左下角的小
[单片机]
再造STM32---第三部分:什么是寄存器?
stm32快速学习1——环境的建立
安装keil for arm 下载stm32固件库3.4 解压,勿乱移动解压文件内的文件,因为项目内使用的都是相对路径。 进入 STM32F10x_StdPeriph_Lib_V3.4.0\Project\STM32F10x_StdPeriph_Template\MDK-ARM 打开keil文件,修改一下这个项目模板 删除左侧的stm32_eval文件夹、doc文件夹、使用的是stm32f103RBT6(中等容量的芯片)然后MDK-ARM下的文件除了 startup_stm32f10x_md.s(根据芯片类型),其他都删除 startup_stm32f10x_md.s右键,选中include in target build 左侧最
[单片机]
Ubuntu下安装Stm32的Eclipse的开发环境(1)
在最起初的时候,我刚刚接触linux上单片机的开发,最喜欢的就是 eclipse + arm-plug-in + arm-none-eabi 的开发环境,因为这是在Linux上最接近于windows下keil、IAR等IDE的开发方式,然而那是由于对eclipse亦或是makefile等编译过程中的工具的不甚了解,很多时候会遇到一些莫名的错误,也导致了那是觉得这样的环境很鬼畜,现在看来多是一些很浅显的问题,直到最近我再一次的尝试了eclipse开发环境的搭建和使用,我才很顺利的完成了程序的配置。现在也把这个方法推荐给大家,不过在使用这个方式前,还是建议大家先把之前的文章内容看懂了,否则很多时候遇到问题都会不知道怎么解决。 安装
[单片机]
STM32 PWM简介及呼吸灯实验
1.PWM简介 脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单来说,就是对脉冲宽度的控制,原理图如下: 当CNT CCRx时,输出0,反之,则输出1。因此可以输出如上的PWM示意图。当CNT达到CCRx时,重新归零,然后再向上计数,依次循环。通过改变CCRx的值,就可以改变PWM的输出占空比,改变ARR的值,就可以改变PWM输出的频率,这就是PWM输出的原理。 这里我们使用STM32F4的TIM14的CH1产生一路PWM输出。 值得一提的是控制PWM的三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2),捕获/比较使能寄存器(TIMx_CCER),捕获/比较寄存
[单片机]
<font color='red'>STM32</font> PWM简介及呼吸灯实验
关于STM32利用硬件仿真串口中断处理函数应注意的问题
我们在利用jlink或其他仿真器对串口中断处理函数的数据接收进行仿真时,如果在中断函数中设置了断点,我们向串口发送数据端会采用逐个字节发送而不能采用一次性发送多个字节,当然从广义上来讲,你一次发那么多字节我在断点处程序已经停止了再运行肯定你的数据我会丢失啊,所以需要逐个字节发送这是可以理解的。而我这里讲的是如果你一次发送多个字节将会导致什么后果的问题. 假设1:假如你的断点设置在res = USART_ReceiveData(USART1)之后,以下面发送的这串字符为例,那么实际上当你停到断点处看到接收到fe时由于DR寄存器之前已经清空,实际上01已经存到DR中了,这时你运行会再次运行到这个断点,即受到了fe 和01两
[单片机]
关于<font color='red'>STM32</font>利用硬件仿真串口中断处理函数应注意的问题
STM32:STM32学习记录5: 外部中断
配置流程: 1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。 2:IO口初始化,包括引脚,速率,输入输出模式等。 3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。 4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。 说明: 1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。 2:中断函数名在startup_stm32f10x_xx.s中查阅 3:清除 EXT13 线路的挂起位 注意此处一定要清除!!!!!!!!在EXTI_PR
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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