历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2018年08月12日 | STM32F103RCT6控制LED

2018-08-12 来源:eefocus

不管什么单片机,想要控制LED灯,只能是通过控制单片机芯片的I/O引脚电平的高低来实现。
同样在ST单片机也一样,在ST单片机上,I/O引脚可以被软件设置成各种不同的功能,如输入或输出,所以被称为 GPIO (General-purpose I/O)。
而GPIO引脚又被分为GPIOA、GPIOB„„GPIOG不同的组,每组端口分为 0~15,共16个不同的引脚不等,
对于不同型号的芯片,端口的组和引脚的数量不尽相同,具体请参考相应ST单片机芯片型号的datasheet。 


根据ST单片机的GPIO特点,控制LED灯的步骤如下: 
1.在众多 GPIO端口引脚中选定需要控制的特定引脚[与LED相连的控制引脚] 
2.根据外设配置GPIO需要的特定功能 

3.通过设置 GPIO输出电压的高低控制LED的亮和灭

电路图



从电路图可以看出低电平LED亮,高电平LED灭


所以我们设置的程序如下:

下面为库函数编程,需要加载如下库文件

main.c


/*********************************************************

*平台:MDKARM 5.14

*主控:STM32F103RCT6

**********************************************************/

#include "stm32f10x.h"

#include "led.h"

 

//延时函数

void Delay(unsigned int t)

{

while(t != 0)

{

t--;

}

}

 

int main (void)

{

LED_Init();

while (1)       //步骤3

{

        LED_Not(0);             //LED亮灭交替闪烁

for (j=0; j<30; j++)

{

Delay(60000);

}

}

}

led.c

#include "led.h"

//LED 端口初始化//步骤2

void LED_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE); //开启GPIO的外设时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;//选定控制引脚//步骤1

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚为通用推挽输出  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置控制引脚的速度

  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化结构体

GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//初始化LED灯熄灭

}

//点亮1个LED灯

void LED_On(int n)

{

switch(n)

{

case 0: GPIO_ResetBits(GPIOC,GPIO_Pin_0);       //控制引脚输出低电平

break;

case 1: GPIO_ResetBits(GPIOC,GPIO_Pin_1);

break;

case 2: GPIO_ResetBits(GPIOC,GPIO_Pin_2);

break;

case 3:  GPIO_ResetBits(GPIOC,GPIO_Pin_3);

break;

default: break;

}

}

//

void LED_Off(int n)

{

switch(n)

{

case 0: GPIO_SetBits(GPIOC,GPIO_Pin_0);         //控制引脚输出高电平

break;

case 1: GPIO_SetBits(GPIOC,GPIO_Pin_1);

break;

case 2: GPIO_SetBits(GPIOC,GPIO_Pin_2);

break;

case 3:  GPIO_SetBits(GPIOC,GPIO_Pin_3);

break;

default: break;

}

}

 

 

void LED_Not(int n)

{

switch(n)

{

case 0: GPIO_WriteBit(GPIOC, GPIO_Pin_0,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0))));

break;

case 1: GPIO_WriteBit(GPIOC, GPIO_Pin_1,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_1))));

break;

case 2: GPIO_WriteBit(GPIOC, GPIO_Pin_2,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_2))));

break;

case 3:  GPIO_WriteBit(GPIOC, GPIO_Pin_3,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));

break;

default: break;

}

}


如此编译后下载到MCU就能看到LED一闪一闪的


推荐阅读

史海拾趣

固驰(GUERTE)公司的发展小趣事

随着产品质量的不断提升和技术的持续创新,固驰电子开始积极拓展国内外市场。公司产品不仅畅销国内市场,为美的、格力、艾美特等知名企业配套,还大量出口至韩国、俄罗斯、美国、加拿大、德国等国家和地区。这一过程中,固驰电子凭借其优良的品质、满意的价格和完善的服务赢得了国内外客户的一致好评,品牌影响力显著提升。

DBLECTRO公司的发展小趣事

进入21世纪后,随着全球对环保和可持续发展的关注度不断提高,迪贝电子也积极响应这一趋势,将环保和社会责任融入到企业的经营理念中。公司投入大量资金研发更加环保、节能的产品,并积极参与各种环保公益活动。同时,迪贝电子还积极推广绿色制造理念,通过优化生产流程、降低能耗和减少废弃物排放等措施,实现了企业的可持续发展。

Alpha (Taiwan)公司的发展小趣事

面对全球环保意识的日益增强,Alpha (Taiwan)公司积极响应号召,致力于绿色电子产品的研发和生产。公司投入大量资金研发环保材料和技术,成功推出了一系列绿色环保电子产品。这些产品不仅具有优异的性能,而且在使用过程中对环境的影响较小,符合现代社会的环保理念。此外,公司还积极参与环保公益活动,宣传环保知识,推动电子行业的绿色发展。

BALLUFF公司的发展小趣事

随着中国经济的快速发展,BALLUFF公司也看到了中国市场的巨大潜力。为了更好地服务中国市场,BALLUFF在2007年坚定地走本土化路线,在成都建立了生产工厂。这一举措不仅缩短了亚洲地区的响应时间和供货周期,也极大地提升了客户满意度。随着工厂的正式运行,BALLUFF在中国市场的地位逐渐稳固,其传感器产品也广泛应用于汽车、冶金、机床和风电等行业。

Festo公司的发展小趣事

20世纪50年代,随着自动控制技术的发展和现代工业水平的不断提高,气动元件和气动系统得到了广泛的应用。被誉为“德国气动之父”的Kurt Stoll敏锐地发现了这一趋势,并领导Festo公司开始在这一领域进行深入的研发。通过不断的努力和创新,Festo成功开发出了一系列高性能的气动产品,并在市场上取得了巨大的成功。逐渐地,Festo成为了全球气动自动化领域的领导者。

Global Mixed-Mode Technology Inc公司的发展小趣事
设计和实现一个简单的三相缺相报警灯电路,可以使用三个中间继电器分别接在三相电的L1、L2、L3相上,继电器的另一端接零线。继电器的常开触点与报警灯(如黄灯、绿灯、红灯)串联,形成指示灯电路。当三相电正常时,继电器均吸合,常开触点断开,报警灯不亮。当某一相缺相时,对应相的继电器失电,常开触点闭合,使对应的报警灯亮起。同时,可以加入声音警报电路,当任一相缺相时,触发声音警报。

问答坊 | AI 解惑

周立功ARM培训精华(全套)

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 学ARM可以看看!  …

查看全部问答>

汇编实现公历转农历

求助!!! 有没人知道要如何实现用汇编实现公历的年月日转变成农历。 题目:公历年存在55H(年的低两位),月存在54H,日存在53H,然后将55H,54H,53H,中的内容取出转换成农历的年月日,存到58H,57H,56H(年,月,日) 有的话请帮忙给出程序( ...…

查看全部问答>

关于存储器地址范围问题,在线等,急,谢谢!组成原理方面的!

在存储器设计时经常碰到这样的问题,给出存储器地址范围,需要求存储器大小或者是给出存储器地址范围,需要求存储器大小的. 比如:如果有16条地址线,有一大小为40KB的ROM,从0地址开始,请问下这40KB大小的地址范围是: 0000H~????H,如何计算? 比较简单 ...…

查看全部问答>

如何在WM5/6系统中用代码实现一个闹钟?

大家好, 我需要在WM5/6系统中用代码实现一个闹钟,请达人帮忙,不胜感激!…

查看全部问答>

问下89c54NTCSD4EE8232REV E 和MSP430FE427的区别?前者能用IAR仿真码?

如题,初学者,没办法 前面单片机只能记个大概…

查看全部问答>

IAR 调试 直接进入到disassemble里,不能在c程序里调试仿真,为什么啊

各位大神帮忙,如题所示,这是怎么回事吗,我进入程序之后直接就进入反汇编仿真窗口,不能进入c程序窗口,正常的话应该两个都能进去啊   同步进行的,我的options没有设错好像,并且不能动态设置断点,在反汇编窗口就可以,在c程序窗口就 ...…

查看全部问答>

iar xcl文件错误

mage32芯片linker===>config===>linker command file===>override defoult 前打勾出现错误Fatal Error[e72]: Segment CODE must be defined in a segment definition option (-Z, -b or -P) 不打勾则正常 新手求解…

查看全部问答>