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

GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。

目录

1,问:

1,答:

步骤概述

步骤 1:SPI 初始化

步骤 2:Flash 初始化(可选)

步骤 3:发送读取命令

示例:发送读取数据命令

步骤 4:读取数据

步骤 5:关闭 SPI 或继续操作

完整示例:通过 SPI 读取 Flash 数据

总结

2,问:

2,答:

总体流程

步骤 1:SPI 初始化

SPI 初始化代码:

步骤 2:Flash 写入操作

2.1 写使能命令

2.2 擦除操作

2.3 写数据到 Flash

步骤 3:Flash 读取操作

步骤 4:等待 Flash 准备就绪

总结


提问模型:GPT-4o-mini

提问时间:2024.09.19

1,问:

在STM32的平台下,通过SPI读取Flash的步骤

1,答:

STM32 平台下,通过 SPI 读取外部 Flash 的数据是一个常见的任务,尤其是在需要扩展存储时。通常,外部 Flash 芯片如 W25Qxx 系列使用 SPI 进行通信。下面我们详细讲解在 STM32 中通过 SPI 读取 Flash 数据的步骤。

步骤概述

  1. SPI 初始化:在 STM32 中配置 SPI 外设。
  2. Flash 初始化:如果 Flash 有初始化要求(如退出掉电模式),则在通信前进行初始化。
  3. 发送命令:根据 Flash 的协议,发送读取数据的命令以及要读取的地址。
  4. 读取数据:从 Flash 中读取数据并存入缓冲区。
  5. 关闭 SPI 通信:根据需要可以禁用 SPI 或保持连接。

步骤 1:SPI 初始化

在 STM32 中,使用 HAL 库进行 SPI 的初始化。以下是通过 CubeMX 配置的初始化代码。假设使用 SPI1 接口。

SPI_HandleTypeDef hspi1;void MX_SPI1_Init(void)
{hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER; // 配置为主机模式hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;  // 8位数据帧hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟空闲状态为低电平hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;    // 数据在第一个时钟沿采样hspi1.Init.NSS = SPI_NSS_SOFT;  // 软件控制 NSS 信号hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;  // 根据系统时钟设置合适的分频系数hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;  // 高位在前hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 10;if (HAL_SPI_Init(&hspi1) != HAL_OK){// 初始化失败处理Error_Handler();}
}

步骤 2:Flash 初始化(可选)

有些 Flash 芯片(如 W25Qxx 系列)可能需要在读取数据之前执行某些初始化操作,例如唤醒 Flash 或解锁写保护。可以通过 SPI 发送相关命令完成这些操作。

例如,W25Qxx Flash 的退出掉电模式命令是 0xAB,你可以这样实现:

void Flash_WakeUp(void)
{uint8_t cmd = 0xAB;  // 退出掉电模式的命令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CS 使能 SPIHAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);  // 发送退出掉电命令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS 停止 SPI
}

步骤 3:发送读取命令

外部 Flash 芯片通常会有一个特定的命令用于读取数据,比如 W25Qxx 的读取命令是 0x03读取数据),它需要发送以下内容:

  1. 读取命令:0x03
  2. 读取地址:24 位地址,通常分为三个字节
  3. 数据:从指定地址开始读取的数据
示例:发送读取数据命令
void Flash_ReadData(uint32_t address, uint8_t* buffer, uint16_t length)
{uint8_t cmd[4];// 读取命令 + 地址cmd[0] = 0x03;  // 读取命令cmd[1] = (address >> 16) & 0xFF;  // 地址高字节cmd[2] = (address >> 8) & 0xFF;   // 地址中间字节cmd[3] = address & 0xFF;          // 地址低字节// 拉低 CS 使能 SPIHAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);// 发送读取命令和地址HAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);// 接收数据HAL_SPI_Receive(&hspi1, buffer, length, HAL_MAX_DELAY);// 拉高 CS 停止 SPIHAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
}

步骤 4:读取数据

执行完发送读取命令后,可以使用 HAL_SPI_Receive() 函数从 SPI 读取数据。上面的代码已经展示了如何读取数据到缓冲区中。

步骤 5:关闭 SPI 或继续操作

在读取完数据之后,如果还需要进行其他操作,可以继续使用 SPI 接口。如果不再需要使用 SPI,可以在完成数据通信后禁用相关资源或拉高 CS 信号以结束通信。

完整示例:通过 SPI 读取 Flash 数据

#include "main.h"
#include "spi.h"
#include "gpio.h"SPI_HandleTypeDef hspi1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_Init();// 初始化缓冲区,长度为读取的数据长度uint8_t data_buffer[256];  // 读取 256 字节数据uint32_t read_address = 0x000000;  // 从地址 0x000000 开始读取// 读取 Flash 数据Flash_ReadData(read_address, data_buffer, 256);// 继续处理数据...while (1){}
}// 读取 Flash 的数据函数,具体实现见上文
void Flash_ReadData(uint32_t address, uint8_t* buffer, uint16_t length)
{uint8_t cmd[4];cmd[0] = 0x03;  // 读取命令cmd[1] = (address >> 16) & 0xFF;  // 地址高字节cmd[2] = (address >> 8) & 0xFF;   // 地址中间字节cmd[3] = address & 0xFF;          // 地址低字节HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CS 使能 SPIHAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);  // 发送读取命令和地址HAL_SPI_Receive(&hspi1, buffer, length, HAL_MAX_DELAY);  // 接收数据HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS 停止 SPI
}

总结

通过 SPI 读取外部 Flash 的基本步骤包括:

  1. SPI 初始化:设置 SPI 通信参数,配置 STM32 的 SPI 接口。
  2. Flash 初始化(可选):根据 Flash 芯片的要求,执行初始化操作。
  3. 发送读取命令:根据 Flash 芯片的协议,发送读取命令和地址。
  4. 读取数据:从 Flash 中读取数据并存入缓冲区。
  5. 结束通信:拉高 CS 信号,结束通信。

这个过程非常适合用于 SPI 通信外设,例如 W25Qxx 系列 Flash,STM32 平台下的 SPI 和 HAL 库可以帮助简化这类通信过程。

2,问:

在STM32的平台下,通过SPI读取和写入Flash的步骤

2,答:

STM32 平台上通过 SPI 进行 Flash 的读写操作是常见的应用场景。外部 Flash(如 W25Qxx 系列)通过 SPI 接口与 STM32 通信。以下是完整的步骤,涵盖如何通过 SPI 实现对外部 Flash 的读取和写入操作。

总体流程

  1. SPI 初始化:在 STM32 中配置 SPI 外设。
  2. Flash 写入操作:发送写命令,写入数据到 Flash。
  3. Flash 读取操作:发送读命令,读取数据从 Flash。
  4. 写操作辅助功能:需要对 Flash 进行写使能、擦除等操作,确保写入成功。

步骤 1:SPI 初始化

通过 STM32 的 HAL 库 配置 SPI 外设。在这里假设我们使用 SPI1 接口。

SPI 初始化代码:
SPI_HandleTypeDef hspi1;void MX_SPI1_Init(void)
{hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;  // 设置为主机模式hspi1.Init.Direction = SPI_DIRECTION_2LINES;  // 双向全双工hspi1.Init.DataSize = SPI_DATASIZE_8BIT;  // 8位数据hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;  // 时钟空闲时为低电平hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;  // 在第一个时钟沿采样数据hspi1.Init.NSS = SPI_NSS_SOFT;  // 软件控制NSShspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;  // 设置合适的时钟分频hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;  // 高位先传输hspi1.Init.TIMode = SPI_TIMODE_DISABLE;  // 禁用 TI 模式hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;  // 禁用 CRC 计算hspi1.Init.CRCPolynomial = 7;if (HAL_SPI_Init(&hspi1) != HAL_OK){// SPI 初始化错误处理Error_Handler();}
}

步骤 2:Flash 写入操作

在进行 Flash 的写入操作之前,必须确保满足以下条件:

  • 写使能(Write Enable, WREN):在写入之前,必须启用写功能。
  • 擦除操作(Erase):在某些 Flash 中,写入数据之前需要擦除某一页(或块)。
2.1 写使能命令

在每次写入操作之前,必须发送 WREN 命令以启用写功能。通常这是 0x06 命令。

void Flash_WriteEnable(void)
{uint8_t cmd = 0x06;  // 写使能命令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CSHAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);  // 发送写使能命令HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS
}
2.2 擦除操作

在写入新数据之前,必须将目标 Flash 页(通常是 4KB)或块(32KB 或 64KB)擦除。擦除页命令通常是 0x20,后跟 24 位地址。

void Flash_EraseSector(uint32_t address)
{uint8_t cmd[4];cmd[0] = 0x20;  // 擦除页命令cmd[1] = (address >> 16) & 0xFF;  // 地址高字节cmd[2] = (address >> 8) & 0xFF;   // 地址中字节cmd[3] = address & 0xFF;          // 地址低字节Flash_WriteEnable();  // 使能写操作HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CSHAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);  // 发送擦除命令和地址HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS
}
2.3 写数据到 Flash

写数据命令通常为 0x02,后跟目标地址和数据。每次写入的最大长度受页大小限制,通常是 256 字节。

void Flash_WriteData(uint32_t address, uint8_t* data, uint16_t length)
{uint8_t cmd[4];cmd[0] = 0x02;  // 写数据命令cmd[1] = (address >> 16) & 0xFF;  // 地址高字节cmd[2] = (address >> 8) & 0xFF;   // 地址中字节cmd[3] = address & 0xFF;          // 地址低字节Flash_WriteEnable();  // 使能写操作HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CSHAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);  // 发送写命令和地址HAL_SPI_Transmit(&hspi1, data, length, HAL_MAX_DELAY);  // 发送数据HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS
}

步骤 3:Flash 读取操作

读取 Flash 的过程相对简单,发送读命令 0x03 和目标地址后,读取返回的数据。

void Flash_ReadData(uint32_t address, uint8_t* buffer, uint16_t length)
{uint8_t cmd[4];cmd[0] = 0x03;  // 读数据命令cmd[1] = (address >> 16) & 0xFF;  // 地址高字节cmd[2] = (address >> 8) & 0xFF;   // 地址中字节cmd[3] = address & 0xFF;          // 地址低字节HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CSHAL_SPI_Transmit(&hspi1, cmd, 4, HAL_MAX_DELAY);  // 发送读取命令和地址HAL_SPI_Receive(&hspi1, buffer, length, HAL_MAX_DELAY);  // 接收数据HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CS
}

步骤 4:等待 Flash 准备就绪

在进行写操作(如写入数据或擦除扇区)后,Flash 通常需要一些时间来完成操作。在此期间,不能立即进行下一次操作。我们可以通过读取 状态寄存器 来等待 Flash 准备就绪。

uint8_t Flash_ReadStatusRegister(void)
{uint8_t cmd = 0x05;  // 读取状态寄存器命令uint8_t status = 0;HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);  // 拉低 CSHAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY);  // 发送读取状态寄存器命令HAL_SPI_Receive(&hspi1, &status, 1, HAL_MAX_DELAY);  // 接收状态寄存器HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);  // 拉高 CSreturn status;
}void Flash_WaitForReady(void)
{while (Flash_ReadStatusRegister() & 0x01)  // 检查 BUSY 位{HAL_Delay(1);  // 间隔 1ms 查询}
}

完整示例:写入和读取 Flash 数据

#include "main.h"
#include "spi.h"
#include "gpio.h"SPI_HandleTypeDef hspi1;void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_Init();// 要写入的数据和读取缓冲区uint8_t write_data[256] = {0xAA, 0xBB, 0xCC, 0xDD};  // 示例数据uint8_t read_buffer[256] = {0};uint32_t address = 0x000000;  // 从 Flash 的起始地址开始// 擦除扇区Flash_EraseSector(address);Flash_WaitForReady();  // 等待擦除完成// 写入数据Flash_WriteData(address, write_data, sizeof(write_data));Flash_WaitForReady();  // 等待写入完成// 读取数据Flash_ReadData(address, read_buffer, sizeof(read_buffer));while (1){}
}// Flash 写入和读取函数的具体实现见上文

总结

通过 SPI 读写外部 Flash 的步骤包括:

  1. SPI 初始化:配置 SPI 外设,设置通信参数。
  2. 写操作
    • 使能写操作。
    • 擦除 Flash 页/扇区。
    • 写入数据到指定地址。
  3. 读操作:发送读命令并从指定地址读取数据。
  4. 等待 Flash 就绪:在写入和擦除操作后,等待 Flash 准备好再进行下一步操作。

这个过程适用于多种 SPI Flash 器件,比如 W25Qxx 系列。通过 HAL 库可以简化 SPI 通信的实现,提供更高效的嵌入式开发体验。

相关文章:

GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。

目录 1,问: 1,答: 步骤概述 步骤 1:SPI 初始化 步骤 2:Flash 初始化(可选) 步骤 3:发送读取命令 示例:发送读取数据命令 步骤 4:读取数据…...

Pytorch基本知识

model.state_dict()、model.parameters()和model.named_parameters()的区别 parameters()只包含模块的参数,即weight和bias(包括BN的)。 named_parameters()返回包含模块名和模块的参数的列表,列表的每个元素均是包含layer name和layer param的元组。layer param就是param…...

vue3使用Teleport 控制台报警告:Invalid Teleport target on mount: null (object)

Failed to locate Teleport target with selector “.demon”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree main.…...

使用产品前的环境搭建

对于想学习编程的朋友们,使用本产品解决日常功能需求的同时会对自己编程能力具有较大帮助和提升。 目录 环境搭建 前言: 安装python 安装vscode 下载安装Anaconda 通过conda配置python环境 创建虚拟环境 查看环境是否创建成功 激活环境 安装pyt…...

JAVA基础语法 day07

一、final关键字 1.1final的基础知识 用来修饰类,方法,变量 final修饰类,该类被称为终极类,不能被继承了 final修饰方法,该方法称为终极方法,不能被重写了 final修饰变量,该变量仅能被赋值…...

ZLMediaKit编译运行

ZLMediaKit-github官网 快速开始 代码依赖与版权声明 MediaServer支持的HTTP MediaServer支持的HTTP HOOK API cd ZLMediaKit mkdir build cd build cmake … && make -j20 cd ZLMediaKit/release/linux/Debug ./MediaServer //./MediaServer -h 查看 //./MediaSe…...

AlmaLinux 9 安装mysql8.0.38

文件下载 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar 选择合适系统版本 下载后解压 tar -xvf mysql-8.0.39-linux-glibc2.12-x86_64.tar解压后里面有三个文件夹 使用mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz即可&#xff0c…...

NLP任务之文本分类(情感分析)

目录 1 加载预训练模型对应的分词器 2 加载数据集 3 数据预处理 4 构建数据加载器DataLoader 5 定义下游任务模型 6 测试代码 7 训练代码 #做(中文与英文的)分类任务,Bert模型比较合适,用cls向下游任务传输数…...

MIMO 2T4R BBU RHUB AAU

MIMO(Multiple-Input Multiple-Output,多输入多输出)是一种无线通信技术,它通过在发射端和接收端使用多个天线来提高数据传输速率和信号质量。"2T4R"是MIMO技术中的一种配置,其中"2T"代表有两个发…...

图说数集相等定义表明“R各元x的对应x+0.0001的全体=R“是几百年重大错误

黄小宁 设集A{x}表A各元均由x代表,{x}中变量x的变域是A。其余类推。因各数x可是数轴上点的坐标故x∈R变为实数yx1的几何意义可是:一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)沿“管道”g平移变为点y…...

只出现一次的数字|||(考察点为位操作符)

目录 一题目: 二思路汇总: 三代码解答: 一题目: leetcode原题链接:. - 力扣(LeetCode) 二思路汇总: 思路:如果直接对数组按位异或,那么最后得到的是a^b&a…...

PMP--三模--解题--81-90

文章目录 13.干系人管理--权力利益方格--基于干系人的职权级别(权力)、对项目成果的关心程度(利益)、对项目成果的影响能力(影响),或改变项目计划或执行的能力,每一种方格都可用于对…...

脚本自动化创建AWS EC2实例+安装ElasticSearch和Kibana+集成OpenTelemetry监控

文章目录 为什么要通过脚本来部署服务器?EC2实例类型硬件选择实例类型的选择内存CPU存储架构操作系统最终的选择 其他配置安全组配置网络配置IAM RoleKey Pair内部域名 书写自动化脚本属性文件EBS配置文件创建EC2实例命令user data 文件OpenTelemetry监控 创建内部域…...

【设计模式-命令】

定义 命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使您能够使用不同的请求、排队请求或记录请求,并支持可撤销的操作。该模式通过将请求与其执行分离,使得请求者和接收者之间…...

【API安全】crAPI靶场全解

目录 BOLA Vulnerabilities Challenge 1 - Access details of another user’s vehicle Challenge 2 - Access mechanic reports of other users Broken User Authentication Challenge 3 - Reset the password of a different user Excessive Data Exposure Challenge …...

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案:A 分析:文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能: 文档检测:能够…...

【Python报错已解决】TypeError: ‘int‘ object is not subscriptable

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

《OpenCV》—— 指纹验证

用两张指纹图片中的其中一张对其验证 完整代码 import cv2def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)def verification(src, model):sift cv2.SIFT_create()kp1, des1 sift.detectAndCompute(src, None)kp2, des2 sift.detectAndCompute(model, None)fl…...

HBase 性能优化的高频面试题及答案

目录 高频面试题及答案1. 如何通过数据建模优化 HBase 性能?2. 如何优化 HBase 的写入性能?3. 如何通过压缩优化 HBase 的存储性能?4. 如何通过调整 RegionServer 配置优化性能?5. 如何优化 HBase 的读取性能?6. 如何通过使用 HBase 的版本控制优化性能?7. 如何通过使用合…...

excel不经过后台实现解析和预览(vue)

数据流读取和数据解析方面通过xlsx组件 安装命令 npm install xlsx -S 它先将上传的excel变成流,然后再根据流进行下一步处理。这个流可以交给其他组件处理比如我用的预览组件是用了其他组件(vue-office/excel)就是把这个流交给其它组件就…...

html5 + css3(上)

目录 HTML认知web标准vscode的简介和使用注释标题和段落换行和水平线标签文本格式化标签图片图片-基本使用图片-属性 绝对路径相对路径音频标签视频标签超链接 HTML基础列表列表-无序和有序列表-自定义 表格表格-使用表格-表格标题和表头单元格表格-结构标签(了解&a…...

Flask+微信小程序实现Login+Profile

Python代码 首先flask的session用不了,只能用全局变量来实现。 import pymysql from flask import Flask, request, jsonify, session from flask_cors import CORS from flask import make_responseapp Flask(__name__) CORS(app, supports_credentialsTrue) #…...

后缀表达式中缀表达式转后缀表达式

后缀表达式的计算机求值 计算规则 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入…...

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中,我们制作了AB分区系统镜像,并成功通过uboot加载kernel以及d…...

两数相加leetcode

第一个是测试用例代码&#xff0c;测试的是两个带头的逆序链表相加&#xff0c;并且有反转操作 但是题目要求的是不带头链表直接相加&#xff0c;不需要逆转&#xff0c;输出结果也是逆序的&#xff0c; 题解放在第二个代码中 #include<stdio.h> #include<stdlib.h…...

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后&#xff0c;在运行程序启动界面时&#xff0c;发现设置的样式无效&#xff0c;效果如下&#xff1a; /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* …...

AI 对话工具汇总

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: 前言: 在科技飞速发展的时代&#xff0c;AI 对话正逐渐成为我们获取信息、交流思想的新方式。它以强…...

面试题05.08绘制直线问题详解(考察点为位运算符)

目录 一题目&#xff1a; 二详细思路汇总&#xff1a; 三代码解答&#xff08;带注释版&#xff09;&#xff1a; 一题目&#xff1a; leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二详细思路汇总&#xff1a; 这里先剧透一下简单版思路哦&…...

埃及 Explained

古埃及&#xff0c;位于尼罗河畔的神秘文明&#xff0c;曾在北非的荒漠中繁荣昌盛。这个充满谜团的王国凭借其宏伟的成就和神秘的文化&#xff0c;数百年来吸引了无数人的好奇心。 埃及人创造了复杂的象形文字&#xff0c;建造了像吉萨大金字塔这样宏伟的建筑&#xff0c;并通…...

【Linux】第一个小程序——进度条实现

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

网架钢构公司/seo的作用有哪些

项目地址&#xff1a;RedPackage简介&#xff1a;发布应用市场的 android 平台抢红包工具《红包精灵》开源啦&#xff0c;实现自动抢&#xff0c;快人一步&#xff0c;抢到手软。关键 Service 代码&#xff1a; 注&#xff1a;此前在 15 年 12 月时&#xff0c;用的 Eclipse 开…...

wordpress 空间商/app联盟推广平台

CRM客户关系管理系统源码 crm小程序源码 基于springbootvue MySQL数据库开发的客户关系管理系统。 客户全流程高效管理&#xff0c;客户资料管理&#xff0c;客户跟踪管理&#xff0c;订单、合同管理&#xff0c;回款及交付管理等功能。 功能介绍 1、系统管理&#xff1a;员工…...

网站建站基础/山东服务好的seo

https://blog.csdn.net/u013938465/article/details/53507109...

企业网站建站技术/谷歌浏览器下载手机版

加载是类加载过程的第一个阶段&#xff08;需要区分类加载与加载&#xff09;.在加载阶段&#xff0c;虚拟机主要完成3件事 ——通过一个类的全限定名获取此类的二进制字节流——将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构——在内存中生成一个代表这个类…...

怎么通过做网站赚钱/seo搜索引擎优化关键词

L2-016. 愿天下有情人都是失散多年的兄妹 时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越呵呵。大家都知道五服以内不得通婚&#xff0c;即两个人最近的共同祖先如果在五代以内&#xff08;即本人、父母、祖父母、曾祖父母、高祖父母&#xff09;则…...

网站报价模板/打开百度

为什么80%的码农都做不了架构师&#xff1f;>>> 过滤选择器主要是通过特定的过滤规则来筛选出所需的DOM元素&#xff0c;过滤规则与CSS中的伪类选择器语法相同&#xff0c;及选择器都以一个冒号(:)开头。按照不同的过滤规则&#xff0c;过滤选择器可以分为基本过滤…...