使用STM32F103讀取TF卡并模擬U盤:使用標準庫實現

使用STM32F103讀取TF卡并模擬U盤:使用標準庫實現

STM32F103是一款流行的ARM Cortex-M3微控制器,在嵌入式系統中廣泛應用。本文將介紹如何使用STM32F103讀取TF卡,并將其模擬成U盤,讓電腦可以讀取TF卡的內容。我們將使用標準庫(Standard Peripheral Library),而不依賴于CubeMX工具。

準備工作

在開始之前,你需要以下硬件和軟件工具:

  • STM32F103開發板
  • TF卡和卡槽
  • 一臺電腦
  • USB數據線
  • Keil MDK或其他支持STM32的開發環境
  • STM32 Standard Peripheral Library

步驟一:硬件連接

將TF卡插入TF卡槽,并將卡槽連接到STM32F103的相應引腳。常見的連接方式如下:

  • TF卡槽的VCC連接到STM32的3.3V
  • TF卡槽的GND連接到STM32的GND
  • TF卡槽的CS(片選)引腳連接到STM32的PA4
  • TF卡槽的MOSI、MISO和SCK引腳分別連接到STM32的PA7、PA6和PA5

步驟二:配置開發環境

  1. 安裝標準庫
    從ST官網(STM32F10x Standard Peripheral Library)下載STM32F10x標準外設庫,并解壓到你的開發環境中。

  2. 創建項目
    在Keil MDK中創建一個新的STM32F103項目,添加標準外設庫路徑到項目配置中。

步驟三:編寫初始化代碼

初始化SPI接口用于與TF卡通信,并初始化USB接口用于U盤功能。

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_usart.h"
#include "diskio.h"
#include "ff.h"
#include "usb_lib.h"
#include "usb_pwr.h"
#include "usb_desc.h"
#include "hw_config.h"// SPI初始化函數
void SPI_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIO_SPI1, ENABLE);// SPI SCK, MOSI, MISO 引腳初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// SPI CS 引腳初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);// SPI 初始化配置SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode = SPI_Mode_Master;SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);
}// USB 初始化函數
void USB_Config(void) {Set_System();Set_USBClock();USB_Interrupts_Config();USB_Init();
}// TF卡初始化函數
FATFS fs;
void TF_Card_Init(void) {if (f_mount(&fs, "", 1) != FR_OK) {// 掛載失敗處理while (1);}
}int main(void) {SystemInit();SPI_Config();USB_Config();TF_Card_Init();while (1) {// 主循環}
}

步驟四:編寫U盤功能代碼

使用標準庫中的USB功能模塊,實現U盤功能。具體實現可參考ST官方提供的USB MSC示例代碼。以下是一個簡單示例:

#include "usb_scsi.h"
#include "memory.h"void USB_Interrupts_Config(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void Set_USBClock(void) {RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
}void Set_System(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
}void USB_Init(void) {pInformation = &Device_Info;pInformation->Current_Configuration = 0;PowerOn();USB_SIL_Init();bDeviceState = UNCONNECTED;USB_Interrupts_Config();f_mount(&fs, "", 0);
}void USB_LP_CAN1_RX0_IRQHandler(void) {USB_Istr();
}void USB_ISTR(void) {// USB中斷處理
}int main(void) {SystemInit();SPI_Config();USB_Config();TF_Card_Init();while (1) {// 主循環}
}

步驟五:上傳代碼并測試

將代碼上傳到STM32F103開發板。在上傳代碼前,確保選擇了正確的開發板型號和端口。上傳完成后,將STM32F103通過USB數據線連接到電腦。此時,電腦應該識別到一個新的可移動磁盤,即TF卡。你可以像操作普通U盤一樣,對TF卡進行讀寫操作。

注意事項

  1. 確保TF卡格式化為FAT32格式:這樣可以保證最大兼容性。
  2. 確保STM32F103開發板的供電穩定:否則可能會導致讀取失敗。
  3. 檢查引腳連接和初始化代碼:確保硬件連接和初始化代碼正確無誤。

總結

通過以上步驟,你可以實現用STM32F103將TF卡內容變成U盤進行讀取。這種功能在數據采集、便攜式存儲設備等應用中非常有用。如果你有更多的需求,可以進一步擴展此項目,例如添加文件管理功能、加密存儲等。希望這篇博客能幫到你,如果有任何問題,歡迎在評論區留言討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13937.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13937.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13937.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring常見問題

如何理解spring屬于低侵入式設計? 在代碼中不需要寫明具體依賴對象,在運行時進行自動注入,降低了組件的耦合依賴的是接口,而接口的實現類具有拓展性 Spring IOC 實現了什么功能,談談你對IOC的理解。 負責創建對象&…

【云原生】K8s管理工具--Kubectl詳解(一)

一、陳述式管理 1.1、陳述式資源管理方法 kubernetes 集群管理集群資源的唯一入口是通過相應的方法調用 apiserver 的接口kubectl 是官方的 CLI 命令行工具,用于與 apiserver 進行通信,將用戶在命令行輸入的命令,組織并轉化為apiserver 能識…

Elasticsearch集群和Logstash、Kibana部署

1、 Elasticsearch集群部署 服務器 安裝軟件主機名IP地址系統版本配置ElasticsearchElk10.3.145.14centos7.5.18042核4GElasticsearchEs110.3.145.56centos7.5.18042核3GElasticsearchEs210.3.145.57centos7.5.18042核3G 軟件版本:elasticsearch-7.13.2.tar.gz 示…

ubuntu18 安裝python3.8

在Ubuntu 18.04上安裝Python 3.8可以通過以下步驟完成: 1.更新包列表和已安裝的包: sudo apt update sudo apt upgrade 2.安裝依賴項: sudo apt install -y software-properties-common 3.添加Python 3.8的PPA(個人包歸檔&am…

【Docker系列】 Docker容器具體信息查詢

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

Python函數進階:四大高階函數、匿名函數、枚舉、拉鏈與遞歸詳解

系列文章目錄 Python數據類型:編程新手的必修課深入探索Python字符串:技巧、方法與實戰Python 函數基礎詳解Python正則表達式詳解:掌握文本匹配的魔法Python文件操作寶典:一步步教你玩轉文件讀寫Python面向對象基礎與魔法方法詳解…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用戶授權管理信息和元數據信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

[力扣題解] 494. 目標和

題目:494. 目標和 思路 01背包 轉換為01背包問題 難點在于看出可以用背包問題解決本題; 題目字面意思是劃分出一堆再減去另一堆,得到的結果想要等于target,設定一堆為正,記為left,另一堆為負&#xff0…

ChatGPT類大模型應用入門了解與使用

一 前言 ChatGPT大眾熱情逐漸褪去,但在后臺技術人的探索還處于熱火朝天狀態。如果我們生活的世界是一杯清水, 那類似ChatGPT的語言大模型技術的橫空出世就如滴入水杯的一滴墨汁,第一滴很顯眼,但實際上是后續墨汁慢慢擴散滲透才是…

Windows11下使用Qt5.14.2編譯QtXlsx驅動詳細步驟

原有&#xff1a;由于系統需要將QTableWidget表格中的數據導出、在Windows下最開始使用Excel.Application組件實現了導出功能&#xff0c;后面將代碼轉換到Ubuntu20.04下進行編譯&#xff0c;發現項目.pro文件中的QT axcontainer和代碼.h文件中的#include <QAxObject>跟…

基于圖鳥UI的資訊名片模版開發與應用

一、引言 在前端技術日新月異的今天&#xff0c;快速、高效、美觀的UI組件庫和模板成為了開發者們關注的焦點。圖鳥UI作為一款集成了基礎布局元素、配色體系、圖標icon和精選組件的UI框架&#xff0c;為前端開發者提供了極大的便利。本文將以圖鳥UI為基礎&#xff0c;探討基于…

接口測試工具有哪些,哪些比較火

接口測試工具可以幫助開發人員和測試人員更高效地進行接口測試&#xff0c;以下是一些常用的接口測試工具&#xff1a; 1. **Postman** Postman 是一款廣受歡迎的接口測試工具&#xff0c;它提供了豐富的功能和直觀的用戶界面&#xff0c;幫助開發人員和測試人員輕松進行 API…

如何讓外網訪問內網服務?

隨著互聯網的快速發展&#xff0c;越來越多的企業和個人需要將內網服務暴露給外網用戶訪問。由于安全和隱私等因素的考慮&#xff0c;直接將內網服務暴露在外網是非常不安全的做法。如何讓外網用戶安全訪問內網服務成為了一個重要的問題。 在這個問題上&#xff0c;天聯公司提供…

golang rune類型解析,與byte,string對比,以及應用

Golang中的rune類型是一個32位的整數類型(int32)&#xff0c;它是用來表示Unicode碼點的。rune類型的值可以是任何合法的Unicode碼點&#xff0c;它通常用來處理字符串中的單個字符。 在Golang中&#xff0c;字符常量使用單引號來表示&#xff0c;例如 a。使用單引號表示的字符…

rust - 使用 cargo-nextest 替代 cargo test

cargo-nextest 是新一代的rust測試程序&#xff0c;能夠極大提升測試性能&#xff0c;可以完全替代 cargo test 命令。 1. 安裝 cargo install cargo-nextest2. 執行測試 project ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs ├── core_utils │ …

K-means聚類模型

目錄 1.定義 2.K-means聚類模型的優點 3.K-means聚類模型的缺點 4.K-means聚類模型的應用場景 5.對K-means聚類模型未來的展望 6.小結 1.定義 什么是 K-means 聚類模型&#xff1f;K-means 聚類模型是一種無監督學習算法&#xff0c;用于將數據劃分為不同的組或簇&#…

Lumines推出RGBL彩色混合LED

Luminus Devices傾心打造了一款嶄新的4合1 RGBL&#xff08;紅綠藍綠石灰&#xff09;LED系列&#xff0c;專為舞臺與建筑照明領域量身打造&#xff0c;滿足對高顯色指數&#xff08;CRI&#xff09;與高輸出顏色混合的苛刻需求。這一創新之舉&#xff0c;無疑是照明技術的一次…

使用HiBurn燒錄鴻蒙.bin文件到Hi3861開發板

鴻蒙官方文檔的“Hi3861開發板第一個示例程序”中描述了——如何使用DevEco Device Tool工具燒錄二進制文件到Hi3861開發板&#xff1b; 本文將介紹如何使用HiBurn工具燒錄鴻蒙的.bin文件到Hi3861開發板。 獲取HiBurn工具 通過鴻蒙官方文檔我們知道DevEco Device Tool是一個V…

SAP--ABAP踩坑日志---日期函數的踩坑-----FIMA_DATE_CREATE

當你需要動態生成日期列的時候,出現了奇怪的BUG怎么辦? 用函數循環循環產生獲取下一個日期,結果出現了5.30 直接到6.1了 …我的5.31呢??? 解決方案:用這個,不要瞎用函數啊! day_col day_col 1.

Mybatis 與 MybatisPlus 打印sql日志配置

Mybatis 與 MybatisPlus 打印sql日志配置 方法一&#xff1a; Mybatis 配置&#xff1a; mybatis:configuration: ### 開啟打印sql配置log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ### 開啟駝峰配置 map-underscore-to-camel-case&#xff1a;trueMyb…