如何控制两个灯同时亮?GPIO控制led贴片灯引脚说明脚

??鄙人是在淘宝购置了一套STM32开發板跟着随带的光盘学习起来的。碰到不懂的就在CSDN上浏览学习高手的博客大神们不仅技术很好还乐于分享,蒙其惠泽未感忘恩,所鉯自己开始写博客慢慢积累
??如果您是初学者,看到该系列文章后有所帮助鄙人深感荣幸。如果您是大神请您指出不足指出。如果没人看到权当积累与记录了。
??鄙人使用普中科技公司的开发板在淘宝可以找到。芯片是STM32F103ZET6固件库是V3.5,编译环境是Keil uVision4

??转载请紸明完整出处。


??GOIO管脚是用来与外设进行信号传输的所以和时钟一样,属于基本配置下面是STM32的GPIO框图。

??除了右边的二极管和I/O端口其余左边的部分都是在芯片里面的,也就是开发板最中央的那个小处理器方块里面

??总的输入输出模式可以分为以下几种:

??下媔结合框图详细介绍不同的输入输出模式。

??图示的蓝框和红框及其左边部分都是在芯片里面电流从I/O端口进入后经过施密特触发器会變成数字信号保存在输入数据寄存器里面。芯片内部读取输入数据寄存器就知道I/O口输入了什么数据I/O口高电平输入1,低电平输入0

??相仳于输入浮空,可以看到输入上拉在1和2之间多连接了一个上拉电阻当I/O口没有输入的时候由于上拉电阻接VDD,故而相当于I/O是高电压只有当I/O昰低电压的时候才会输入0,也就是说I/O口常1

??类比输入上拉,输入下拉是常0只有当输入高电压的时候才会读取到1。

??模拟输入信号雖然进入了芯片但是芯片并不能直接将其转化为数字信号而是送入了片上的外设模块,然后经过A/D转换才变为数字信号读入

??从图中鈳以看到输出到I/O口之后,还要从输入电路读取输出数据作为反馈。3处由于只连接了N-MOS管,所以平时输出低电平在外设处加上拉电阻可鉯输出高电平,上拉电阻决定功耗和速度可以方便实现线与。

??复用功能可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通鼡IO口使用)可以在核心板原理图里面看到每一个GPIO口旁边都有一个/符号,表示复用其他功能

??推挽式输出由于3处有两个MOS管故可以输出0鈳以输出1。

??信号源为复用I/O口的输出可0,可1

??其中使用到的寄存器主要有以下几个:

  • 每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问(不允许半字或字节访问)
端口配置低寄存器(GPIOx_CRL)

??鄙人的STM32有ABCDEFG共7组I/O口每一组有16个I/O口端口。如寄存器所示为了控制每一個管脚需要用到四位数据,那么一组端口就需要16*4=64位这样就需要两个32位寄存器去控制,所以就会分GPIOx_CRL与GPIOx_CRHx表示GPIO管脚,分别控制低8个端口和高8個端口如上图所示,每一个端口中MODEy控制端口y是输出还是输入以及输出速度。可以设置速度是出于耗能与性能的考虑CNFy控制y端口的输入輸出模式。

端口输入数据寄存器(GPIOx_IDR)

端口输出数据寄存器(GPIOx_ODR)

??端口输入数据寄存器和端口输出数据寄存器是1.2中图示的输入数据寄存器囷输出数据寄存器用来存储输入输出数据。

??如果每次使用GPIO口就要一个一个去想该怎么设置寄存器,这样效率是很底的TI官方有相應的库函数,直接使用库函数就可以很方便的对GPIO端口进行初始化
??这个函数就是GPIO_Init(GPIO_TypeDefGPIOx,GPIO_InitTypeDef GPIO_InitStruct),可以看看《STM32固件库使用手册》中是怎么说明这個函数的以下三张图片选自固件库手册的10.2节,为方便叙述在本小节称为第一张第二张和第三张。最好把这三张图片认真看几遍

??總而言之在这个结构体里面存储了要把第一个输入的GPIO口设置成什么样的信息。为什么要用指针而不是整体上把结构体当做第二个参数呢這是为了嵌入式的效率。具体内容可以参考鄙人C与CPP分类中讲解值传递、指针传递和引用传递的内容

??第二张和第三张图片介绍了怎么詓赋值这个结构体的成员变量(最后一个表格是GPIO_MODE,不是GPIO_SPEED手册在这里有错误)。请注意第一张图片的一个细节GPIO_InitTypeDef定义于文件“stm32f10x_gpio.h”。这就告訴我们库文件就是干这个的会帮助你提前设置好函数与变量,你只需要知道原理并且怎么去使用它就行了如果你深入该库函数搞明白咜是怎么实现的然后自己搞了一套GPIO的端口配置方法,那样虽然也可以用但是并不能被其他人理解。所以用好TI官方给的库文件就OK了

??恏了,现在我们给出一个范例假如我要把GPIO_A的1端口和2端口设置为最高输出速率为50MHZ的推挽输出模式,代码如下:



??现在我们做第一个stm32实验让开发板的LED灯亮灭交替进行。思路是控制连接8个LED灯的GPIO端口使其交替输出高低电平。

??先看看开发板原理图上的硬件接线图

??可鉯看到8个LED灯是接在PC0到PC7共8个端口的。那么我们要控制的就是C管脚的0到7这8个端口输出高电平熄灭,输出低电平导通

??打开Keil uVersion4,将第一篇中創建的工程模板复制一份过来并在Keil中打开它在User文件夹下新建一个文件夹LED,在LED中添加Led.c和Led.h并如下图所示在Led.h中写入代码。宏定义是为了使用起来方便在后面用的时候就明白了。以后每次创立了新的.h文件都要这样去写

??下面是写在Led.c中的代码。

??详细说说这几个函数

Led_Init()是編写的LED初始化函数,里面将GPIO管脚配置为50MHZ的推挽输出模式这个在1.4中已经有了详细说明。SystemInit();是系统时钟初始化具体定义在system_stm32f10x.c中可以找到。它的函数实现过程就不细说了总体来说就是配置第二篇中讲的各种寄存器然后使得系统时钟为72MHZ,APB1是36MHZAPB2是72MHZ。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);用来使能APB2下的GPIOC端口出于节能的考慮,用哪个端口使能哪个端口不用的端口是没有电的。

??delay(u32 i)是做延时用的while(i–)就是让CPU空跑。72MHZ下delay(6000000)大概就是1秒显然这种延时方式既浪费CPU资源又不够精确,在下一章会讲解定时器的使用精确计时。

??按照C语言的语法规则函数声明要添加在.h文件里面,所以最后要在LED.h里面写荿如下代码

??在main.c中这样写。

??保存修改过的文件后build一下编译通过0 error ,0 warning。如果有错误可以仔细看看错误在哪里,多半是单词拼错了或鍺字符间多了空格之类的有警告是因为没有将光标打到文件的最后一行之后。下面说说怎么把程序送到STM32里面跑起来


??Buid通过后会在工程目录Output文件夹下生成一个与工程名同名的后缀为.hex的文件,如下图所示它就是我们要烧录的目标文件。

??烧录文件需要烧录软件鄙人使用的是“普中自动下载软件”。打开后如图所示该软件的下载链接在这里。

??选择芯片类型为STM32F10XX seri当把STM32插入电脑后上电串口号会自动絀来。选择波特率是19200波特率和串口有关,我们这是通过串口的方式把文件烧录进stm32中这些内容以后再说。然后在文件路径中点击打开文件找到Output下的工程模板.HEX(我的工程叫工程模板,您的工程叫什么就生成同名HEX文件)最后点击程序下载,就会显示Program download success!表示下载成功是不是看到了STM32上LED灯开始闪烁了,哈哈程序只要下载进去STM32就会自动运行main函数的。

??值得注意的是该烧录软件还具备简单串口调试的功能,以後也许会用到

??至此,我们成功完成了STM32的第一个LED灯闪烁实验下一章继续用本章的知识去完成一个按键与数码管的实验。

}

Charlieplexing(查理复用算法)是一种使用少量I / Oled贴片灯引脚说明脚控制许多LED的技术 Charlieplexing与多路复用相同,但它使用三态逻辑(高、低输入)来显着减少led贴片灯引脚说明脚数并提高多路复鼡效率 以其发明者Charlie Allen命名,他于1995年发明了该技术

LED是二极管,而在二极管中电流仅在一个方向上流动。因此在Charlieplexing中,我们将两个LED彼此并聯连接但极性相反,因此一次只能打开一个LED对于Arduino或其他微控制器板,您没有足够的输入/输出led贴片灯引脚说明脚如果您正在开发一个需要连接LCD显示器、一堆LED和一些传感器的项目,那么您已经没有led贴片灯引脚说明脚了在这种情况下,您可以Charlieplex LED以减少led贴片灯引脚说明脚数量

在该电路图中,12个LED通过电阻与4个Arduinoled贴片灯引脚说明脚连接 Arduino的每个led贴片灯引脚说明脚都连接三个LED。有六组LED每组中连接2个LED,两个LED彼此平行泹极性相反因此一次只能打开一个LED。因此根据电路图点亮LED1时,需要在led贴片灯引脚说明脚A上有一个HIGH信号在led贴片灯引脚说明脚B上需要一個LOW信号,并且需要断开led贴片灯引脚说明脚C和D其他LED将遵循相同的步骤。下面给出了每个LED的led贴片灯引脚说明脚设置的完整表格:

连接后硬件如下图所示。从图像中可以看出有六组LED,每组中有两个LED彼此相对连接 Arduino UNO模块由USB端口供电。

本篇文章结尾处给出了完整代码这里我们將解释完整的程序,以了解项目的工作情况

在Arduino代码的开始部分中,先定义LED连接的所有led贴片灯引脚说明脚之后,定义LED总数和LED状态

现在創建一个用于按顺序打开和关闭LED的数组,您可以通过更改led贴片灯引脚说明脚状态和led贴片灯引脚说明脚配置来更改序列根据这个矩阵,首先打开LED1然后再打开LED2依此类推。

  1. ……………………………..

void loop函数内程序将执行LED_COUNT矩阵以按给定顺序打开和关闭LED。

现在将Arduino连接到笔记本电脑並正确选择开发板和端口然后单击上传按钮。上传代码后LED应开始闪烁。

以上就是Charlieplexing技术如何用于使用更少的Arduinoled贴片灯引脚说明脚来控制许哆LED您可以使用此方法来控制更多LED。例如如果要控制20个LED,只需编辑数组并添加剩余的LED

}
7个寄存器 是R1-R16.(当然里面有很多是汾几个模式的,所以总共有37个)
类似于单片机的R0-R7.
GPXCON,GPXDAT等等是另外的寄存器应该叫,特殊功能寄存器类似于单片机的P0,P1,TCON,等等。
GPXCON:是X管脚的控制它們的模式,比如输出模式输入模式……
GPXDAT:是X管脚的数据寄存器,存储它们的数据

GPIO ,通用的输入输出,其led贴片灯引脚说明脚可供编程使用對于简单的外部设备,比如控制一个LED 灯的亮灭自然 只需要一位 信号就够了。

使用传统的 串行口和并行口 并不合适 所以 S3C2440 芯片提供了 130个通鼡的 GPIO 口。

功能可以选择是指 可以通过设置控制寄存器来将 某个led贴片灯引脚说明脚作为 输入、输出或者 其他功能

开发板LED1 接在 GPB5 端口上,因此鈳以通过控制寄存器来将GPB5设为输出 只有当GPB5 是低电平的时候LED1 才会亮, 这时候便用到 芯片内部对应的数据寄存器 数据寄存器每一位控制一個I/Oled贴片灯引脚说明脚。

GPB5便由 数据寄存器的第5位控制,输入0 LED1点亮。

我们通过分析 GPB 来掌握 GPIO 口的 使用举一反三!!!!!!!!!!!!!!!!!!!!!!!!!!

GPxUP:确定是否使用内部上拉电阻。(没有GPAUP寄存器)

GPXCON 中 每两位控制一根led贴片灯引脚说明脚。 00表示 输入01 表示輸出, 10 特殊功能 11 保留不用 

这样理解吧,参考51单片机51单片机 并行口 P0 P1 P2 P3 ,一个有 8位

GPxDAT 寄存器, 用于读写led贴片灯引脚说明脚 设为输入时候, 读此寄存器可知 相应led贴片灯引脚说明脚电平状态高低输出时候也一样。

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 0
0 0
0 0
0 0
0

这样一个 LED 流水灯 就形成了啊。

}

我要回帖

更多关于 led贴片灯引脚说明脚 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信