• 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;
  • 相关阅读:
    CSS 学习资源 W3C school
    嵌入式计算机与PC机的区别
    Javascript:新消息闪烁标题提示代码分享 (转)
    有源RFID与无缘RFID的区别
    event.X和event.clientX有什么区别
    什么是射频耦合和射频补偿?
    【转】js日期时间函数
    JQuery操作cookie插件
    js操作cookie (转)
    UIM卡
  • 原文地址:https://www.cnblogs.com/wenshinlee/p/8845857.html
Copyright © 2020-2023  润新知