有没有做翻译赚钱的网站什么是网站黑链

张小明 2026/1/11 12:30:50
有没有做翻译赚钱的网站,什么是网站黑链,科技网站建设+长沙,jpress和wordpress哪个好前言#xff1a;在前面的文章中#xff0c;我们已经系统介绍了 SPI 通信原理 以及 W25Q64 的存储结构和操作特性。 本篇文章将进入实战阶段#xff0c;基于 STM32F103C8T6#xff0c;通过 软件 SPI#xff08;GPIO 模拟 SPI#xff09; 的方式#xff0c;实现对 W25Q64 …前言在前面的文章中我们已经系统介绍了SPI 通信原理以及W25Q64 的存储结构和操作特性。本篇文章将进入实战阶段基于STM32F103C8T6通过软件 SPIGPIO 模拟 SPI的方式实现对W25Q64 外部 Flash 的初始化、ID 读取、扇区擦除、页写入和数据读取并通过 OLED 显示结果进行验证。目录一、接线图二、硬件连接说明三、软件 SPI 分层设计思想四、软件 SPI 底层实现五、W25Q64 指令宏定义六、W25Q64 驱动实现七、主函数测试与实验现象八、总结一、接线图二、硬件连接说明本实验使用 STM32F103C8T6 与 W25Q64 通过 SPI 方式连接引脚定义如下W25Q64STM32CSPA4SCKPA5MISOPA6MOSIPA7VCC3.3VGNDGNDSPI 工作模式Mode 0CPOL 0CPHA 0三、软件 SPI 分层设计思想为了让代码结构清晰本工程将软件 SPI 分为两层1.引脚配置层GPIO 操作只关心SS / SCK / MOSI / MISO提供“写引脚 / 读引脚”的接口2. 协议层SPI 时序基于引脚操作实现SPI 起始 / 终止字节交换8 位时序W25Q64 驱动层完全不关心 GPIO 细节只调用 SPI 接口结构非常清晰。四、软件 SPI 底层实现1. SPI 引脚操作函数#include stm32f10x.h // Device header /*引脚配置层*/ void MySPI_W_SS(uint8_t BitValue) { GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); } void MySPI_W_SCK(uint8_t BitValue) { GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); } void MySPI_W_MOSI(uint8_t BitValue) { GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)BitValue); } uint8_t MySPI_R_MISO(void) { return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6); }2. SPI GPIO 初始化void MySPI_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_Init(GPIOA, GPIO_InitStructure); MySPI_W_SS(1); // CS 默认拉高 MySPI_W_SCK(0); // SPI Mode0SCK 空闲为低 }3. SPI 起始 / 终止void MySPI_Start(void) { MySPI_W_SS(0); } void MySPI_Stop(void) { MySPI_W_SS(1); }4. SPI 字节交换Mode 0uint8_t MySPI_SwapByte(uint8_t ByteSend) { uint8_t i, ByteReceive 0x00; for (i 0; i 8; i) { MySPI_W_MOSI(ByteSend (0x80 i)); MySPI_W_SCK(1); if (MySPI_R_MISO()) { ByteReceive | (0x80 i); } MySPI_W_SCK(0); } return ByteReceive; }说明上升沿发送数据上升沿采样 MISO完全符合 SPI Mode 0 时序五、W25Q64 指令宏定义#ifndef __W25Q64_INS_H #define __W25Q64_INS_H #define W25Q64_WRITE_ENABLE 0x06 #define W25Q64_READ_STATUS_REGISTER_1 0x05 #define W25Q64_PAGE_PROGRAM 0x02 #define W25Q64_SECTOR_ERASE_4KB 0x20 #define W25Q64_READ_DATA 0x03 #define W25Q64_JEDEC_ID 0x9F #define W25Q64_DUMMY_BYTE 0xFF #endif六、W25Q64 驱动实现1. 初始化void W25Q64_Init(void) { MySPI_Init(); }2. 读取芯片 ID验证通信是否成功void W25Q64_ReadID(uint8_t *MID, uint16_t *DID) { MySPI_Start(); MySPI_SwapByte(W25Q64_JEDEC_ID); *MID MySPI_SwapByte(W25Q64_DUMMY_BYTE); *DID MySPI_SwapByte(W25Q64_DUMMY_BYTE); *DID 8; *DID | MySPI_SwapByte(W25Q64_DUMMY_BYTE); MySPI_Stop(); }3. 写使能与忙等待void W25Q64_WriteEnable(void) { MySPI_Start(); MySPI_SwapByte(W25Q64_WRITE_ENABLE); MySPI_Stop(); } void W25Q64_WaitBusy(void) { uint32_t Timeout 100000; MySPI_Start(); MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1); while (MySPI_SwapByte(W25Q64_DUMMY_BYTE) 0x01) { if (--Timeout 0) break; } MySPI_Stop(); }4. 扇区擦除4KBvoid W25Q64_SectorErase(uint32_t Address) { W25Q64_WriteEnable(); MySPI_Start(); MySPI_SwapByte(W25Q64_SECTOR_ERASE_4KB); MySPI_SwapByte(Address 16); MySPI_SwapByte(Address 8); MySPI_SwapByte(Address); MySPI_Stop(); W25Q64_WaitBusy(); }5. 页写入不跨页void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count) { uint16_t i; W25Q64_WriteEnable(); MySPI_Start(); MySPI_SwapByte(W25Q64_PAGE_PROGRAM); MySPI_SwapByte(Address 16); MySPI_SwapByte(Address 8); MySPI_SwapByte(Address); for (i 0; i Count; i) { MySPI_SwapByte(DataArray[i]); } MySPI_Stop(); W25Q64_WaitBusy(); }6. 数据读取void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count) { uint32_t i; MySPI_Start(); MySPI_SwapByte(W25Q64_READ_DATA); MySPI_SwapByte(Address 16); MySPI_SwapByte(Address 8); MySPI_SwapByte(Address); for (i 0; i Count; i) { DataArray[i] MySPI_SwapByte(W25Q64_DUMMY_BYTE); } MySPI_Stop(); }七、主函数测试与实验现象uint8_t ArrayWrite[] {0x01, 0x02, 0x03, 0x04}; uint8_t ArrayRead[4]; int main(void) { OLED_Init(); W25Q64_Init(); W25Q64_ReadID(MID, DID); W25Q64_SectorErase(0x000000); W25Q64_PageProgram(0x000000, ArrayWrite, 4); W25Q64_ReadData(0x000000, ArrayRead, 4); while (1) {} }实验现象OLED 正确显示 MID / DID写入数组与读取数组完全一致说明软件 SPI W25Q64 读写擦除功能完全正常八、总结通过本实验我们完整实现了软件 SPI 的 GPIO 模拟W25Q64 的 ID 读取扇区擦除、页写入、数据读取STM32 与外部 Flash 的稳定通信
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

企业宣传册免费模板网站法学院网站建设建议

LUT调色包下载网站运营启示:结合Linly-Talker做AI内容营销 在数字内容创作门槛不断降低的今天,视频后期处理已成为创作者日常流程中不可或缺的一环。而LUT(Look-Up Table)调色预设,作为提升画面质感的“快捷键”&#…

张小明 2026/1/9 17:40:59 网站建设

泰州网站设计农家乐网站免费模板

未来三年,企业增长的核心命题已经悄然改变。过去,我们追逐流量、粉丝、曝光;但今天,我们越来越清晰地看到:真正决定企业生死的,不再是涨粉,而是你是否拥有自己的智能体。AI不再只是一种工具&…

张小明 2026/1/9 16:53:01 网站建设

个人网站建设制作深圳手机商城网站设计电话

RAG(检索增强生成)是一种结合信息检索与生成式AI的框架,通过外部知识库增强大模型回答能力。核心流程包括知识准备(数据预处理、分块、向量化、入库)和问答阶段(查询处理、检索、信息整合、生成&#xff09…

张小明 2026/1/8 22:31:28 网站建设

美工做网站尺寸多少钱seo精准培训课程

联想拯救者终极性能调优指南:3步解锁BIOS隐藏功能 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh_mirrors/le/LE…

张小明 2026/1/7 18:14:06 网站建设

建设银行官方网站手机版下载做网站的任务书

CANopenNode终极指南:嵌入式CAN总线协议栈快速部署实战 【免费下载链接】CANopenNode CANopen protocol stack 项目地址: https://gitcode.com/gh_mirrors/ca/CANopenNode CANopen协议栈作为工业自动化领域的关键技术,CANopenNode以其开源免费的特…

张小明 2026/1/7 19:11:47 网站建设

做足球推荐网站能赚钱吗网络销售代理加盟

AgileBoot全栈开发脚手架:企业级项目的终极解决方案 【免费下载链接】AgileBoot-Back-End 🔥 规范易于二开的全栈基础快速开发脚手架。🔥 采用Springboot Vue 3 Typescript Mybatis Plus Redis 更面向对象的业务建模 面向生产的项目&am…

张小明 2026/1/7 19:23:34 网站建设