STM32CubeMX+FATFS+FREERTOS读写U盘

这篇具有很好参考价值的文章主要介绍了STM32CubeMX+FATFS+FREERTOS读写U盘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、硬件软件说明

软件:STM32CubeMX V6.6.1 、 KEIL5 V5.29

硬件:STM32F429ZET6

USB_OTG_FS:PA11/PA12引脚

USART1:PA9/PA10,方便输出调试信息

二、STM32CubeMX配置

1)SYS下载方式选择SW方式,因为要使用FREERTOS,提前将时钟源修改为TIM7(其他定时器也可以)

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

2) RCC设置,选择高速外部晶振HSE(根据具体硬件选择)

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

3)USART1设置,方便输出调试信息,参数默认即可,可以使用其他串口

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

4)USB_OTG_FS配置,Mode选择Host_Only,参数默认

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

5)FREERTOS配置,将默认任务的堆栈该为1024,其他参数默认

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档
fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

6)USB_HOST配置,Class for FS IP选择Mass Storage Host Class,需要注意将最后一项参数USB_PEOCESS_STACK_SIZE由默认的128改为512。需要注意的是USB任务堆栈别太小,否则读写U盘时容易卡死。

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

7)FATFS配置,如下图。将CODE_PAGE改为Simplified Chinese,支持中文读写;USE_LFN修改为Enable with dynamic working buffer on the STACK,支持长文件名。其他参数保持默认。MAX_SS默认为512,改为4096测试也正常。

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

8)时钟树配置,板子使用的外部晶振为8MHz,STM32F429ZET6最大时钟为180MHz,这里配置为168MHz,输入168,回车即可,系统会自动配置好时钟。

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

9)工程配置,将堆栈大小改大点,如图。

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档
fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

所有配置完成,点击GENERATE CODE,生成代码。

三、代码介绍

添加测试代码

串口重映射,支持printf函数,usart.c修改如下:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @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 "usart.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

UART_HandleTypeDef huart1;

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */

  /* USER CODE END USART1_Init 2 */

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    /* USART1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspDeInit 1 */

  /* USER CODE END USART1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
#include "stdio.h"
//加入以下代码,支持printf函数

#pragma import(__use_no_semihosting)

//标准库需要的支持函数
struct __FILE
{
    int handle;
};

FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
    x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    USART1->DR = (int) ch;
    return ch;
}
/* USER CODE END 1 */

freertos.c修改如下:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @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 "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "fatfs.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */

/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .stack_size = 1024 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */

/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void *argument);

extern void MX_USB_HOST_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* init code for USB_HOST */
  MX_USB_HOST_Init();
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
      printf("STM32CubeMX USB FATFS FREERTOS Test!\r\n");//输出调试信息
      UsbTest();//读写U盘中文件
      osDelay(1000);
      
      
  }
  /* USER CODE END StartDefaultTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */

fatfs.c修改如下:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file   fatfs.c
  * @brief  Code for fatfs applications
  ******************************************************************************
  * @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 */
#include "fatfs.h"

uint8_t retUSBH;    /* Return value for USBH */
char USBHPath[4];   /* USBH logical drive path */
FATFS USBHFatFS;    /* File system object for USBH logical drive */
FIL USBHFile;       /* File object for USBH */

/* USER CODE BEGIN Variables */
#include "usb_host.h"
extern ApplicationTypeDef Appli_state;
/* USER CODE END Variables */

void MX_FATFS_Init(void)
{
  /*## FatFS: Link the USBH driver ###########################*/
  retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);

  /* USER CODE BEGIN Init */
  /* additional user code for init */
  /* USER CODE END Init */
}

/**
  * @brief  Gets Time from RTC
  * @param  None
  * @retval Time in DWORD
  */
DWORD get_fattime(void)
{
  /* USER CODE BEGIN get_fattime */
  return 0;
  /* USER CODE END get_fattime */
}

/* USER CODE BEGIN Application */
static void MSC_Application(void) //USB大容量存储区测试代码
{
    FRESULT res;
    uint32_t byteswritten;  //file write/read counts
    //uint8_t wtext[] = "This is USB Mass Storage Application Example!\r\n";
    uint8_t wtext[] = "这是一个STM32CubeMX_FATFS_FREERTOS_USB测试!\r\n";
    
    #if 1
    /*以下代码测试ok,可以向STM32_USB.txt中写入数据*/
    
    uint32_t bytesread;       // 读文件计数
    uint8_t rtext[1024];      // 读取的buff
    
    printf("\r\n MSC_Application USB \r\n");
    
    //1.挂载USB
    res = f_mount(&USBHFatFS,(const TCHAR*)USBHPath,1);
    if(res != FR_OK)
    {
        Error_Handler();
        printf(" mount USB fail: %d \r\n",res);
    }
    else
    {
        printf(" mount USB success!!! \r\n");

        //2.打开
        res = f_open(&USBHFile, "STM32_USB.txt", FA_CREATE_ALWAYS | FA_WRITE);
        if(res != FR_OK)
        {
            Error_Handler();
            printf(" open file error : %d\r\n",res);
        }
        else
        {
            printf(" open file success!!! \r\n");
            
            //3.写数据
            res = f_write(&USBHFile, wtext, sizeof(wtext), (void *)&byteswritten);    //在文件内写入wtext内的内容
            if(res != FR_OK)
            {
                Error_Handler();
                printf(" write file error : %d\r\n",res);    
                
            }
            printf(" write file success!!! writen count: %d \r\n",byteswritten);
            printf(" write Data : %s\r\n",wtext);
            
            //4.关闭文件
            res = f_close(&USBHFile);
        }
    }
    
    printf(" read USB mass storage data.\r\n");
    //5.打开文件
    res = f_open(&USBHFile, "STM32_USB.txt", FA_READ);                //打开文件,权限为只读
    if(res != FR_OK)
    {                                    //返回值不为0(出现问题)
        Error_Handler();
        printf(" open file error : %d\r\n",res);        //打印问题代码
    }
    else
    {
        printf(" open file success!!! \r\n");
        
        //6.读取txt文件数据
        res = f_read(&USBHFile, rtext, sizeof(rtext), (UINT*)&bytesread);//读取文件内容放到rtext中
        if(res)
        {                                                    //返回值不为0(出现问题)
            Error_Handler();
            printf(" read error!!! %d\r\n",res);                    //打印问题代码
        }
        else
        {
            printf(" read success!!! \r\n");
            printf(" read Data : %s\r\n",rtext);                   //打印读取到的数据
        }
        
        //7.读写一致性检测
        if(bytesread == byteswritten)                                        //如果读写位数一致
        { 
            printf(" bytesread == byteswritten,写入与读出数据一致。\r\n");    //打印文件系统工作正常
        }
        
        //8.关闭文件
        res = f_close(&USBHFile);
    }
    #endif
    
    #if 0
    /*以下代码测试ok,可以向STM32_USB.txt中写入数据*/
    /*如果要使用下面的测试代码,将#if 0 改为#if 1*/
    if(f_mount(&USBHFatFS,(const TCHAR*)USBHPath,1) !=FR_OK)
    {
        //Fatfs Initialization Error
        Error_Handler();
        printf(" mount USB fail!!! \r\n");
    }
    else
    {
        printf(" mount USB success!!! \r\n");
        if(f_open(&USBHFile, "STM32_USB.txt", FA_CREATE_ALWAYS | FA_WRITE) !=FR_OK)
        {
            // "STM32_USB.txt" file open for write error
            Error_Handler();
            printf(" open usb file fail!!! \r\n");
        }
        else
        {
            printf(" open usb file success!!! \r\n");
            //write data to the text file
            res = f_write(&USBHFile, wtext, sizeof(wtext), (void *)&byteswritten);
            if((byteswritten==0) || (res != FR_OK)){
                Error_Handler();
                printf(" write usb file fail!!! \r\n");
            }
            else
            {
                printf(" write usb file success!!! \r\n");
                //close the open text file
                f_close(&USBHFile);
            }
            printf(" operate USB file end \r\n");    
        }
    }
    #endif
}

void UsbTest(void)
{
    
    
    switch(Appli_state)
    {
        case APPLICATION_READY:
            MSC_Application();
            Appli_state = APPLICATION_DISCONNECT;
            break;
        
        case APPLICATION_DISCONNECT:
            f_mount(NULL, (const TCHAR*)"",0);
            break;
        
        default:
            break;
    }
}    
/* USER CODE END Application */

fatfs.h中加入void UsbTest(void)

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file   fatfs.h
  * @brief  Header for fatfs applications
  ******************************************************************************
  * @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 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __fatfs_H
#define __fatfs_H
#ifdef __cplusplus
 extern "C" {
#endif

#include "ff.h"
#include "ff_gen_drv.h"
#include "usbh_diskio.h" /* defines USBH_Driver as external */

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

extern uint8_t retUSBH; /* Return value for USBH */
extern char USBHPath[4]; /* USBH logical drive path */
extern FATFS USBHFatFS; /* File system object for USBH logical drive */
extern FIL USBHFile; /* File object for USBH */

void MX_FATFS_Init(void);

/* USER CODE BEGIN Prototypes */
void UsbTest(void);
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /*__fatfs_H */

四、测试截图

串口调试助手接收的数据:

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

U盘中文件,文件内容截图:

fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档
fatfs freertos,STM32,stm32,FATFS,FREERTOS,STM32CubeMX,USB,Powered by 金山文档

五、完整工程链接

https://download.csdn.net/download/chen18221987993/87428373文章来源地址https://www.toymoban.com/news/detail-799838.html

到了这里,关于STM32CubeMX+FATFS+FREERTOS读写U盘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 SDIO使用FatFs中间件读写4线SD卡,并实现以轮询方式读写SD卡或以DMA方式读取SD卡 FatFs文件系统相关知识请读者

    2024年02月19日
    浏览(51)
  • STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 使用FatFs中间件通过SPI通信协议对W25Q128芯片进行读写等操作 关于STM32F407使用SPI通信协议对W25Q128 FLASH芯片读写

    2024年02月19日
    浏览(55)
  • STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)

    ==== 文章汇总(有代码汇总) ==== 准备看看这方面的知识,一时间还没不清有什么区别,先补补课,不需要的跳过。 参考文章(内容来源):http://www.360doc.com/content/21/1125/22/59057945_1005908465.shtml 主要写这两个:SD卡、TF卡 共同点:SD、TF、MMC都是在MMC基础上演化发展不同的规范,

    2024年02月09日
    浏览(49)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(73)
  • [STM32] - STM32F407VET6使用STM32CubeMX配置FatFs,以及挂载时返回03错误码问题的解决

    为测试新买的开发板TF卡读写是否正常,使用STM32CubeMX(后简称CubeMX)进行代码构建。生成代码后烧录测试,发现在挂载TF卡时无法成功,返回值为错误3( FR_NOT_READY )。经排查后问题已解决,遂记录配置过程供大家参考,并讲解挂载时返回错误3的解决方式。 ①为了输出TF卡(

    2024年02月22日
    浏览(71)
  • STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS)

    STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS),轻松实现APP升级、数据存储。 直接使用STM32CubeMX生成基本的工程,省得我们去调底层。 时钟配置为外部8MHz晶振,这个需要根据自己开发板的晶振选择。  启用SWD下载和滴答定时器  启用USB  启用FATFS,MAX_SS和MIN_SS设置为1024。  配

    2024年02月14日
    浏览(45)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(87)
  • STM32使用HAL库SPI驱动W25Q16 使用FATFS文件系统+USB虚拟U盘

    使用stm32F407驱动W25Q16,使用FATFS文件系统,USB虚拟优盘功能,W25Q16一共512个扇区,其中128作为flash存取相关数据,其他的384个扇区用作虚拟U盘使用 W25Q16.c W25Q16.h user_diskio.c usbd_storage_if.c main.c STORAGE_BLK_NBR 表示扇区数量 STORAGE_BLK_SIZ 表示扇区大小 电脑上的U盘容量跟这两个参数密

    2024年04月28日
    浏览(45)
  • 基于STM32CubeMX创建FreeRTOS—以STM32F429为例

    目录 1. 实验任务 2. 使用STM32CubeMX创建基础工程 2.1 使用STM32CubeMX创建项目 2.2 创建新项目 2.3 时钟设置 2.4 时钟配置树 2.5 修改时钟基准,打开串行调试 2.6 配置串口 2.7 配置状态指示灯 2.8 FreeRTOS配置 2.9 配置工程输出项 3. 代码编辑 3.1 printf重映射 3.1.1 使用ARMCC 5编译器时的print

    2024年01月22日
    浏览(44)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包