历史上的今天
今天是: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一闪一闪的
史海拾趣
|
在存储器设计时经常碰到这样的问题,给出存储器地址范围,需要求存储器大小或者是给出存储器地址范围,需要求存储器大小的. 比如:如果有16条地址线,有一大小为40KB的ROM,从0地址开始,请问下这40KB大小的地址范围是: 0000H~????H,如何计算? 比较简单 ...… 查看全部问答> |
|
IAR 调试 直接进入到disassemble里,不能在c程序里调试仿真,为什么啊 各位大神帮忙,如题所示,这是怎么回事吗,我进入程序之后直接就进入反汇编仿真窗口,不能进入c程序窗口,正常的话应该两个都能进去啊 同步进行的,我的options没有设错好像,并且不能动态设置断点,在反汇编窗口就可以,在c程序窗口就 ...… 查看全部问答> |
|
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) 不打勾则正常 新手求解… 查看全部问答> |




