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

【随手笔记】FLASH-W25Q16(三)

#include "bsp_w25q16.h"/*内部函数声明区*/
static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size);
static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size);/*内部函数定义区*//*
函数参数:1、T_pData:发送数据缓冲区中取出数据发送出去2、T_Size :需要发送的数据的长度
*/
static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size)
{return HAL_SPI_Transmit(&W25Q_SPI, T_pData, T_Size, 0xffff);
}/*
函数参数:1、R_pData:接收数据并放置到接收数据缓冲区中2、R_Size :需要接收的数据的长度
*/
static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size)
{return HAL_SPI_Receive(&W25Q_SPI, R_pData, R_Size, 0xffff);
}/*
写使能或失能参数:Type:1、为1时使能2、为0时失能
*/
HAL_StatusTypeDef Bsp_Write_En_De(uint8_t Type)
{uint8_t cmd;HAL_StatusTypeDef STD = HAL_ERROR;W25Q_CS_Level(0);SPI_Delay(1);switch(Type){case 1:cmd = W25Q_W_EN;break;case 0:cmd = W25Q_W_DIS;break;default:cmd = W25Q_W_DIS;break;}if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);return STD;
}/*
读状态寄存器参数:Select1、为0时是寄存器12、为1时是寄存器2参数:State(指针)1、返回的状态标志流程:先写入命令,然后读取状态
*/
HAL_StatusTypeDef Bsp_Read_State_Reg(uint8_t Select, uint8_t* State)
{uint8_t cmd;HAL_StatusTypeDef STD = HAL_ERROR;W25Q_CS_Level(0);SPI_Delay(1);switch(Select){case 0:cmd = W25Q_R_STA_REG1;break;case 1:cmd = W25Q_R_STA_REG2;break;default:cmd = W25Q_R_STA_REG1;break;}if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){if(bsp_w25q_Receive(State,1) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);return STD;
}/*
判忙用处:判断当前flash是否在忙碌状态BUSY只读寄存器忙时高电平空闲低电平
*/
void Bsp_Judge_Busy(void)
{uint8_t State;do{Bsp_Read_State_Reg(0, &State);  //不要用指针类型局部变量传进去,必被卡死State &= 0x01;}while(State == 0x01);//寄存器为1时为忙
}/*
读数据参数:R_Addr1、读取数据的地址参数:R_Data(数组指针)1、获取读取的数据参数:R_Size1、读取的数据的大小
*/
HAL_StatusTypeDef Bsp_W25Q_Read_Data(uint32_t R_Addr, uint8_t * R_Data, uint16_t R_Size)
{HAL_StatusTypeDef STD = HAL_ERROR;uint8_t addr[4] = {0};addr[0] = W25Q_R_Data;addr[1] = (R_Addr >> 16) & 0xFF;addr[2] = (R_Addr >> 8) & 0xFF;addr[3] = (R_Addr) & 0xFF;Bsp_Judge_Busy();   //判忙W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){if(bsp_w25q_Receive(R_Data,R_Size) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);return STD;
}/*
写数据-页页的描述:1字节到 256 字节(一页)页写的前提条件:编程之前必须保证额你存空间是0xff,所以得先进行擦除(擦除后模式全为1)页写的注意事项:进行页编程时,如果数据字节数超过了 256 字节,地址将自动回到页的起始地址,覆盖掉之前的数据。参数:WriteAddr1、地址,三个字节地址参数:PW_Data(数组指针)1、要写入的数据,长度根据PW_size来定2、高位先传参数:PW_Size2、要写入的数据长度先通过状态寄存器判断是否在忙,然后写使能,接着判忙,拉底片选选中,发命令字节0x02,发三个地址,高位优先,然后发你要写的数据,最后拉高片选
*/HAL_StatusTypeDef Bsp_W25Q_Page_Write(uint32_t WriteAddr, uint8_t * PW_Data, uint16_t PW_Size)
{HAL_StatusTypeDef STD = HAL_ERROR;uint8_t addr[4] = {0};addr[0] = W25Q_Page_Program;addr[1] = (WriteAddr >> 16) & 0xFF;addr[2] = (WriteAddr >> 8) & 0xFF;addr[3] = (WriteAddr) & 0xFF;Bsp_Judge_Busy();   //判忙Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){if(bsp_w25q_Transmit(PW_Data, PW_Size) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
扇区擦除扇区的描述:W25Q16总共2MB,分为32块(每块64KB),每块16个扇区,每个扇区4K个字节。扇区的备注:W25Q16的最小擦除单位就是一个扇区所以至少给芯片开辟一个4KB的缓存区,以防止一次性删除太多,而丢失数据。(显然单片机不会给他开辟这么大的空间)参数:num : 扇区的序号*/
HAL_StatusTypeDef Bsp_W25Q_Sector_Erase(uint32_t num)
{HAL_StatusTypeDef STD = HAL_ERROR;//一个扇区有4KB的大小,//为了使找到对应的扇区地址,所以要乘以4KB//(1<<12) = 4096num *= (1<<12);uint8_t addr[4] = {0};addr[0] = W25Q_Sector_Erase;addr[1] = (num >> 16) & 0xFF;addr[2] = (num >> 8) & 0xFF;addr[3] = (num) & 0xFF;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
块擦除块的描述:W25Q16有2MB的容量,而2MB有32个块,所以1块有64kB的大小,所以这个函数一次能擦除64KB的大小。参数:Block_Addr1、块地址,共32个块,对应32个地址,以64K为单位寻址2、高位先传流程:先开写使能、判忙,再写命令,再写3个字节的地址,最后写失能参数:num : 块的序号
*/
HAL_StatusTypeDef   Bsp_W25Q_Block_Erase(uint32_t num)
{uint8_t cmd = W25Q_Block_Erase;HAL_StatusTypeDef STD = HAL_ERROR;//总共有32个块,而一个块有64KB的大小,//为了使找到对应的块地址,所以要乘以64KBnum *= (1<<16);uint8_t addr[4] = {0};addr[0] = W25Q_Block_Erase;addr[1] = (num >> 16) & 0xFF;addr[2] = (num) & 0xFF;addr[3] = (num) & 0xFF;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
全片擦除描述:直接把芯片全部擦除
*/
HAL_StatusTypeDef Bsp_W25Q_Full_Erase(void)
{uint8_t cmd = W25Q_Full_Erase;HAL_StatusTypeDef STD = HAL_ERROR;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
读ID描述:读3个字节分别是生产厂家、存储器类型、容量
*/
HAL_StatusTypeDef Bsp_Read_Jedec_ID(uint8_t * R_Jedec_ID)
{uint8_t read_id[3] = {0};uint8_t cmd = W25Q_JEDEC_ID;HAL_StatusTypeDef STD = HAL_ERROR;Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){if(bsp_w25q_Receive(read_id, 3) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);if(STD == HAL_OK){LOG_OUT("read_id= %x %x %x\r\n", read_id[0], read_id[1], read_id[2]);}else{LOG_OUT("read_id= err\r\n");}return STD;
}/** 电源开启*/
void W26Q16_Power_On(void)
{MX_SPI1_Init();//W25Q_WP_HIGH;rt_thread_mdelay(100);Bsp_Read_Jedec_ID(NULL);}/** 电源关闭*/
void W26Q16_Power_Off(void)
{//WP拉低开启读保护//W25Q_WP_LOW;W25Q_CS_Level(GPIO_PIN_RESET);rt_thread_mdelay(10);//失能SPI配置为IOw25q16_init_sleep();rt_thread_mdelay(1000);
}
#ifndef __DRV_W25Q16_H
#define __DRV_W25Q16_H#include "app_user.h"
#include "spi.h"/*句柄重命名*/
#define W25Q_SPI                hspi1#define SPI_Delay(ms)           rt_thread_mdelay(ms+1)/*片选引脚定义与函数调用*/
#define W25Q_CS_Pin             GPIO_PIN_4
#define W25Q_CS_Port            GPIOA#define W25Q_CS_Level(_CS_STATE__)      HAL_GPIO_WritePin(W25Q_CS_Port, W25Q_CS_Pin, (GPIO_PinState)_CS_STATE__)//#define W25Q_WP_HIGH   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET)
//#define W25Q_WP_LOW    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET)#define W25Q_W_EN               0x06        //写使能
#define W25Q_W_DIS              0x04        //写禁止#define W25Q_R_Data             0x03        //读数据#define W25Q_R_STA_REG1     0x05        //读状态寄存器1,紧跟着的字节就是当前状态
#define W25Q_R_STA_REG2     0x35        //读状态寄存器2,紧跟着的字节就是当前状态#define W25Q_W_STA_REG      0x01        //写状态寄存器,写入两个字节,分别到寄存器1,和寄存器2#define W25Q_Page_Program   0x02        //页编程,先跟3个地址字节,再跟一个数据字节#define W25Q_Block_Erase    0xD8        //块擦除64k,三个地址字节#define W25Q_Sector_Erase   0x20        //扇区擦除,跟三个地址#define W25Q_Full_Erase     0xC7        //全片擦除//0x60#define W25Q_Susp_Erase     0x75        //暂停擦除#define W25Q_Rest_Erase     0x7A        //恢复擦除#define W25Q_PowDow_Mode    0xB9        //掉电模式#define W25Q_HPer_Mode      0xA3        //高性能模式#define W25Q_JEDEC_ID       0x9F        //读3个字节分别是生产厂家、存储器类型、容量/*写使能或失能*/
HAL_StatusTypeDef Bsp_Write_En_De(uint8_t Type);/*读状态寄存器*/
HAL_StatusTypeDef Bsp_Read_State_Reg(uint8_t Select, uint8_t* State);/*判忙*/
void Bsp_Judge_Busy(void);/*读数据*/
HAL_StatusTypeDef Bsp_W25Q_Read_Data(uint32_t R_Addr, uint8_t * R_Data, uint16_t R_Size);/*页写*/
HAL_StatusTypeDef Bsp_W25Q_Page_Write(uint32_t WriteAddr, uint8_t * PW_Data, uint16_t PW_Size);/*扇区擦除*/
HAL_StatusTypeDef Bsp_W25Q_Sector_Erase(uint32_t num);/*块擦除*/
HAL_StatusTypeDef   Bsp_W25Q_Block_Erase(uint32_t num);/*全片擦除*/
HAL_StatusTypeDef Bsp_W25Q_Full_Erase(void);/*读ID*/
HAL_StatusTypeDef Bsp_Read_Jedec_ID(uint8_t * R_Jedec_ID);void W26Q16_Power_On(void);
void W26Q16_Power_Off(void);
#endif /*W25Q16__H__*/
/* USER CODE BEGIN Header */
/********************************************************************************* @file    spi.c* @brief   This file provides code for the configuration*          of the SPI instances.******************************************************************************* @attention** Copyright (c) 2024 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 "spi.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */SPI_HandleTypeDef hspi1;/* SPI1 init function */
void MX_SPI1_Init(void)
{/* USER CODE BEGIN SPI1_Init 0 *//* USER CODE END SPI1_Init 0 *//* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 */hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 7;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 *//* USER CODE END SPI1_Init 2 */}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* SPI1 clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO ConfigurationPA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */}
}void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspDeInit 0 *//* USER CODE END SPI1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_SPI1_CLK_DISABLE();/**SPI1 GPIO ConfigurationPA5     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);/* USER CODE BEGIN SPI1_MspDeInit 1 *//* USER CODE END SPI1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */

void w25q16_init_sleep(void)
{extern SPI_HandleTypeDef hspi1;HAL_SPI_DeInit(&hspi1);__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLDOWN;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
}

相关文章:

【随手笔记】FLASH-W25Q16(三)

#include "bsp_w25q16.h"/*内部函数声明区*/ static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size); static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size);/*内部函数定义区*//* 函数参数&#xff1a;1、T_…...

2024软件测试面试热点问题

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析&#xff1f; 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…...

【JAVA】java 企业微信信息推送

前言 JAVA中 将信息 推送到企业微信 // 企微消息推送messageprivate String getMessage(String name, String problemType, String pushResults, Long orderId,java.util.Date submitTime, java.util.Date payTime) {String message "对接方&#xff1a;<font color\…...

介绍一下数组(c基础)(smart 版)

c初期&#xff0c;记住规则&#xff0c;用规则。 我只是介绍规则。&#xff08;有详细版&#xff0c;这适合smart人看&#xff09; 数组&#xff08;同类型&#xff09; int arr[n] {} ; int 是 元素类型。 int arr[n] {} ; arr为标识符。 {} 集合&#xff0c;元素有次…...

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…...

探索数据科学与大数据技术专业本科生的广阔就业前景

随着信息技术的不断发展&#xff0c;数据科学与大数据技术已经成为各大行业的关键推动力。在这样一个数据驱动的时代&#xff0c;越来越多的企业依赖数据来驱动决策、优化运营和创造价值。因此&#xff0c;数据科学与大数据技术专业的本科生在就业市场上具有广阔的前景和多样的…...

微服务架构面试内容整理-Zuul

Zuul 是由 Netflix 开发的一个边缘服务(API 网关),用于动态路由、监控、认证、以及对微服务架构中的请求进行过滤。它在微服务架构中扮演着重要的角色,提供了一种集中管理和控制服务访问的方式。以下是 Zuul 的主要特点、工作原理和使用场景: 主要特点 1. 动态路由: Zuu…...

解决Knife4j 接口界面UI中文乱码问题

1、查看乱码情况 2、修改 编码设置 3、删除 target 文件 项目重新启动 被坑死了...

微服务架构面试内容整理-Sleuth

Spring Cloud Sleuth 是一个分布式追踪工具&#xff0c;用于监控微服务系统中请求的传播情况。它通过在微服务之间传递追踪信息&#xff0c;帮助开发者理解系统的行为&#xff0c;快速定位性能瓶颈和问题。以下是 Sleuth 的主要特点、工作原理和使用场景&#xff1a; 主要特点 …...

Go语言的接口示例

Go语言的接口(interface)是一种轻量级的多态性实现方式,是构建高扩展性、高复用性代码的利器。Go语言的接口非常灵活,不要求显式的实现声明,只要一个类型实现了接口规定的方法,它就可以被视为该接口的实现者。在本篇博客中,我们将通过多个实际示例,探讨Go语言接口的使用…...

【Apache ECharts】<农作物病害发生防治面积>

在vs Code里打开&#xff0c; 实现 1. 首先引入 echarts.min.js 资源 2. 在body部分设一个 div&#xff0c;设置 id 为 main 3. 设置 script 3.1 基于准备好的dom&#xff0c;初始化echarts实例 var myChart echarts.init(document.getElementById(main)); 3.2 指定图表的…...

基于vue3实现的聊天机器人前端(附代码)

<template><div class"container"><!-- 页面头部 --><header><h1>跟它说说话吧&#xff01;</h1><p>一个活泼的伙伴&#xff0c;为你提供情感支持&#xff01;</p></header><!-- 聊天容器 --><div c…...

DICOM标准:深入详解DICOM医学影像中的传输语法

引言 DICOM&#xff08;数字成像和通信医学&#xff09;标准在医学影像数据交换中扮演着至关重要的角色。其中&#xff0c;*传输语法&#xff08;Transfer Syntax&#xff09;是DICOM标准中定义数据编码和传输方式的核心部分。理解传输语法对于确保不同设备和系统之间的互操作性…...

sql server 文件备份恢复

数据库介绍文件组 PRIMARY 文件 lys D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\lys.mdf lys_02 D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\lys_02.ndf文件组 sec 有2个表&#xff08;sec_1,sec_2&#xff09; 文件 …...

Gradle命令编译Android Studio工程项目并签名

文章目录 gradlew命令gradlew编译debug apkgradlew编译release apkapksigner签名apkgradlew注意事项 gradlew命令 gradlew 是一个脚本文件&#xff0c;它允许你在没有全局安装 Gradle 的情况下运行 Gradle 构建。这个脚本在多平台上可用&#xff0c;对于 Windows 系统来说是 g…...

lua入门教程:垃圾回收

Lua的垃圾回收机制是一种自动内存管理方式&#xff0c;用于回收不再被程序访问的对象&#xff0c;从而避免内存泄漏。以下是一个关于Lua垃圾回收机制的详细教程&#xff1a; 一、Lua垃圾回收机制概述 Lua使用自动内存管理&#xff0c;这意味着程序员不需要手动释放内存。Lua的…...

基于前后端分离架构,SaaS云平台与私有云部署的智慧校园源码,java电子班牌源码

基于前后端分离架构&#xff0c;SaaS云平台与私有云部署的智慧校园源码&#xff0c;java电子班牌源码&#xff0c;自主研发&#xff0c;自主版权&#xff0c;上百个学校应用案例&#xff0c;支持二次开发。 在信息技术飞速发展的今天&#xff0c;教育领域也迎来了一场革命性的变…...

知识总结五

一、C深浅拷贝 浅拷贝&#xff1a;只复制对象的成员变量的值&#xff0c;如果成员变量包含指针&#xff0c;则只复制指针值&#xff0c;不复制指针所指向的数据。深拷贝&#xff1a;复制对象的成员变量的值&#xff0c;并且如果成员变量包含指针&#xff0c;则还复制指针所指向…...

一、初识C语言(1)

1.C语言识别的是二进制语言 C语言是一门计算机语言&#xff0c;计算机是硬件&#xff0c;硬件分通电&#xff08;1&#xff09;和 未通电&#xff08;0&#xff09;两种情况&#xff0c;所以C语言识别的都是0 / 1信号&#xff0c;也就是二进制语言。 2.C语言文件类型以及基本框…...

petty 状态管理库文档

自研 Petty 状态管理库产生背景 petty 是一款适用于 vue2.5以下版本&#xff08;目前已兼容vue2.5x 以上版本&#xff09;的状态管理库&#xff0c;能够在 vue 2这种配置项的代码中&#xff0c;去实现类似于 vue3 里的 pinia、React 里的hook的调用形式&#xff0c;用函数式的…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...