STM32 点亮一个LED,LED流水灯

目录

电路连接

GPIO口的配置

        1.RCC开启GPIO时钟

        2.初始化GPIO

        3.使用库函数操作GPIO输出高低电平     

--代码

--实验效果


电路连接

STM32 点亮一个LED,LED流水灯_第1张图片

 将LED连接到STM32的PA0上。实物发光二极管长引脚接正极;短引脚接PA0上。

GPIO口的配置

        因为LED负极接在STM32上,所以我们的任务就是控制单片机对应的I/O口输出高低电平来控制LED亮灭。所以IO口应该选择推挽输出模式。此时LED连接状态为低电平导通。(I/O的基本结构与8种输入输出模式区别)。

        接下来来配置GPIO。配置GPIO需要有三步

        1.RCC开启GPIO时钟

                在rcc.h文件里可以找到函数定义。因为GPIO是挂在APB2上的,我们要找到APB2外设时钟控制。

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

                右键,点击函数定义(Go To Definition),可以看到两个参数可以选的值,第一个值可以选以下值

             RCC_APB2Periph_AFIO,        RCC_APB2Periph_GPIOA,        RCC_APB2Periph_GPIOB,
             RCC_APB2Periph_GPIOC,     RCC_APB2Periph_GPIOD,        RCC_APB2Periph_GPIOE,
             RCC_APB2Periph_GPIOF,      RCC_APB2Periph_GPIOG,        RCC_APB2Periph_ADC1,
             RCC_APB2Periph_ADC2,       RCC_APB2Periph_TIM1,            RCC_APB2Periph_SPI1,
             RCC_APB2Periph_TIM8,         RCC_APB2Periph_USART1,      RCC_APB2Periph_ADC3,
             RCC_APB2Periph_TIM15,       RCC_APB2Periph_TIM16,          RCC_APB2Periph_TIM17,
             RCC_APB2Periph_TIM9,         RCC_APB2Periph_TIM10,          RCC_APB2Periph_TIM11

                第二个值可以选择    ENABLE or DISABLE 。   选择黑色加粗的参数,就配置好时钟了。

        2.初始化GPIO

                用结构体参数来初始化GPIO口。先定义一个结构体变量,在进行赋值,

                 最后调用          GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)     函数进行初始化。

    GPIO_InitTypeDef    GPIO_InitStructure;                              //定义结构体变量
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //定义完成后输入GPIO_InitStructure.  后面会出现Mode ,Pin,Speed变量并配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                     // GPIO_Mode_Out_PP\rightarrow推挽输出  GPIO_Pin_0\rightarrowPA0
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //50MHz速度

    GPIO_Init(GPIOA, &GPIO_InitStructure);                //最后调用GPIO_Init() 完成初始化

        3.使用库函数操作GPIO输出高低电平     

                完成初始化后就可以通过库函数来操作输出高低电平了,同样打开stm32f10x_gpio.h可以找到函数声明,右键(goto definition)可以到 .c 文件里查找函数定义。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);                             //置高电平1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);                         //置低电平0
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);  //写入高低电平, BitAction BitVal 可写 Bit_RESET 置0

                                                                                                                                                                                           或者Bit_SET   置1


--代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"                     

 //LED闪烁

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	
	
	while(1)
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
		Delay_ms(500);
		GPIO_SetBits(GPIOA,GPIO_Pin_0);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
		Delay_ms(500);
		
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);//BitAction 强制类型转换 0低电平
		Delay_ms(500); 
		GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
		Delay_ms(500);
	}
}

LED闪烁代码    其中Delay_ms  延时函数 ,主循环中, 三种配置方式都可以使LED闪烁。


#include "stm32f10x.h"                  // Device header
#include "Delay.h"

//LED流水灯

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	
	
	while(1)
	{
		unsigned char i = 0;

        //方法一
		GPIO_Write(GPIOA,~0x0001); 
                Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0002); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0004); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0008); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0010); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0020); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0040); 
		Delay_ms(500);	
		GPIO_Write(GPIOA,~0x0080); 
		Delay_ms(500);

         //方法二
		for(i=0;i<8;i++)
		{
			GPIO_Write(GPIOA,~(0x0001<

 LED流水灯代码     其中的   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;   选择了16个端口全部打开。

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */

或者可以将其配置成     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2  | GPIO_Pin_3......GPIO_Pin_7;

因为由定义可知,GPIO_Pin_0 是 0x0001 相当于二进制 0000 0000 0000 0001

                             GPIO_Pin_1 是 0x0002 相当于二进制 0000 0000 0000 0010

所以 GPIO_Pin_0 \rightarrowGPIO_Pin_7 全部通过 操作 最后变成  二进制 0000 0000 0111 1111  也就相当于选择了PA0 - PA7的端口打开,

而上述代码段   GPIO_Pin_All 的二进制相当于    1111 1111 1111 1111  选取了全部的PA口都打开了。

方法一 是采用了逐位设置 高电平然后取反成低电平点亮。

方法二 采用了循环,每隔500ms,循环左移一位。 函数     GPIO_Write( )  的定义和使用方法就不多在赘述了,可以前往.c文件查看用法。


--实验效果

STM32 点亮LED 闪烁-CSDN

STM32 LED 流水灯-CSDN


GPIO模式        GPIO_Mode_AIN  (Analog IN)                     模拟输入

                        GPIO_Mode_IN_FLOATING                        浮空输入

                        GPIO_Mode_IPD(In Pull Down)              下拉输入

                        GPIO_Mode_IPU(In Pull UP)                  上拉输入

                        GPIO_Mode_Out_OD(Out Open Drain)  开漏输出

                        GPIO_Mode_Out_PP(Out Push Pull)      推挽输出

                        GPIO_Mode_AF_OD(Alt Open Drain)     复用开漏输出

                        GPIO_Mode_AF_PP(Alt Push Pull)         复用推挽输出

你可能感兴趣的:(stm32,单片机,学习,arm,嵌入式硬件)