单片机\程序中的那些宏定义
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.****.net/download/euxnijuoh/10606388