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

电赛信号题备赛日记(1)移植正点原子STM32H750 mini pro的TFTLCD屏幕

之所以采用STM32H750的原因是因为电赛信号题要求的ADC采样频率高且STM32H750的性价比很高刚好正点原子的H750mini pro开发板的价格低但首先第一步想要用移植它的LCD屏幕就不同于我之前使用的正点原子STM32F4开发板且正点原子H750开发板的教程及驱动极其的抽象教程也没有使用CubeMX进行配置所以对想用CubeMX对这块开发板进行配置会感到陌生。因为H750的内存配置以及内部Cache都需要配置但是正点原子并没有在教程中有CubeMX相关的配置而是在驱动中对其进行配置这就会导致我们使用CubeMX生成的代码在移植正点原子的驱动过程中会报错。下面我展示第一步移植LCD屏幕首先我们先打开正点原子教程中的HAL库版本的基础入门实验中的新建工程CubeMX版本打开其中的CubeMX这样就省略了一些基础的配置首先重点我们看CubeMX中的CORTEX—M7将其配置为重点就是要打开CPU的ICache和DCache。但是不需要具体配置其内存地址因为后续直接调用驱动会快很多且不容易犯错。在其驱动中已经对其进行了配置然后我们到FMC当中H7于F4的LCD移植区别主要便是将FSMC改为FMC主要便是支持了动态存储器。在当中我们注意要看开发板的原理图我们发现正点原子是将PD7设为了FMC_NE1.我们要先将PD7配置为FMC_NE1不然默认是 PC7。但是其实这一部最主要的目的只是开始FMC引脚在正点原子的驱动中进行了重新分配。接下来配置时钟再生成文件即可。接下来我们随意打开正点原子的示例找到驱动文件其中BSP文件中的MPU和LCD文件是我们需要的以及SYSTEM文件中的这里的usart是串口文件我并没有使用而且接下来也会修改一些驱动代码所以我们并不需要这个文件里的驱动文件如果你需要使用其串口文件进行调试也可以自己配置。我们将其提取出来放到一个新建的BSP文件当中接下来将这个文件放在我们生成的项目与文件当中并且在keil5中包含这个文件打开Keil5我们接下来进行驱动的修改。在驱动文件中我们可以看到其包含了usart文件中的usart.h但是我们并不需要串口功能所以先将所有驱动文件的usart功能删除主要就是printf功能如这样的在所有驱动文件当中基本都有这个我们将其全部删除嫌麻烦我也在下方给出我修改好的文件在我们修改好驱动文件之后我们先进行编译会发现有很多报错这就是正点原子驱动和CubeMX生成文件冲突了主要原因就是正点原子在驱动当中就把CubeMX的活给提前干完了导致编译时发现有些函数定义了两遍。我们先看lcd.c当中的lcd_init函数。void lcd_init(void) { GPIO_InitTypeDef gpio_init_struct; FMC_NORSRAM_TimingTypeDef fmc_read_handle; FMC_NORSRAM_TimingTypeDef fmc_write_handle; LCD_CS_GPIO_CLK_ENABLE(); /* LCD_CS脚时钟使能 */ LCD_WR_GPIO_CLK_ENABLE(); /* LCD_WR脚时钟使能 */ LCD_RD_GPIO_CLK_ENABLE(); /* LCD_RD脚时钟使能 */ LCD_RS_GPIO_CLK_ENABLE(); /* LCD_RS脚时钟使能 */ LCD_BL_GPIO_CLK_ENABLE(); /* LCD_BL脚时钟使能 */ gpio_init_struct.Pin LCD_CS_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_AF_PP; /* 推挽复用 */ gpio_init_struct.Pull GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed GPIO_SPEED_FREQ_VERY_HIGH; /* 高速 */ gpio_init_struct.Alternate GPIO_AF12_FMC; /* 复用为FMC */ HAL_GPIO_Init(LCD_CS_GPIO_PORT, gpio_init_struct); /* 初始化LCD_CS引脚 */ gpio_init_struct.Pin LCD_WR_GPIO_PIN; HAL_GPIO_Init(LCD_WR_GPIO_PORT, gpio_init_struct); /* 初始化LCD_WR引脚 */ gpio_init_struct.Pin LCD_RD_GPIO_PIN; HAL_GPIO_Init(LCD_RD_GPIO_PORT, gpio_init_struct); /* 初始化LCD_RD引脚 */ gpio_init_struct.Pin LCD_RS_GPIO_PIN; HAL_GPIO_Init(LCD_RS_GPIO_PORT, gpio_init_struct); /* 初始化LCD_RS引脚 */ gpio_init_struct.Pin LCD_BL_GPIO_PIN; gpio_init_struct.Mode GPIO_MODE_OUTPUT_PP; /* 推挽输出 */ HAL_GPIO_Init(LCD_BL_GPIO_PORT, gpio_init_struct); /* LCD_BL引脚模式设置(推挽输出) */ g_sram_handle.Instance FMC_NORSRAM_DEVICE; g_sram_handle.Extended FMC_NORSRAM_EXTENDED_DEVICE; g_sram_handle.Init.NSBank FMC_NORSRAM_BANK1; /* 使用NE1 */ g_sram_handle.Init.DataAddressMux FMC_DATA_ADDRESS_MUX_DISABLE; /* 不复用数据线 */ g_sram_handle.Init.MemoryType FMC_MEMORY_TYPE_SRAM; /* SRAM */ g_sram_handle.Init.MemoryDataWidth FMC_NORSRAM_MEM_BUS_WIDTH_16; /* 16位数据宽度 */ g_sram_handle.Init.BurstAccessMode FMC_BURST_ACCESS_MODE_DISABLE; /* 是否使能突发访问,仅对同步突发存储器有效,此处未用到 */ g_sram_handle.Init.WaitSignalPolarity FMC_WAIT_SIGNAL_POLARITY_LOW; /* 等待信号的极性,仅在突发模式访问下有用 */ g_sram_handle.Init.WaitSignalActive FMC_WAIT_TIMING_BEFORE_WS; /* 存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT */ g_sram_handle.Init.WriteOperation FMC_WRITE_OPERATION_ENABLE; /* 存储器写使能 */ g_sram_handle.Init.WaitSignal FMC_WAIT_SIGNAL_DISABLE; /* 等待使能位,此处未用到 */ g_sram_handle.Init.ExtendedMode FMC_EXTENDED_MODE_ENABLE; /* 读写使用不同的时序 */ g_sram_handle.Init.AsynchronousWait FMC_ASYNCHRONOUS_WAIT_DISABLE; /* 是否使能同步传输模式下的等待信号,此处未用到 */ g_sram_handle.Init.WriteBurst FMC_WRITE_BURST_DISABLE; /* 禁止突发写 */ g_sram_handle.Init.ContinuousClock FMC_CONTINUOUS_CLOCK_SYNC_ASYNC; /* FMC读时序控制寄存器 */ fmc_read_handle.AddressSetupTime 0x0F; /* 地址建立时间(ADDSET)为15个fmc_ker_ck 1/220M4.5ns*1567.5ns */ fmc_read_handle.AddressHoldTime 0x00; fmc_read_handle.DataSetupTime 0x4E; /* 数据保存时间(DATAST)为78个fmc_ker_ck4.5*78351ns */ /* 因为液晶驱动IC的读数据的时候速度不能太快,尤其是个别奇葩芯片 */ fmc_read_handle.AccessMode FMC_ACCESS_MODE_A; /* 模式A */ /* FMC写时序控制寄存器 */ fmc_write_handle.AddressSetupTime 0x0F; /* 地址建立时间(ADDSET)为15个fmc_ker_ck67.5ns */ fmc_write_handle.AddressHoldTime 0x00; fmc_write_handle.DataSetupTime 0x0F; /* 数据保存时间(DATAST)为15个fmc_ker_ck67.5ns */ /* 15个fmc_ker_ckfmc_ker_ck220Mhz,某些液晶驱动IC的写信号脉宽最少也得50ns。 */ fmc_write_handle.AccessMode FMC_ACCESS_MODE_A; /* 模式A */ HAL_SRAM_Init(g_sram_handle, fmc_read_handle, fmc_write_handle); delay_ms(50); /* 初始化FMC后,必须等待一定时间才能开始初始化 */ /* 尝试9341 ID的读取 */ lcd_wr_regno(0XD3); lcddev.id lcd_rd_data(); /* dummy read */ lcddev.id lcd_rd_data(); /* 读到0X00 */ lcddev.id lcd_rd_data(); /* 读取0X93 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 读取0X41 */ if (lcddev.id ! 0X9341) /* 不是 9341 , 尝试看看是不是 ST7789 */ { lcd_wr_regno(0X04); lcddev.id lcd_rd_data(); /* dummy read */ lcddev.id lcd_rd_data(); /* 读到0X85 */ lcddev.id lcd_rd_data(); /* 读取0X85 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 读取0X52 */ if (lcddev.id 0X8552) /* 将8552的ID转换成7789 */ { lcddev.id 0x7789; } if (lcddev.id ! 0x7789) /* 也不是ST7789, 尝试是不是 NT35310 */ { lcd_wr_regno(0xD4); lcddev.id lcd_rd_data(); /* dummy read */ lcddev.id lcd_rd_data(); /* 读回0x01 */ lcddev.id lcd_rd_data(); /* 读回0x53 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 这里读回0x10 */ if (lcddev.id ! 0x5310) /* 也不是NT35310,尝试看看是不是ST7796 */ { lcd_wr_regno(0XD3); lcddev.id lcd_rd_data(); /* dummy read */ lcddev.id lcd_rd_data(); /* 读到0X00 */ lcddev.id lcd_rd_data(); /* 读取0X77 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 读取0X96 */ if (lcddev.id ! 0x7796) /* 也不是ST7796,尝试看看是不是NT35510 */ { /* 发送密钥厂家提供 */ lcd_write_reg(0xF000, 0x0055); lcd_write_reg(0xF001, 0x00AA); lcd_write_reg(0xF002, 0x0052); lcd_write_reg(0xF003, 0x0008); lcd_write_reg(0xF004, 0x0001); lcd_wr_regno(0xC500); /* 读取ID低八位 */ lcddev.id lcd_rd_data(); /* 读回0x55 */ lcddev.id 8; lcd_wr_regno(0xC501); /* 读取ID高八位 */ lcddev.id | lcd_rd_data(); /* 读回0x10 */ delay_ms(5); /* 等待5ms, 因为0XC501指令对1963来说就是软件复位指令, 等待5ms让1963复位完成再操作 */ if (lcddev.id ! 0x5510) /* 也不是NT5510,尝试看看是不是ILI9806 */ { lcd_wr_regno(0XD3); lcddev.id lcd_rd_data(); /* dummy read */ lcddev.id lcd_rd_data(); /* 读回0X00 */ lcddev.id lcd_rd_data(); /* 读回0X98 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 读回0X06 */ if (lcddev.id ! 0x9806) /* 也不是ILI9806,尝试看看是不是SSD1963 */ { lcd_wr_regno(0xA1); lcddev.id lcd_rd_data(); lcddev.id lcd_rd_data(); /* 读回0x57 */ lcddev.id 8; lcddev.id | lcd_rd_data(); /* 读回0x61 */ if (lcddev.id 0x5761) lcddev.id 0x1963; /* SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963 */ } } } } } }我们发现在这个版本的驱动当中正点原子已经帮我们将FCM的引脚配置好了但是我们又要在CubeMX开启FCM才能使用这个驱动这就是其抽象的地方。其实解决方法就是将main函数当中的FCM初始化注释掉然后调用lcd_init();这样就即开启了FCM时钟也避免了对其进行两次配置。接下来对mian函数中的SCB_EnableICache();和SCB_EnableDCache();也将其注释掉转而调用正点原子sys.h驱动当中的sys_cache_enable();函数还记得我们并没有对ICache和DCache进行配置嘛正点原子在mpu.h中的mpu_memory_protection();函数中已经进行了配置我们只需要调用它即可。这个函数内部是这样的void mpu_memory_protection(void) { /* 保护整个DTCM,共128K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */ mpu_set_protection(0x20000000, MPU_REGION_SIZE_128KB, MPU_REGION_NUMBER1, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE); /* 保护整个AXI SRAM,共512K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */ mpu_set_protection(0x24000000, MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER2, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE); /* 保护整个SRAM1~SRAM3,共288K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */ mpu_set_protection(0x30000000, MPU_REGION_SIZE_512KB,MPU_REGION_NUMBER3, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE); /* 保护整个SRAM4,共64K字节,允许指令访问,禁止共用,允许cache,允许缓冲 */ mpu_set_protection(0x38000000, MPU_REGION_SIZE_64KB, MPU_REGION_NUMBER4, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE); /* 保护MCU LCD屏所在的FMC区域,,共64M字节,允许指令访问,禁止共用,禁止cache,禁止缓冲 */ mpu_set_protection(0x60000000, MPU_REGION_SIZE_64MB, MPU_REGION_NUMBER5, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE); /* 保护SDRAM区域,共64M字节,允许指令访问,禁止共用,允许cache,允许缓冲 */ mpu_set_protection(0XC0000000, MPU_REGION_SIZE_64MB, MPU_REGION_NUMBER6, MPU_INSTRUCTION_ACCESS_ENABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_CACHEABLE, MPU_ACCESS_BUFFERABLE); /* 保护整个NAND FLASH区域,共256M字节,禁止指令访问,禁止共用,禁止cache,禁止缓冲 */ mpu_set_protection(0X80000000, MPU_REGION_SIZE_256MB, MPU_REGION_NUMBER7, MPU_INSTRUCTION_ACCESS_DISABLE, MPU_REGION_FULL_ACCESS, MPU_ACCESS_NOT_SHAREABLE, MPU_ACCESS_NOT_CACHEABLE, MPU_ACCESS_NOT_BUFFERABLE); }其实在CubeMX中也可以对它进行配置但是我没成功过反而是直接调用其函数成功了你们有兴趣可以尝试一下然后我看其他博主的移植教程对其的延时函数也进行了修改我们这里就进行了沿用可以尝试一下不进行修改但我没试过QAQ。在CubeMX中用TIM7对它进行精确延时并在delay.c文件中将void delay_us(uint32_t nus)这个函数修改为void delay_us(uint16_t nus) { uint16_t differ 65535-nus-5; HAL_TIM_Base_Start(htim7); __HAL_TIM_SetCounter(htim7,differ); while(differ0xffff-5) { differ __HAL_TIM_GetCounter(htim7); } HAL_TIM_Base_Stop(htim7); }记得包含定时器头文件以及去修改delay.h好的到这里我们进行编译会发现还会发生报错原因就是在其驱动文件中对CubeMX生成的fmc.c中的void HAL_SRAM_MspInit(SRAM_HandleTypeDef* sramHandle)这个函数进行了再次定义我们只需要将fmc.c中的void HAL_SRAM_MspInit(SRAM_HandleTypeDef* sramHandle)函数注释掉即可到这里我们的LCD屏幕就可以正常工作了下面是我修改好的BSP文件链接: https://pan.baidu.com/s/1uA2C8CdIMlsR7NQwRSqIpg?pwd5q44 提取码: 5q44有问题可以联系我QQ2328932766

相关文章:

电赛信号题备赛日记(1)移植正点原子STM32H750 mini pro的TFTLCD屏幕

之所以采用STM32H750的原因是因为电赛信号题要求的ADC采样频率高,且STM32H750的性价比很高,刚好正点原子的H750mini pro开发板的价格低,但首先第一步想要用移植它的LCD屏幕就不同于我之前使用的正点原子STM32F4开发板,且正点原子H…...

第三章 第一性原理:从零到一的完整思考方法论

第三章 第一性原理:从零到一的完整思考方法论 一、开篇:为什么你懂了原理,还是不会用 前两章讲了第一性原理的哲学源头和底层结构。很多读者反馈:道理明白了,但面对真实问题时,还是不知道怎么下手。 这是正常的。从"知道"到"做到",中间隔着方法论…...

**WebTransport:下一代低延迟实时通信协议的实战解析与代码实现**

WebTransport:下一代低延迟实时通信协议的实战解析与代码实现 在现代 Web 应用中,高吞吐、低延迟、双向数据传输能力已成为构建高性能服务的核心诉求。传统的 HTTP/2 和 WebSocket 虽然满足基础需求,但在复杂场景下(如实时音视频流…...

Flutter 三方库 nanoid_plus 鸿蒙适配指南 - 实现安全高性能分布式唯一标识生成、在 OpenHarmony 上打造无冲突业务 ID 防线实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 nanoid_plus 鸿蒙适配指南 - 实现安全高性能分布式唯一标识生成、在 OpenHarmony 上打造无冲突业务 ID 防线实战 前言 在参与构建鸿蒙(OpenHarmony&#xff09…...

记一次完整的MongoDB环境配置实录

写在前面 最近项目中需要用到MongoDB,本以为是个简单的安装配置,没想到一路踩坑不断,从下载MongoDB到最终在MCP(Model Context Protocol)中正常使用,整整折腾了一天。为了不让后来者重蹈覆辙,特…...

P15755 [JAG 2025 Summer Camp #1] JAG Box

传送门 题目描述 JAG Box 是一种目前在全世界流行的普通长方体盒子。共有 NNN 个 JAG Box。对于每个 i1,2,…,Ni 1, 2, \ldots, Ni1,2,…,N,第 iii 个盒子有一个整数重量 AiA_iAi​。 你将通过重复选择一个剩余的盒子并将其插入当前堆叠的最底部来建造一个垂直堆…...

投流跑不动、ROI上不去?别只怪出价,90%的问题都出在素材上

投流越投越亏?出价拉满、定向精准,却依然冷启动失败、转化惨淡?别再内耗投放技巧了——90%的投流困境,根源都在素材!对投流而言,素材才是核心引擎,出价、定向只是辅助。平台算法核心看点击率、完…...

Spring AI 基础使用与介绍

一、Spring AI 是什么 Spring AI 是 Spring 官方推出的 AI 应用开发框架,用于简化 Java 后端对接大模型 API 的开发流程。 核心作用:统一对接各种大模型(豆包、通义千问、文心一言、GPT 等)简化 AI 接口调用代码支持 RAG 知识库、…...

三个月燕窝口服液裂变2000万背后的商业逻辑

大家好,我是银子,一家互联网公司的负责人最近,一个“三个月私域做到2000万营业额”的燕窝口服液案例在圈内引发热议。有人说它是神来之笔,也有人说它是割韭菜的套路。抛开争议,今天我们以商家和企业运营者的视角&#…...

CSDN Markdown 微笑与 section 符号

CSDN Markdown 微笑与 section 符号References:)😃 (P) (p) References [1] Yongqiang Cheng (程永强), https://yongqiang.blog.csdn.net/...

CSDN Markdown 商标标志 C、TM 和 R

CSDN Markdown 商标标志 C、TM 和 R1. 版权标记 / 版权符号 (copyright symbol or copyright sign)2. 商标标志 C、TM 和 RReferences1. 版权标记 / 版权符号 (copyright symbol or copyright sign) The copyright symbol, or copyright sign, © (a circled capital lett…...

mybatis根据日期范围查询,多参数查询

一、根据日期范围查询 如果数据库里的日期字段属性是date或者是datetime对应maper.xml&#xff1a;其中<![CDATA[ ]]>&#xff1a;这是XML语法。在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的"<“字符 <和”&"字符&#xff0c;那么…...

基于LLM的电商分析系统设计

基于LLM的电商分析系统设计 关键词&#xff1a;大语言模型&#xff08;LLM&#xff09;、电商分析系统、数据挖掘、自然语言处理、机器学习 摘要&#xff1a;本文围绕基于大语言模型&#xff08;LLM&#xff09;的电商分析系统展开设计与探讨。首先介绍了系统开发的背景、目的、…...

2026 年,企业级 AI Agent 的成熟元年

过去两年&#xff0c;大语言模型的爆发让机器真正学会了 “说话”—— 它们能吟诗作对、答疑解惑&#xff0c;甚至模拟角色对话。但对话终究只是交互的起点&#xff0c;2026 年&#xff0c;我们正站在一个更重要的转折点上&#xff1a;AI Agent 的成熟&#xff0c;让机器从 “会…...

Pytorch---- CIFAR10实战(训练集+测试集+验证集)完整版,逐行注释-----学习笔记

文章目录 CIFAR10数据集准备、加载搭建神经网络损失函数和优化器训练集测试集关于argmax: 使用tensorboard可视化训练过程。完整代码(训练集测试集):程序结果: 验证集完整代码(验证集): CIFAR10数据集准备、加载 解释一下里面的参数 root数据放在哪。 train是否为训练集 。 do…...

实用代码、链接、工具汇总

学习资料推荐网站 https://www.code-nav.cn/ https://www.r2coding.com/ https://www.c114.com.cn/ https://juejin.cn/ https://www.fromgeek.com/about/index.html https://www.xygalaxy.com/ freertos: https://www.freertos.org/zh-cn-cmn-s/Documentation/01-FreeRTOS-qu…...

Jmeter IF控制器

IF控制器简介使用方法简介 Jmeter中的IF控制器在判断条件为真的情况下&#xff0c;会执行其下的组件。IF控制器判断条件为空时&#xff0c;表示false。其在Jmeter中的设置页面如下所示。 图中第一个红框输入IF控制器的判断条件&#xff1b;第二个红框表示 “直接使用上一个&a…...

Pytorch----池化层(平均值池化、最大值池化、自适应最大值池化)--入门级小实例(逐行注释)---学习笔记

文章目录最大值池化层平均值池化层自适应平均值池化层代码实现还是用上次的小实例 &#xff0c;这次加入三种池化层做练习。 关于池化层的基础概念可以看这里。 我之前以为池化层也叫下采样&#xff0c;但这样说并不严格&#xff0c;只是大家都这么说&#xff0c;我刚知道&am…...

风机光伏——02 风机出力建模

一、风机模型function power simpleTurbine( windSpeed, ratedOutputPower, cutInSpeed, ratedOutputSpeed, cutOutSpeed ) %#codegen %Simple Turbine % This function implements a simple power versus wind speed characteristic 此函数实现了简单的功率与风速特性 % to r…...

【动态规划】【广度优先搜索】【逆向思考】【单调向量】2617 网格图中最少访问的格子数

本文涉及的基础知识点 二分查找算法合集 动态规划汇总 题目 给你一个下标从 0 开始的 m x n 整数矩阵 grid 。你一开始的位置在 左上角 格子 (0, 0) 。 当你在格子 (i, j) 的时候&#xff0c;你可以移动到以下格子之一&#xff1a; 满足 j < k < grid[i][j] j 的格子…...

写字基本功 - 正确握笔姿势

写字基本功 - 正确握笔姿势1. 写字基本功2. 正确握笔步骤3. 正确握笔姿势 - 重点解说图3.1. 食指3.2. 拇指3.3. 中指3.4. 其它3.5. 施力方法References1. 写字基本功 郑文彬 (布衣老师)&#xff0c;台湾桃园市人&#xff0c;研究硬笔写字教学二十余年&#xff0c;台湾元智大学…...

3.8-STL(八)(总结篇)

###以四道题来总结题号:lanqiao OJ 32261.宝藏排序II### 这道题主要考察sort,非常简单输出就是升序不需要自定义比较函数#include<bits/stdc.h> using namespace std; const int N1e55; //这里用int就足够了不需要开long long int a[N]; int main(){ios::sync_with_stdio…...

3.7-STL(七)(map篇)

### 这里重点学习map ### 在实际做题过程中,multimap几乎用不到### unordered_map拥有极好的平均时间复杂度和极差的最坏时间复杂度,所以他的时间复杂度是不稳定的,unordered_map一般用不到,要做一个了解1.mapmap是一种关联容器,用于存储一组键值对(key-value pairs),其中每个键…...

推荐开源项目:OpenBMC - 未来服务器管理的利器

推荐开源项目&#xff1a;OpenBMC - 未来服务器管理的利器 【免费下载链接】openbmc OpenBMC Distribution 项目地址: https://gitcode.com/gh_mirrors/op/openbmc 1、项目介绍 OpenBMC 是一个基于 Linux 的管理控制器分布&#xff0c;专门设计用于服务器、顶部机架交换…...

终极iOS防崩溃指南:如何使用AvoidCrash框架避免Objective-C运行时陷阱

终极iOS防崩溃指南&#xff1a;如何使用AvoidCrash框架避免Objective-C运行时陷阱 【免费下载链接】AvoidCrash This framework can effective avoid crash by potential error code. For example : If you insert a nil into a mutable array, this framework can avoid crash…...

Eisvogel与Docker结合:免安装LaTeX环境快速生成PDF文档

Eisvogel与Docker结合&#xff1a;免安装LaTeX环境快速生成PDF文档 【免费下载链接】pandoc-latex-template A pandoc LaTeX template to convert markdown files to PDF or LaTeX. 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc-latex-template GitHub 加速计划…...

csvkit新手入门:5分钟掌握in2csv,轻松转换非CSV格式文件

csvkit新手入门&#xff1a;5分钟掌握in2csv&#xff0c;轻松转换非CSV格式文件 【免费下载链接】csvkit A suite of utilities for converting to and working with CSV, the king of tabular file formats. 项目地址: https://gitcode.com/gh_mirrors/cs/csvkit csvki…...

如何快速搭建Ruby on Rails管理后台:Trestle现代化框架的完整指南

如何快速搭建Ruby on Rails管理后台&#xff1a;Trestle现代化框架的完整指南 【免费下载链接】trestle A modern, responsive admin framework for Ruby on Rails 项目地址: https://gitcode.com/gh_mirrors/tr/trestle Trestle是一个为Ruby on Rails设计的现代化响应式…...

ProcessHacker高级筛选器创建:基于多条件组合定位进程

ProcessHacker高级筛选器创建&#xff1a;基于多条件组合定位进程 【免费下载链接】systeminformer A free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solution…...

Gorilla机器学习工作流:模型训练与部署的API调用自动化

Gorilla机器学习工作流&#xff1a;模型训练与部署的API调用自动化 【免费下载链接】gorilla Gorilla: An API store for LLMs 项目地址: https://gitcode.com/gh_mirrors/go/gorilla Gorilla作为一个专为大型语言模型(LLMs)设计的API商店&#xff0c;通过自动化API调用…...