【STM32】LED初始化基础以及基本使用方法(CT117E电路)

目录

LED的使用

LED灯的初始化

LED灯的控制(寄存器or库函数)

参考 


LED的使用

LED灯的初始化

void LED_INIT(void)
{
	// 初始化结构体
	GPIO_InitTypeDef GPIO_InitStructure;
	
	// 使能我们的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
	
	// LED配置引脚初始化参数
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;   // 0xff00
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	
	// LED初始化引脚
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	// 锁存器配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	
	// 锁存器初始化引脚
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	// 将LED初始化为熄灭
	GPIOD->ODR |= (1<<2); // Pin_2
	GPIOC->ODR = 0XFF00;
	GPIOD->ODR &= ~(1<<2); // 0X0010 -> 0X1101 的转变
}

stm32的每一个引脚都有时钟控制,这样在不用的时候可以关闭时钟来达到节能的目的,所以,如果要使用外设,必须先打开时钟,否则没有办法进行操作

既要利用RCC_APB2PeriphClockCmd函数使能对应的时钟

以上代码首先要定义GPIO初始化结构体,通过对CT117E原理图的分析可以看到控制LED灯的锁存器引脚"N_LE"与"H_D0"到"H_D7"分别涉及到了GPIOD和GPIOC,所以用以下代码对两个GPIO进行使能。

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);

选择对应的引脚进行配置,比如从电路图可以看到要配置LED1到LED3,则需要配置引脚8到9。

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10

 

 GPIO 引脚速度: GPIO_Speed_2MHz     (10MHz, 50MHz) ;

又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。)

可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。(如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?)如果信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。

 这里一般设置最快的响应速度

	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

关于模式这里可以了解推免输出的模式:https://zhidao.baidu.com/question/1925251871090147787.html

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推免输出模式

然后初始化GOPOC口的对应引脚,既对C口用初始化结构体来初始化

	GPIO_Init(GPIOC, &GPIO_InitStructure);

 "N_LE"是LED灯的使能引脚,需要找对应的引脚进行单独的初始化,其方式与上面相似,只需改变初始化结构体"GPIO_InitStructure"的参数并对其进行初始化即可

	// 锁存器配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	// 锁存器初始化引脚
	GPIO_Init(GPIOD, &GPIO_InitStructure);

LED灯的控制(寄存器or库函数)

 注意初始化LED灯之后,需要对引脚GPIO_Pin8到15全部置0,就是说要先将所有的灯都关闭。

不仅是初始化对应GPIO口的引脚之后要置0,在每次使用LED灯之前也要先全部置0后再对LED灯进行使用

利用寄存器操作时,可以对结构体GPIO的ODR进行位操作,位操作的方式与各个方式的优缺点可以参考该博文:https://blog.csdn.net/byhunpo/article/details/88996657

//寄存器操作:
    GPIOD->ODR |= (1<<2); // Pin_2 在原来值的基础之上与(0x...00100)进行或操作
	GPIOC->ODR = 0XFF00;
	GPIOD->ODR &= ~(1<<2); // 0X...00100 -> 0X...1101 的转变
//库函数操作:
	GPIO_SetBits(GPIOD,GPIO_Pin_2); //对应的GPIO口的对应引脚置高电平
	GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11\
	|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);//对应的GPIO口的对应引脚置低电平

使用或者说控制LED灯时,用上面相同方法(寄存器的方法或者库函数的方法)对LED灯进行操作即可。

下面是LED所对应的引脚值:

#define LED1                ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define LED2                ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define LED3                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define LED4                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define LED5                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define LED6                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define LED7                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define LED8                ((uint16_t)0x8000)  /*!< Pin 15 selected */

下面是LED的控制函数: 

void LEDControl(u16 LEDx,u8 state)
{
	if(state)
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_ResetBits(GPIOC,LEDx);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}
	else
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_SetBits(GPIOC,LEDx);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}
}

虽然这里的LEDx是16位的,但是进行位操作时可以用于对32位的值进行操作。

参考 

[1] stm32引脚速度GPIO_Speed的区别(转载) http://blog.sina.com.cn/s/blog_965c4d800102whqu.html

[2] stm32各种输出的区别 https://blog.csdn.net/qqGHJ/article/details/88724032

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值