单片机\程序中的那些宏定义

1、字符串的数据长度,用sizeof求数据长度并用宏定义表示

uint8_t  buf[]="Hello,I am STM32\r\n";

求字符串数组buf的数据长度:

uint8_t buflen;

buflen = sizeof(buf)/sizeof(*buf)-1;

buflen就是字符串数组buf的数据长度。

宏定义:

#define DATALEN(BUF)  (sizeof(BUF)/sizeof(*BUF))

buflen = DATALEN(buf)-1;

2、数据(10进制/16进制)的数据长度,用sizeof求数据长度并用宏定义表示

uint32_t buf[]={1,2,3,4,5,6,7,8,9,10,11,12};

uint8_t buflen = sizeof(buf)/sizeof(*buf);

buflen就是数据数组buf的数据长度。

宏定义:

#define DATALEN(BUF)  (sizeof(BUF)/sizeof(*BUF))

buflen = DATALEN(buf);

3、STM32点亮LED宏定义

本次程序有3个文件,分别为:led.c,led.h,main.c

根据STM32的电路板原理图写程序,

在led.h中程序如下写:

#ifndef   _LED_H
#define  _LED_H
#include "sys.h"

#define    LEDn                                                2

#define    LED0_PIN                                        GPIO_PIN_9
#define    LED0_GPIO_PORT                         GPIOF
#define    LED0_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOF_CLK_ENABLE()  
#define    LED0_GPIO_CLK_DISABLE()          __HAL_RCC_GPIOF_CLK_DISABLE()

#define    LED1_PIN                                         GPIO_PIN_10
#define    LED1_GPIO_PORT                          GPIOF
#define    LED1_GPIO_CLK_ENABLE()           __HAL_RCC_GPIOF_CLK_ENABLE()  
#define    LED1_GPIO_CLK_DISABLE()          __HAL_RCC_GPIOF_CLK_DISABLE()


#define    LEDx_GPIO_CLK_ENABLE(__INDEX__)        do{if((__INDEX__) == 0) LED0_GPIO_CLK_ENABLE(); else \
                                                                                               if((__INDEX__) == 1) LED1_GPIO_CLK_ENABLE(); \
                                                                                          }while(0)
typedef enum 
{
  LED0 = 0,
  LED1 = 1
} Led_TypeDef;


#endif              /* end _LED_H*/

在led.c文件中写到:

#include "led.h"


GPIO_TypeDef* GPIO_PORT[LEDn] = {LED0_GPIO_PORT, LED1_GPIO_PORT};

uint16_t GPIO_PIN[LEDn] = {LED0_PIN, LED1_PIN};


void LED_Init(Led_TypeDef led)                                   //LED初始化
{
    GPIO_InitTypeDef GPIO_Initure;
    LEDx_GPIO_CLK_ENABLE(led);                             //开启LED_GPIO时钟
    
    GPIO_Initure.Pin=GPIO_PIN[led]; 
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;            //高速
    HAL_GPIO_Init(GPIO_PORT[led],&GPIO_Initure);
    HAL_GPIO_WritePin(GPIO_PORT[led],GPIO_PIN[led],GPIO_PIN_SET);    
}


void LED_On(Led_TypeDef Led)    //LED ON
{
    HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET); 
}


void LED_Off(Led_TypeDef Led)  //LED OFF
{
    HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET); 
}

在main.c文件中写:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

extern void LED_Init(Led_TypeDef led);//调用led.c中声明定义的函数
extern void LED_On(Led_TypeDef Led);
extern void LED_Off(Led_TypeDef Led);

int main(void)

       HAL_Init();                                      //初始化HAL库    
      Stm32_Clock_Init(336,8,2,7);          //设置时钟,168Mhz
      delay_init(168);                                //初始化延时函数
      LED_Init(LED0);                              //初始化LED    
      LED_Init(LED1);                              //初始化LED    
    
      while(1)
      {
          LED_On(LED0);     //LED0亮
          LED_Off(LED1);  //LED1灭
          delay_ms(500);    //延时500ms
          LED_Off(LED0);  //LED0灭
          LED_On(LED1);     //LED1亮
          delay_ms(500);  //延时500ms 
    }
}

用宏定义来写显得直观,更重要的是更改方便和容易管理。具体源码可在以下链接下载:

https://download.csdn.net/download/euxnijuoh/10606388

猜你喜欢

转载自blog.csdn.net/euxnijuoh/article/details/81661139