欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/3/26 编程问答 57 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【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; // 0xff00GPIO_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_2GPIOC->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

总结

以上是生活随笔为你收集整理的【STM32】LED初始化基础以及基本使用方法(CT117E电路)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。