单片机\程序中的那些宏定义
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
?
總結
以上是生活随笔為你收集整理的单片机\程序中的那些宏定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32CubeMX HAL库串口+
- 下一篇: esp8266 wifi信号强度设置