当前位置: 首页 > news >正文

基于RTThread的学习(三):正点原子潘多拉 QSPI 通信 W25Q128 实验

1、基于芯片创建工程

2、QSPI配置

2.1、RTThing_setting 设置组件

2.2、配置board.h 文件

2.3、cubemx生成QSPI的硬件初始化代码;HAL_QSPI_MapInit;

这里注意:你所买的开发板对应的qspi 连接的是否是cubemx 上边显示的,如果不是你需要将引脚复用为你的开发板上原理图的引脚;

比如:正点原子潘多拉 stm32l475vet6的原理图

我们就需要找到运力图的引脚将其复用;

将QSPI使能之后保存工程,并生成代码;

然后打开RTThread Studio 刷新工程后找到 cubx 目录下生成的代码,打开stm32l4xx_hal_map.c文件,将 HAL_QSPI_MapInit() 和HAL_QSPI_DeMapInit()这两个函数复制到 board.c 即可;

这两个函数是HAL 库中的弱回调函数,drv_qspi.c 函数会调用这两个函数;如果想了解具体的流程

可以了解一下hal 库的弱回调函数;

2.4、配置stm32l4_hal_conf.h

加入#define HAL_QSPI_MODULE_ENABLED,(这个在配置第一步后好像自动生成了宏定义,但是官方还是给了第四部的操作;)

2.5重新启动程序

这里cubemx 目录下会提示报错,右键将其排除构建即可;

3、W25Q128测试应用程序编写;

在application 下新建test_w25q128.c 文件;

3.1、挂载与初始化SPI设备;

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-04-07     29232       the first version*/#include  <rtthread.h>
#include  <rtdevice.h>
#include  <board.h>#define QSPI_BUS_NAME    "qspi1"
#define QSPI_DEVICE_NAME  "qspi10"
#define W25Q_FLASH_NAME   "W25Q128FV"
#define QSPI_CS_PIN      GET_PIN(E,11)static int rt_hw_qspi_flash_with_sfud_init(void)
{stm32_qspi_bus_attach_device(QSPI_BUS_NAME , QSPI_DEVICE_NAME, (uint32_t)GET_PIN(E,11), 4,RT_NULL, RT_NULL);/* init w25q128 */if (RT_NULL == rt_sfud_flash_probe(W25Q_FLASH_NAME, QSPI_DEVICE_NAME)){rt_kprintf("init_failed\n");return -RT_ERROR;}return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_with_sfud_init);

启动代码 查看是否挂载 初始化成功;

3.3、查看ID

新建 sample_qspi.c

编写以下代码:

/** Copyright (c) 2006-2022, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-08-15     misonyo      first implementation.*/
/** 程序清单:这是一个 QSPI 设备使用例程* 例程导出了 spi_w25q_sample 命令到控制终端* 命令调用格式:spi_w25q_sample spi10* 命令解释:命令第二个参数是要使用的SPI设备名称,为空则使用默认的SPI设备* 程序功能:通过SPI设备读取 w25q 的 ID 数据
*/#include <rtthread.h>
#include <rtdevice.h>#define W25Q_SPI_DEVICE_NAME     "qspi10"static void spi_w25q_sample(int argc, char *argv[])
{struct rt_spi_device *spi_dev_w25q;char name[RT_NAME_MAX];rt_uint8_t w25x_read_id = 0x90;rt_uint8_t id[5] = {0};if (argc == 2){rt_strncpy(name, argv[1], RT_NAME_MAX);}else{rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX);}/* 查找 spi 设备获取设备句柄 */spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);if (!spi_dev_w25q){rt_kprintf("spi sample run failed! can't find %s device!\n", name);}else{/* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */rt_qspi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]);/* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */struct rt_spi_message msg1, msg2;msg1.send_buf   = &w25x_read_id;msg1.recv_buf   = RT_NULL;msg1.length     = 1;msg1.cs_take    = 1;msg1.cs_release = 0;msg1.next       = &msg2;msg2.send_buf   = RT_NULL;msg2.recv_buf   = id;msg2.length     = 5;msg2.cs_take    = 0;msg2.cs_release = 1;msg2.next       = RT_NULL;rt_qspi_transfer_message(spi_dev_w25q, &msg1);rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]);}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample);

这里需要注意 如果你是使用的QSPI的主设备,函数要使用QSPI的接口读写函数,不能使用SPI的读写函数,否则回报 read data error;

相关文章:

基于RTThread的学习(三):正点原子潘多拉 QSPI 通信 W25Q128 实验

1、基于芯片创建工程 2、QSPI配置 2.1、RTThing_setting 设置组件 2.2、配置board.h 文件 2.3、cubemx生成QSPI的硬件初始化代码&#xff1b;HAL_QSPI_MapInit; 这里注意&#xff1a;你所买的开发板对应的qspi 连接的是否是cubemx 上边显示的&#xff0c;如果不是你需要将引脚…...

Mac反编译APK

文章目录 第一种方式: brew installapktool 使用说明dex2jar 使用说明 第二种方式: 下载安装包apktool 使用说明 (根据官方介绍没有操作成功,后续成功再更新这里)dex2jar 使用说明 安装 JD-GUI 查看jar包中的class文件JD-GUI 使用说明 第一种方式: brew install 安装过程可能很…...

Java数据结构-队列

目录 1. 队列概念2. 模拟实现队列2.1 链式队列2.2 循环队列 3. 双端队列4. 队列的应用4.1 用队列实现栈4.2 用栈实现队列 1. 队列概念 队列是一种只能在一端进行插入数据操作&#xff0c;另一端进行删除数据操作的数据结构&#xff0c;插入数据的叫队尾&#xff0c;删除数据的…...

JVM专题——类文件结构

本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/class-file-structure.html &#x1f680; 基础&#xff08;上&#xff09; → &#x1f680; 基础&#xff08;中&#xff09; → &#x1f680;基础&#xff08;下&am…...

零基础10 天入门 Web3之第2天

10 天入门 Web3之第2天Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 一、这是第二…...

Vue和FastAPI实现前后端分离

前言 近期接触了一些开源大模型应用服务&#xff0c;发现很多用的都是FastAPI web框架&#xff0c;于是乎研究了一下它的优势&#xff0c;印象最深有两个&#xff1a;一个是它的异步处理性能比较好&#xff0c;二是它可以类似java swagger的API交互文档&#xff0c;这个对应前…...

34470A是德科技34470A数字万用表

181/2461/8938产品概述&#xff1a; Truevolt数字万用表&#xff08;34460A、34461A、34465A、34470A&#xff09;利用是德科技的新专利技术&#xff0c;使您能够快速获得见解、测量低功耗设备并保持校准的测量结果。Truevolt提供全方位的测量能力&#xff0c;具有更高的精度、…...

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…...

c语言多媒体文件管理及检索系统220

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 选题 程序设计题1&#xff1a;基于数据分析的小区电量扩容推荐程序 程序设计题2&#xff1a;神气的盒子 程序设计题3&#xff1a;多媒体文件管理及检索系统 程序设计题4&#xff1a; 计算24点游戏 程序设计题…...

链表之双向链表的实现

铁汁们大家好&#xff0c;我们上一篇博客学习了单链表&#xff0c;这节课让我们继续往深学习&#xff0c;学习一下双线链表&#xff0c;话不多说&#xff0c;我们开始吧&#xff01; 目录 1.双向链表 2.顺序表和链表的优缺点 3.双向链表的实现 1.双向链表 1.我们要实现的双线…...

小白学大模型:什么是生成式人工智能?

什么是生成式人工智能&#xff1f; 在过去几年中&#xff0c;机器学习领域取得了迅猛进步&#xff0c;创造了人工智能的一个新的子领域&#xff1a;生成式人工智能。这些程序通过分析大量的数字化材料产生新颖的文本、图像、音乐和软件&#xff0c;我将这些程序简称为“GAIs”…...

并发编程01-深入理解Java并发/线程等待/通知机制

为什么我们要学习并发编程&#xff1f; 最直白的原因&#xff0c;因为面试需要&#xff0c;我们来看看美团和阿里对 Java 岗位的 JD&#xff1a; 从上面两大互联网公司的招聘需求可以看到&#xff0c; 大厂的 Java 岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c; 并…...

3.类与对象(中篇)介绍了类的6个默认构造函数,列举了相关案例,实现了一个日期类

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会…...

Vue实现手机APP页面的切换,如何使用Vue Router进行路由管理呢?

在Vue中&#xff0c;实现手机APP页面的切换&#xff0c;通常会使用Vue Router进行路由管理。Vue Router是Vue.js官方的路由管理器&#xff0c;它和Vue.js深度集成&#xff0c;使构建单页面应用变得易如反掌。 以下是一个简单的步骤说明&#xff0c;展示如何使用Vue Router实现…...

软考--软件设计师(软件工程总结2)

目录 1.测试方法 2.软件项目管理 3.软件容错技术 4.软件复杂性度量 5.结构化分析方法&#xff08;一种面向数据流的开发方法&#xff09; 6.数据流图 1.测试方法 软件测试&#xff1a;静态测试&#xff08;被测程序采用人工检测&#xff0c;计算机辅助静态分析的手段&…...

渗透测试之SSRF漏洞

一、SSRF介绍 SSRF&#xff08;Cross-site Scripting&#xff0c;简称XSS&#xff09;是一种安全漏洞&#xff0c;它允许攻击者通过构造特定的请求&#xff0c;使服务器发起对外网无法访问的内部系统请求。这种漏洞通常发生在服务端提供了从其他服务器应用获取数据的功能&#…...

【C++】1957. 求三个数的平均数

问题&#xff1a;1957. 求三个数的平均数 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 小雅刚刚考完语文、数学、英语的三门期中考试&#xff0c;她想请你编个程序来帮她算算她的平均分。 要求输入三个正整数&#xff0c;分别表示三科考试的分数&#xff0c;输…...

GPU部署ChatGLM3

首先&#xff0c;检查一下自己的电脑有没有CUDA环境&#xff0c;没有的话&#xff0c;去安装一个。我的电脑是4060显卡&#xff0c;买回来就自带这些环境了。没有显卡的话&#xff0c;也不要紧&#xff0c;这个懒人安装包支持CPU运行&#xff0c;会自动识别没有GPU&#xff0c;…...

Windows远程执行

Windows远程执行 前言 1、在办公环境中&#xff0c;利用系统本身的远程服务进行远程代码执行甚至内网穿透横向移动的安全事件是非常可怕的&#xff0c;因此系统本身的一些远程服务在没有必要的情况下建议关闭&#xff0c;防止意外发生&#xff1b; 2、作为安全人员&#xff0…...

AJAX —— 学习(一)

目录 一、原生 AJAX &#xff08;一&#xff09;AJAX 介绍 1.理解 2.作用 3.最大的优势 4.应用例子 &#xff08;二&#xff09;XML 介绍 1.理解 2.作用 &#xff08;三&#xff09;AJAX 的特点 1.优点 2.缺点 二、HTTP 协议 &#xff08;一&#xff09;HTTP 介…...

Activity——idea(2020以后)配置actiBPM

文章目录 前言jar下载idea 安装本地扩展插件 前言 2020及之后版本的idea中&#xff0c;未维护对应的actiBPM扩展插件。如果需要安装该插件&#xff0c;则需要使用本地导入 jar的方式。 jar下载 访问官方网站&#xff0c;搜索对应的actiBPM扩展插件。 https://plugins.jetbra…...

MyBatis——配置优化和分页插件

MyBatis配置优化 MyBatis配置文件的元素结构如下&#xff1a; configuration&#xff08;配置&#xff09; properties&#xff08;属性&#xff09; settings&#xff08;设置&#xff09; typeAliases&#xff08;类型别名&#xff09; plugins&#xff08;插件&#xff09…...

[蓝桥杯 2013 省 B] 翻硬币

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…...

[BT]BUUCTF刷题第13天(4.1)

第13天 Upload-Labs-Linux (Basic) Pass-01 根据题目提示&#xff0c;该题为绕过js验证。 一句话木马&#xff1a; <?php eval(system($_POST["cmd"]));?> // 符号 表示后面的语句即使执行错误&#xff0c;也不报错。 // eval() 把括号内的字符串全部…...

特别详细的Spring Cloud 系列教程1:服务注册中心Eureka的启动

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…...

Day108:代码审计-PHP模型开发篇MVC层动态调试未授权脆弱鉴权未引用错误逻辑

目录 案例1-Xhcms-动态调试-脆弱的鉴权逻辑 案例2-Cwcms-动态调试-未引用鉴权逻辑 案例3-Bosscms-动态调试-不严谨的鉴权逻辑 知识点&#xff1a; 1、PHP审计-动态调试-未授权安全 2、PHP审计-文件对比-未授权安全 3、PHP审计-未授权访问-三种形态 动态调试优点: 环境配置&…...

重读Java设计模式: 桥接模式详解

引言 在软件开发中&#xff0c;经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时&#xff0c;使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题&#xff0c;我们可以使用桥接模式。桥接模式是一种结构型设计模式&#…...

新规解读 | 被网信办豁免数据出境申报义务的企业,还需要做什么?

为了促进数据依法有序自由流动&#xff0c;激发数据要素价值&#xff0c;扩大高水平对外开放&#xff0c;《促进和规范数据跨境流动规定》&#xff08;以下简称《规定》&#xff09;对数据出境安全评估、个人信息出境标准合同、个人信息保护认证等数据出境制度作出优化调整。 …...

fakebook-攻防世界

题目 先目录扫描一下 dirseach 打开flag.php是空白的 访问robots.txt,访问user.php.bak <?php class UserInfo { public $name ""; public $age 0; public $blog ""; public function __construct($name, $age, $blog) { …...

mynet开源库

1.介绍 个人实现的c开源网络库&#xff0e; 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列&#xff0c;延迟分发队列 内部event服务于通知机制的优先级为0&#xff0c;外部event优先级为1&#xff0e; 当集中处理分发的event_callback时&#xff0c…...

展厅设计手绘图/seo网站推广企业

我们为什么要学习数据库&#xff1f; 最主要的就是两点&#xff1a;能够反作用于业务和快速分析定位问题 在软件开发中会遇到很多问题&#xff0c;追根究底它就是一个数据库里数据的问题&#xff0c;就比如说我们要去验证注册来源对不对&#xff0c;如果我们不去查库的话&…...

wordpress获取权限/怎么申请网站空间

PostgreSQL 数据库操作简要说明 PostgreSQL数据库版本 psql --versionpsql (PostgreSQL) 9.1.3 一、数据库备份 1、备份数据库结构首页 → 数据库技术背景&#xff1a;阅读新闻PostgreSQL 数据库导入导出操作[日期&#xff1a;2012-06-08]来源&#xff1a;Linux社区作者&#x…...

大连网站快速排名提升/郑州企业网站seo

这里使用了基本方法try{}catch()处理异常 package cn.Exception;public class Exception {public static void main(String[] args) {//ArithmeticException分母不能为0try {System.out.println(1 / 0);} catch (java.lang.Exception e) {//输出异常e.printStackTrace();Syste…...

衡水做网站找谁/网站运营工作内容

Vue 确实提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动&#xff1a;watch 属性。当你有一些数据需要随着其它数据变动而变动时&#xff0c;你很容易滥用 watch ——特别是如果你之前使用过 AngularJS。然而&#xff0c;通常更好的想法是使用 computed 属性而不是命…...

天然气公司的网站应该怎么做/优化网哪个牌子好

2016-11-17 微信小程序实例源码大全下载 微信小应用示例代码(phodal/weapp-quick)源码链接&#xff1a;https://github.com/phodal/weapp-quick微信小应用地图定位demo(giscafer/wechat-weapp-mapdemo)源码链接&#xff1a;https://github.com/giscafer/wechat-weapp-mapdemo微…...

wordpress debug.log/seo整站优化报价

目录 0、前言 1、在PyCharm的External Tools中配置QtDesigner 2、在PyCharm的External Tools中配置Pyuic 3、在PyCharm的External Tools中配置pyrcc 4、在主页面中调出External Tools中的QtDesigner、pyuic、pyrcc 5、将ui文件转化成py文件 6、将qrc文件转化成py文件 0、…...