GPIO 输出—使用固件库点亮 LED

编程要点

  1. 使能 GPIO 端口时钟;
  2. 初始化 GPIO 目标引脚为推挽输出模式;
  3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平。

LED的电路图

过程:

          1.拷贝一个库函数编程模板,重新命名。

          2.user新建led文件夹,目录下新建bsp_led.h bsp_led.c

          3.keil打开项目,user添加bsp_led.c,点击魔术棒,c/c++选项卡的include path添加led文件夹。

          4. 下面我将给出各个文件的内容:

            main.c文件中

#include "stm32f10x.h"   // 相当于51单片机中的  #include <reg51.h>
#include "bsp_led.h"   //调用自己写的功能函数的头文件即可。

void Delay( uint32_t count){
  for( ;count!=0;count--);

}


int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
	LED_GPIO_Config();
	while(1){
        /*         LED长亮           */
        //GPIO_SetBits(LED_GPIO_PORT, GPIO_Pin_2);
        /*        下面为闪烁点亮LED    */
	GPIO_SetBits(LED_GPIO_PORT, GPIO_Pin_2);
	Delay(0xfffff);
        GPIO_ResetBits(LED_GPIO_PORT, GPIO_Pin_2);
	Delay(0xfffff);
   }
}

         bsp_led.c中

/*  在bsp_led.c中只需要引入它自己的头文件即可,因为在它头文件中已经调用了 stm32f10x.h,所以这里可以不重复调用   */

#include "bsp_led.h" void LED_GPIO_Config(){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_GPIOC_CLOCK, ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=LED_GPIO_PIN; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct); }

       bsp_led.h中

#ifndef BSP_LED_H_
#define BSP_LED_H_

#include "stm32f10x.h"

#define LED_GPIO_PIN     GPIO_Pin_2
#define LED_GPIO_PORT    GPIOC
#define LED_GPIOC_CLOCK  RCC_APB2Periph_GPIOC

void LED_GPIO_Config(void);

#endif

关于LED点亮函数和延迟函数的宏定义写法

  延迟函数的宏定义

#define SOFT_DELAY    Delay(0x0FFFFF);
/*        在main函数中调用 SOFT_DELAY即可;

点亮LED灯的函数

      第一种:

  /* 使用标准的固件库控制 IO*/

#define ON 0

#define OFF 1

 
 #define LED(a) if (a) 
           GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
           else 
           GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN)

/*        在main中调用即可,例如 LED(ON);       */

    第二种 

/* 直接操作寄存器的方法控制 IO */
  #define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
  #define digitalLo(p,i) {p->BRR=i;} //输出低电平
  #define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态

 /* 定义控制 IO 的宏 */
  #define LED_TOGGLE digitalToggle(LED_GPIO_PORT,LED_GPIO_PIN)
  #define LED_OFF digitalHi(LED_GPIO_PORT,LED_GPIO_PIN)
  #define LED_ON digitalLo(LED_GPIO_PORT,LED_GPIO_PIN)


/*在main中调用即可,例如 LED_ON;
原文地址:https://www.cnblogs.com/wenshinlee/p/8845857.html