国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

這篇具有很好參考價(jià)值的文章主要介紹了STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

通過cubemx配置 實(shí)現(xiàn)STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

1.實(shí)驗(yàn)?zāi)康?/h2>

1.使用FAFTS文件操作系統(tǒng),實(shí)現(xiàn)STM32虛擬U盤,讀寫外部SD卡,fatfs和usb mass storage class共存。
2.請先完成上一個(gè)帖子的步驟 --> 跳轉(zhuǎn)https://blog.csdn.net/hjn0618/article/details/130383593

2.實(shí)驗(yàn)平臺

硬件平臺:正點(diǎn)原子阿波羅 STM32H734IIT6
開發(fā)工具:STM32CubeIDE 1.12.0
HAL庫:STM32Cube FW_H7 V1.11.0

3.CubeMX配置

(1)增加??臻g
stm32模擬u盤,STM32,stm32,單片機(jī),嵌入式硬件
(2)配置FATFS
設(shè)置USE_LFN到STACK,防止文件名稱過長,使FREERTOS內(nèi)存溢出
stm32模擬u盤,STM32,stm32,單片機(jī),嵌入式硬件

(2)開啟FREERTOS
開啟FreeRTOS后,USB_Device初始化函數(shù)再默認(rèn)任務(wù)中,所以要增加默認(rèn)的堆棧,
另外需要注意的是,開始FreeRTOS后,fatfs操作函數(shù)也必須在任務(wù)中,如f_mount等。
stm32模擬u盤,STM32,stm32,單片機(jī),嵌入式硬件

4.代碼部分

重寫usbd_storage_if.c,因?yàn)榧尤肓薋reeRTOS,fatfs對sd卡讀寫用的是發(fā)送消息機(jī)制,所以usbd_storage_if.c里的讀寫不能再去調(diào)用bsp_driver_sd.c里的讀寫方法了,大家有興趣的可以對比一下有無FreeRTOS,bsp_driver_sd.c源碼的內(nèi)容

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file           : usbd_storage_if.c
 * @version        : v1.0_Cube
 * @brief          : Memory management layer.
 ******************************************************************************
 * @attention
 *
 * Copyright (c) 2023 STMicroelectronics.
 * All rights reserved.
 *
 * This software is licensed under terms that can be found in the LICENSE file
 * in the root directory of this software component.
 * If no LICENSE file comes with this software, it is provided AS-IS.
 *
 ******************************************************************************
 */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "usbd_storage_if.h"

/* USER CODE BEGIN INCLUDE */
#include "fatfs.h"
#include "stdio.h"
/* USER CODE END INCLUDE */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern SD_HandleTypeDef hsd1;
/* USER CODE END PV */

/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  * @brief Usb device.
  * @{
  */

/** @defgroup USBD_STORAGE
  * @brief Usb mass storage device module
  * @{
  */

/** @defgroup USBD_STORAGE_Private_TypesDefinitions
  * @brief Private types.
  * @{
  */

/* USER CODE BEGIN PRIVATE_TYPES */

/* USER CODE END PRIVATE_TYPES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Defines
  * @brief Private defines.
  * @{
  */

#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  0x10000
#define STORAGE_BLK_SIZ                  0x200

/* USER CODE BEGIN PRIVATE_DEFINES */

/* USER CODE END PRIVATE_DEFINES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Macros
  * @brief Private macros.
  * @{
  */

/* USER CODE BEGIN PRIVATE_MACRO */

/* USER CODE END PRIVATE_MACRO */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_Variables
  * @brief Private variables.
  * @{
  */

/* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {/* 36 */
/* LUN 0 */

0x00, 0x80, 0x02, 0x02, (STANDARD_INQUIRY_DATA_LEN - 5), 0x00, 0x00, 0x00, 'S',
		'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
		'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
		' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '.', '0', '1' /* Version      : 4 Bytes */
};
/* USER CODE END INQUIRY_DATA_FS */

/* USER CODE BEGIN PRIVATE_VARIABLES */
/* USER CODE END PRIVATE_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Exported_Variables
  * @brief Public variables.
  * @{
  */

extern USBD_HandleTypeDef hUsbDeviceFS;

/* USER CODE BEGIN EXPORTED_VARIABLES */

/* USER CODE END EXPORTED_VARIABLES */

/**
  * @}
  */

/** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  * @brief Private functions declaration.
  * @{
  */

static int8_t STORAGE_Init_FS(uint8_t lun);
static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
static int8_t STORAGE_IsReady_FS(uint8_t lun);
static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
static int8_t STORAGE_GetMaxLun_FS(void);

/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */

/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

/**
  * @}
  */

USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
{
  STORAGE_Init_FS,
  STORAGE_GetCapacity_FS,
  STORAGE_IsReady_FS,
  STORAGE_IsWriteProtected_FS,
  STORAGE_Read_FS,
  STORAGE_Write_FS,
  STORAGE_GetMaxLun_FS,
  (int8_t *)STORAGE_Inquirydata_FS
};

/* Private functions ---------------------------------------------------------*/
/**
  * @brief  Initializes the storage unit (medium) over USB FS IP
  * @param  lun: Logical unit number.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Init_FS(uint8_t lun)
{
  /* USER CODE BEGIN 2 */
	UNUSED(lun);
	return USBD_OK;
  /* USER CODE END 2 */
}

/**
  * @brief  Returns the medium capacity.
  * @param  lun: Logical unit number.
  * @param  block_num: Number of total block number.
  * @param  block_size: Block size.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
	int8_t ret = -1;
	HAL_SD_CardInfoTypeDef info;
	ret = HAL_SD_GetCardInfo(&hsd1, &info);
	*block_num = info.LogBlockNbr - 1;
	*block_size = info.LogBlockSize;
	return ret;
  /* USER CODE END 3 */
}

/**
  * @brief   Checks whether the medium is ready.
  * @param  lun:  Logical unit number.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  /* USER CODE BEGIN 4 */
	int8_t ret = -1;
	UNUSED(lun);
	if (HAL_SD_GetCardState(&hsd1) == HAL_SD_CARD_TRANSFER)
		ret = 0;
	return ret;
  /* USER CODE END 4 */
}

/**
  * @brief  Checks whether the medium is write protected.
  * @param  lun: Logical unit number.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{
  /* USER CODE BEGIN 5 */
	UNUSED(lun);

	return (USBD_OK);
  /* USER CODE END 5 */
}

/**
  * @brief  Reads data from the medium.
  * @param  lun: Logical unit number.
  * @param  buf: data buffer.
  * @param  blk_addr: Logical block address.
  * @param  blk_len: Blocks number.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
	int8_t ret = USBD_FAIL;
	uint32_t timer;
	if (HAL_SD_ReadBlocks_DMA(&hsd1, buf, blk_addr, blk_len) == HAL_OK) {
		ret = USBD_OK;
	}

	if (USBD_OK == ret) {
		timer = osKernelSysTick();
		while (HAL_SD_GetState(&hsd1) == HAL_SD_STATE_BUSY) {
			if (osKernelSysTick() - timer > 30 * 1000) {
				return USBD_FAIL;
			}
		};
		timer = osKernelSysTick();
		while (HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER) {
			if (osKernelSysTick() - timer > 30 * 1000) {
				return USBD_FAIL;
			}
		};
	}
	return USBD_OK;
  /* USER CODE END 6 */
}

/**
  * @brief  Writes data into the medium.
  * @param  lun: Logical unit number.
  * @param  buf: data buffer.
  * @param  blk_addr: Logical block address.
  * @param  blk_len: Blocks number.
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
	int8_t ret = USBD_FAIL;
	uint32_t timer;
	if (HAL_SD_WriteBlocks_DMA(&hsd1, buf, blk_addr, blk_len) == HAL_OK) {
		ret = USBD_OK;
	}
	if (USBD_OK == ret) {
		timer = osKernelSysTick();
		while (HAL_SD_GetState(&hsd1) == HAL_SD_STATE_BUSY) {
			if (osKernelSysTick() - timer > 30 * 1000) {
				return USBD_FAIL;
			}
		};
		timer = osKernelSysTick();
		while (HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER) {
			if (osKernelSysTick() - timer > 30 * 1000) {
				return USBD_FAIL;
			}
		};
	}

	return USBD_OK;
  /* USER CODE END 7 */
}

/**
  * @brief  Returns the Max Supported LUNs.
  * @param  None
  * @retval Lun(s) number.
  */
int8_t STORAGE_GetMaxLun_FS(void)
{
  /* USER CODE BEGIN 8 */
	HAL_SD_CardInfoTypeDef info;
	HAL_SD_GetCardInfo(&hsd1, &info);

	if (info.LogBlockNbr)
		return STORAGE_LUN_NBR - 1;
	else
		return STORAGE_LUN_NBR - 2;

  /* USER CODE END 8 */
}

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */

/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

/**
  * @}
  */

/**
  * @}
  */

sd_diskio.c增加兩個(gè)函數(shù),用作usb msc時(shí)關(guān)閉消息,做文件管理接收消息

/* USER CODE BEGIN ErrorAbortCallbacks */
/*
 ==============================================================================================
 depending on the SD_HAL_Driver version, either the HAL_SD_ErrorCallback() or HAL_SD_AbortCallback()
 or both could be defined, activate the callbacks below when suitable and needed
 ==============================================================================================
 void BSP_SD_AbortCallback(void)
 {
 }

 void BSP_SD_ErrorCallback(void)
 {
 }
 */
/* USER CODE END ErrorAbortCallbacks */

/* USER CODE BEGIN lastSection */
/* can be used to modify / undefine previous code or add new code */
void SD_Delet_Queue(void) {
	osMessageDelete(SDQueueID);
}

void SD_Create_Queue(void) {
	osMessageQDef(SD_Queue, QUEUE_SIZE, uint16_t);
	SDQueueID = osMessageCreate(osMessageQ(SD_Queue), NULL);
}
/* USER CODE END lastSection */

通過中斷來判斷usb連接狀態(tài)

/**
  * @brief This function handles USB On The Go FS global interrupt.
  */
void OTG_FS_IRQHandler(void)
{
  /* USER CODE BEGIN OTG_FS_IRQn 0 */
  /* USER CODE END OTG_FS_IRQn 0 */
  HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
  /* USER CODE BEGIN OTG_FS_IRQn 1 */
  FILE_MGT_USB_CHECK(); // 自定義的函數(shù)
  /* USER CODE END OTG_FS_IRQn 1 */
}

USB連接狀態(tài)檢測任務(wù)
注意:該任務(wù)的優(yōu)先級要高于默認(rèn)任務(wù)的優(yōu)先級,原因是先要執(zhí)行HAL_SD_Init(&hsd1),才能開啟USB_MSC,在STORAGE_Init_FS我沒有調(diào)用HAL_SD_Init(&hsd1),HAL_SD_Init(&hsd1)已經(jīng)在fatfs中調(diào)用了。

static void FILE_MGT_USB_CHECK_TASK(const void *arg) {
	uint8_t dev_state = 0;
	osEvent event;
	FatFs_Check();
	for (;;) {

		event = osMessageGet(usbStateQueueHandle, osWaitForever);
		if (event.status == osEventMessage) {
			osMutexWait(sdFreeMutexHandle, osWaitForever);
			printf("hUsbDeviceFS:%d\n", (uint8_t) event.value.v);
			if ((uint8_t) event.value.v == USBD_STATE_ADDRESSED) {
				dev_state = USBD_STATE_ADDRESSED;
			} else if ((dev_state == USBD_STATE_ADDRESSED)
					&& ((uint8_t) event.value.v == USBD_STATE_CONFIGURED)) {
				Set_SD_WriteOrRead(0);
				printf("usb connect\n");
			} else {
				dev_state = 0;
				Set_SD_WriteOrRead(1);
				printf("usb disconnect\n");
			}
			osMutexRelease(sdFreeMutexHandle);
		}

	}
}

文件操作測試任務(wù)

static void FILE_MGT_SD_TEST_TASK(const void *arg) {
	osDelay(500);
	for (;;) {
		osDelay(500);
		osMutexWait(sdFreeMutexHandle, osWaitForever);
		if (SDCard_EN) {
			FatFs_FileTest();
		} else {
			printf("禁止使用SD卡\n");
		}
		osMutexRelease(sdFreeMutexHandle);

	}
}

以上兩個(gè)任務(wù)是互斥的,為了是檢測USB連接狀態(tài)時(shí),等待fatfs文件操作完成后再禁用fatfs文件操作系統(tǒng)。

// 使能/禁止SD卡讀寫 1允許 0禁止
static void Set_SD_WriteOrRead(uint8_t en) {
	if (en == 1) {
		SD_Create_Queue();
		SDCard_EN = 1;
	} else {
		SD_Delet_Queue();
		SDCard_EN = 0;
	}
}

5.實(shí)驗(yàn)效果

插入U(xiǎn)SB后,禁用文件操作系統(tǒng)
stm32模擬u盤,STM32,stm32,單片機(jī),嵌入式硬件
拔出USB后,使能文件操作系統(tǒng)
stm32模擬u盤,STM32,stm32,單片機(jī),嵌入式硬件

6.源碼下載

https://download.csdn.net/download/hjn0618/87751815文章來源地址http://www.zghlxwxcb.cn/news/detail-684629.html

到了這里,關(guān)于STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32H7使用FileX庫BUG,SD卡掛載失敗

    STM32H7使用FileX庫BUG,SD卡掛載失敗

    使用STM32H7+ThreadX+FileX,之前使用swissbit牌的存儲卡可正常使用,最近項(xiàng)目用了金士頓的存儲卡,發(fā)現(xiàn)無法掛載文件系統(tǒng)。 調(diào)試過程發(fā)現(xiàn),關(guān)閉D-Cache可以掛載使用exfat文件系統(tǒng)。 FileX對SD卡讀寫接口全部位于fx_stm32_sdio_driver.c中,查看該文件可以發(fā)現(xiàn)在讀寫函數(shù)中已經(jīng)考慮到使用

    2024年04月28日
    瀏覽(27)
  • STM32H7使用QSPI外擴(kuò)flash(linux下使用openocd操作)

    STM32H7使用QSPI外擴(kuò)flash(linux下使用openocd操作)

    根據(jù)安福萊的STM32H7教程,H7單片機(jī)的QSPI外設(shè)是直接連到芯片內(nèi)核上的,地址是0X90000000;那么就可以通過QSPI外設(shè),將外置flash內(nèi)存映射,并由此執(zhí)行代碼。 相關(guān)操作在keil5上比較簡單,配置點(diǎn)東西就行;可以參考安福萊教程。 這里要介紹的是在linux環(huán)境下沒有keil5 IDE的情況下

    2024年01月16日
    瀏覽(23)
  • STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    先了解一下AD7606,16位,單電源,200k采樣率,8路,除了貴沒有其他缺點(diǎn),數(shù)據(jù)相當(dāng)?shù)姆€(wěn),一個(gè)5V供電,不用運(yùn)放的情況下采集電壓精度可以達(dá)到1mv,非常Nice 與單片機(jī)相連 單片機(jī) 調(diào)用代碼 測試發(fā)現(xiàn)AD采集到的電壓要遠(yuǎn)小于實(shí)際電壓,H7的AD還是16位的,不能這么拉跨吧,在網(wǎng)上

    2024年02月11日
    瀏覽(25)
  • STM32CubeMX+FATFS+FREERTOS讀寫U盤

    STM32CubeMX+FATFS+FREERTOS讀寫U盤

    軟件:STM32CubeMX V6.6.1 、 KEIL5 V5.29 硬件:STM32F429ZET6 USB_OTG_FS:PA11/PA12引腳 USART1:PA9/PA10,方便輸出調(diào)試信息 1)SYS下載方式選擇SW方式,因?yàn)橐褂肍REERTOS,提前將時(shí)鐘源修改為TIM7(其他定時(shí)器也可以) 2) RCC設(shè)置,選擇高速外部晶振HSE(根據(jù)具體硬件選擇) 3)USART1設(shè)置,方便輸出調(diào)

    2024年01月18日
    瀏覽(35)
  • STM32H743使用CubeMX配置Lwip、Freertos

    STM32H743使用CubeMX配置Lwip、Freertos

    硬件:野火挑戰(zhàn)者開發(fā)板STM32H743IIT6 軟件版本: CubeMX 6.7.0 STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 原理圖: 時(shí)鐘樹參數(shù)僅供參考 MPU配置需要查相關(guān)資料,一知半解 修改GPIO與硬件原理圖對應(yīng),串口參數(shù)默認(rèn) 參數(shù)配置與硬件對應(yīng) 此處網(wǎng)絡(luò)收發(fā)地址非常重要?。。?使能中斷 串口

    2024年02月07日
    瀏覽(42)
  • 【STM32H7 開發(fā)筆記】| 02 - 通過定時(shí)器級聯(lián)方式同步啟動(dòng)多個(gè)定時(shí)器并輸出 PWM 波形

    【STM32H7 開發(fā)筆記】| 02 - 通過定時(shí)器級聯(lián)方式同步啟動(dòng)多個(gè)定時(shí)器并輸出 PWM 波形

    (STM32H723xE/G) 所有定時(shí)器包括 兩個(gè)高級控制定時(shí)器、十二個(gè)通用定時(shí)器、兩個(gè)基本定時(shí)器、五個(gè)低功耗定時(shí)器、兩個(gè)看門狗定時(shí)器和一個(gè)SysTick定時(shí)器 。所有計(jì)時(shí)器計(jì)數(shù)器都可以在Debug模式下凍結(jié)。 本次實(shí)驗(yàn)主頻配置的是500MHz 高級控制定時(shí)器(TIM1,TIM8)可以看作是在6通道

    2024年02月14日
    瀏覽(37)
  • STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事項(xiàng)

    STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事項(xiàng)

    以STM32F429為例: 1、SDIO配置 配置為4bit模式,此配置不是最終配置,后面會在代碼進(jìn)行修改。 2、Fatfs配置 Set Defines 選項(xiàng)中的配置可以默認(rèn),最重要注意Advanced Setting 選擇中的配置,如下 該界面配置默認(rèn)Use dma template是默認(rèn)使能的 ,并且不可以選擇,只能選擇使能,所以需要使

    2024年02月11日
    瀏覽(31)
  • STM32H723配置以太網(wǎng)+Freertos注意事項(xiàng)

    STM32H723配置以太網(wǎng)+Freertos注意事項(xiàng)

    由于STM32H743漲價(jià)到300元以上,項(xiàng)目換用了Pin2Pin替換的STM32H723,看上去cpu運(yùn)行速度快了20%達(dá)到550Mhz。 但是內(nèi)存布局存在很大不一樣,而且ST官方代碼庫升級迭代快,要手動(dòng)修改地方每個(gè)版本不一樣,在有H743的經(jīng)驗(yàn)下,花了2天時(shí)間搞好了記錄一下。很多信息來源于英文ST支持論

    2023年04月18日
    瀏覽(38)
  • cubmx基礎(chǔ)操作,hal庫基本配置流程之使用 stm32cubmx生成HAL庫進(jìn)行g(shù)pio點(diǎn)亮led(stm32h7xx)(超詳細(xì),小白教程)

    cubmx基礎(chǔ)操作,hal庫基本配置流程之使用 stm32cubmx生成HAL庫進(jìn)行g(shù)pio點(diǎn)亮led(stm32h7xx)(超詳細(xì),小白教程)

    HAL庫(硬件抽象層庫)是一個(gè)提供對底層硬件操作的抽象的庫,它使得開發(fā)者可以使用統(tǒng)一的接口進(jìn)行硬件操作,而不必關(guān)心底層硬件的具體實(shí)現(xiàn)細(xì)節(jié)。HAL庫通常由硬件廠商提供,用于支持其硬件設(shè)備,并為其提供標(biāo)準(zhǔn)化的接口。 HAL庫的主要目的是簡化底層硬件的操作,使得

    2024年02月20日
    瀏覽(18)
  • 【單片機(jī)學(xué)習(xí)筆記】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc環(huán)境搭建

    【單片機(jī)學(xué)習(xí)筆記】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc環(huán)境搭建

    為摒棄在接受keil郵件,研究了下gun編譯,以STM32F407為例,簡單記錄 Git 選擇對應(yīng)版本直接安裝即可https://git-scm.com/download/win make gcc ? 1)將上述軟件包放置于C盤根目錄 2)添加環(huán)境變量 3)cmd命令行測試環(huán)境 分別輸入 啟動(dòng)文件及LD文件 目錄路徑表示問題 字節(jié)對齊及指定位置存

    2024年02月07日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包