日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机\程序中的那些宏定义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

總結

以上是生活随笔為你收集整理的单片机\程序中的那些宏定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。