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

【CubeMX-HAL库】STM32H743II——SDRAM配置所遇问题

推荐的博客和视频:

1、【CubeMX-HAL库】STM32H743—FMC配置SDRAM_stm32h743 sdram 速度-CSDN博客

2、【【STM32CubeMX教程】STM32全外设原理、配置和常用HAL、LL库API使用详解】

3、在百度网盘里有STM32H743的例程:【通过网盘分享的文件:STM32H743官方全部例程】

4、正点原子的开发指南:【通过网盘分享的文件:STM32H743 阿波罗开发指南V1.0】

注:以上就相当于是四种方法,FMC和SDRAM都可以配置好,具体的问题会在下面说。

 自己CubeMX中的配置

FMC初始化

 SDRAM时钟分频、延时和时序

时序是如何配置的可以看以上的博客和视频。时序在CubeMX中配置的时候是会有报错的,可以不用理会。

额外所需的SDRAM发送初始化序列配置

这些代码是在CubeMX中是没有配置的,所以需要额外写。在以上视频和博客中可以看到,官方库、其他人和正点原子都给你写好了,直接将它们的代码全部移植过来就行,并不困难。

例如这是我移植的正点原子的:

/*** @brief       发送SDRAM初始化序列* @param       无* @retval      无*/
void sdram_initialization_sequence(void)
{uint32_t temp = 0;/* SDRAM控制器初始化完成以后还需要按照如下顺序初始化SDRAM */sdram_send_cmd(0, FMC_SDRAM_CMD_CLK_ENABLE, 1, 0);                /* 时钟配置使能 */delay_us(500);                                                    /* 至少延时500us */sdram_send_cmd(0, FMC_SDRAM_CMD_PALL, 1, 0);                      /* 对所有存储区预充电 */sdram_send_cmd(0, FMC_SDRAM_CMD_AUTOREFRESH_MODE, 8, 0);          /* 设置自刷新次数 *//* 配置模式寄存器,SDRAM的bit0~bit2为指定突发访问的长度,* bit3为指定突发访问的类型,bit4~bit6为CAS值,bit7和bit8为运行模式* bit9为指定的写突发模式,bit10和bit11位保留位 */temp = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1  |                  /* 设置突发长度:1(可以是1/2/4/8) */SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL  |                  /* 设置突发类型:连续(可以是连续/交错) */SDRAM_MODEREG_CAS_LATENCY_2          |                  /* 设置CAS值:2(可以是2/3) */SDRAM_MODEREG_OPERATING_MODE_STANDARD|                  /* 设置操作模式:0,标准模式 */SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;                   /* 设置突发写模式:1,单点访问 */sdram_send_cmd(0, FMC_SDRAM_CMD_LOAD_MODE, 1, temp);              /* 设置SDRAM的模式寄存器 */
}

还有注意也要同时移植好测试函数,来测试读写SDRAM是否有问题:

/*** @brief       SDRAM内存测试* @param       x,y:起点坐标* @retval      无
*/
void sdram_test(uint16_t x, uint16_t y)
{  uint32_t i = 0;uint32_t temp = 0;uint32_t sval = 0;        /* 在地址0读到的数据 *//* 每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节 */for (i = 0; i < 32 * 1024 * 1024; i += 16 * 1024){*(volatile uint32_t *)(BANK5_SDRAM_ADDR + i) = temp; temp++;}/* 依次读出之前写入的数据,进行校验 */for (i = 0; i < 32 * 1024 * 1024; i += 16 * 1024) {temp =*(volatile uint32_t*)(BANK5_SDRAM_ADDR + i);if (i == 0){sval = temp;}else if (temp <= sval){break;             /* 后面读出的数据一定要比第一次读到的数据大 */}printf("SDRAM Capacity:%dKB\r\n", (uint16_t)(temp - sval + 1) * 16);           /* 打印SDRAM容量 */}
}

 所遇到的问题和解决方法

配置好FMC和SDRAM后,SDRAM测试程序中,不能对SDRAM进行正常读写,并且会跳入故障中断函数以及硬故障中断函数中。

第一次

以上的操作还是比较简单的。但是在我第一次测试的时候,发现代码卡住在测试代码中第一次写入一个数据中,然后就跳到了一个故障中断函数里:

是一个内存故障处理函数,于是我发现在CubeMX配置内存保护的里面,Speculation default mode(推测默认模式)被设置为了Enable,这个主要是用于平衡性能与功耗。但是在STM32等微控制器的配置中,可能会遇到与Speculation相关的设置选项,如CORTEX-M7核心的Speculation default mode。在这种情况下,将其从Enabled(启用)改为Disabled(禁用)可能是出于减少不必要的麻烦、提高稳定性或满足特定安全要求的考虑。

第二次

第二次我关闭了内存保护,测试的时候,跳到的是一个硬故障中断的函数中,这可能是由于处理器在访问内存时遇到了无法恢复的硬件错误:非法指令、栈溢出、访问未定义的内存地址等。此时就确信是内存保护的问题了。

第三次

重新打开MPU内存保护,第三次测试的时候,代码还是跳到硬故障中断函数中:

对照着正点原子的配置发现,就是内存保护单元没有配置好的问题,在Cube中配置好就行了,注意其内存保护单元的配置是在M7内核里配置的,对照着正点原子配置就好了:
(还有MPU Control Mode,我配置的是Background Region Privileged access only + MPU Enable during hard fault, NMI, and FAULTMASK handlers

/*** @brief       设置某个区域的MPU保护* @param       baseaddr:MPU保护区域的基址(首地址)* @param       size:MPU保护区域的大小(必须是32的倍数,单位为字节),可设置的值参考:CORTEX_MPU_Region_Size* @param       rnum:MPU保护区编号,范围:0~7,最大支持8个保护区域,可设置的值参考:CORTEX_MPU_Region_Number* @param       de:禁止指令访问;0,允许指令访问;1,禁止指令访问* @param       ap:访问权限,访问关系如下:可设置的值参考:CORTEX_MPU_Region_Permission_Attributes*   @arg       MPU_REGION_NO_ACCESS,无访问(特权&用户都不可访问)*   @arg       MPU_REGION_PRIV_RW,仅支持特权读写访问*   @arg       MPU_REGION_PRIV_RW_URO,禁止用户写访问(特权可读写访问)*   @arg       MPU_REGION_FULL_ACCESS,全访问(特权&用户都可访问)*   @arg       MPU_REGION_PRIV_RO,仅支持特权读访问*   @arg       MPU_REGION_PRIV_RO_URO,只读(特权&用户都不可以写)*   @arg       详见:STM32F7编程手册.pdf,4.6节,Table 89.* @param       sen  : 是否允许共用;MPU_ACCESS_NOT_SHAREABLE,不允许;MPU_ACCESS_SHAREABLE,允许* @param       cen  : 是否允许cache;MPU_ACCESS_NOT_CACHEABLE,不允许;MPU_ACCESS_CACHEABLE,允许* @param       ben  : 是否允许缓冲;MPU_ACCESS_NOT_BUFFERABLE,不允许;MPU_ACCESS_BUFFERABLE,允许* @retval      0,成功.*              其他,错误.*/
uint8_t mpu_set_protection(uint32_t baseaddr, uint32_t size, uint32_t rnum, uint8_t de, uint8_t ap, uint8_t sen, uint8_t cen, uint8_t ben)
{MPU_Region_InitTypeDef mpu_region_init_handle;HAL_MPU_Disable();                                                   /* 配置MPU之前先关闭MPU,配置完成以后在使能MPU */mpu_region_init_handle.Enable = MPU_REGION_ENABLE;                   /* 使能该保护区域 */mpu_region_init_handle.Number = rnum;                                /* 设置保护区域 */mpu_region_init_handle.BaseAddress = baseaddr;                       /* 设置基址 */mpu_region_init_handle.DisableExec = de;                             /* 是否允许指令访问 */mpu_region_init_handle.Size = size;                                  /* 设置保护区域大小 */mpu_region_init_handle.SubRegionDisable = 0X00;                      /* 禁止子区域 */mpu_region_init_handle.TypeExtField = MPU_TEX_LEVEL0;                /* 设置类型扩展域为level0 */mpu_region_init_handle.AccessPermission = (uint8_t)ap;               /* 设置访问权限, */mpu_region_init_handle.IsShareable = sen;                            /* 是否共用? */mpu_region_init_handle.IsCacheable = cen;                            /* 是否cache? */mpu_region_init_handle.IsBufferable = ben;                           /* 是否缓冲? */HAL_MPU_ConfigRegion(&mpu_region_init_handle);                       /* 配置MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);                              /* 开启MPU */return 0;
}/*** @brief       设置需要保护的存储块* @param       无* @note        必须对部分存储区域进行MPU保护,否则可能导致程序运行异常*              比如MCU屏不显示,摄像头采集数据出错等等问题...*/
void mpu_memory_protection(void)
{/* 保护整个DTCM,共128K字节 */mpu_set_protection( 0x20000000,                 /* 基地址 */MPU_REGION_SIZE_128KB,      /* 长度 */MPU_REGION_NUMBER1, 0,      /* NUMER1,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_CACHEABLE,       /* 允许cache */MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 *//* 保护整个AXI SRAM,共512K字节 */mpu_set_protection( 0x24000000,                 /* 基地址 */MPU_REGION_SIZE_512KB,      /* 长度 */MPU_REGION_NUMBER2, 0,      /* NUMER2,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_SHAREABLE,       /* 允许共用 */MPU_ACCESS_CACHEABLE,       /* 允许cache */MPU_ACCESS_NOT_BUFFERABLE); /* 禁止缓冲 *//* 保护整个SRAM1~SRAM3,共512K字节 */mpu_set_protection( 0x30000000,                 /* 基地址 */MPU_REGION_SIZE_512KB,      /* 长度 */MPU_REGION_NUMBER3, 0,      /* NUMER3,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_CACHEABLE,       /* 允许cache */MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 *//* 保护整个SRAM4,共64K字节 */mpu_set_protection( 0x38000000,                 /* 基地址 */MPU_REGION_SIZE_64KB,       /* 长度 */MPU_REGION_NUMBER4, 0,      /* NUMER4,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_CACHEABLE,       /* 允许cache */MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 *//* 保护MCU LCD屏所在的FMC区域,共64M字节 */mpu_set_protection( 0x60000000,                 /* 基地址 */MPU_REGION_SIZE_64MB,       /* 长度 */MPU_REGION_NUMBER5, 0,      /* NUMER5,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_NOT_CACHEABLE,   /* 禁止cache */MPU_ACCESS_NOT_BUFFERABLE); /* 禁止缓冲 *//* 保护SDRAM区域,共32M字节 */mpu_set_protection( 0xC0000000,                 /* 基地址 */MPU_REGION_SIZE_32MB,       /* 长度 */MPU_REGION_NUMBER6, 0,      /* NUMER6,允许指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_CACHEABLE,       /* 允许cache */MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 *//* 保护整个NAND FLASH区域,共256M字节 */mpu_set_protection( 0x80000000,                 /* 基地址 */MPU_REGION_SIZE_256MB,      /* 长度 */MPU_REGION_NUMBER7, 1,      /* NUMER7,禁止指令访问 */MPU_REGION_FULL_ACCESS,     /* 全访问 */MPU_ACCESS_NOT_SHAREABLE,   /* 禁止共用 */MPU_ACCESS_NOT_CACHEABLE,   /* 禁止cache */MPU_ACCESS_NOT_BUFFERABLE); /* 禁止缓冲 */
}

最后再测试的时候,就可以得到正常的结果了:

结论

在配置STM32H7的SDRAM的时候(其实不止这个,在配置有关内存的时候),都需要配置好内存保护单元。内存单元的配置在CubeMX中CORTEX_M7中配置,注意要关闭Speculation default mode(推测默认模式),也是为了减少不必要的麻烦、提高稳定性或满足特定安全要求。

相关文章:

【CubeMX-HAL库】STM32H743II——SDRAM配置所遇问题

推荐的博客和视频&#xff1a; 1、【CubeMX-HAL库】STM32H743—FMC配置SDRAM_stm32h743 sdram 速度-CSDN博客 2、【【STM32CubeMX教程】STM32全外设原理、配置和常用HAL、LL库API使用详解】 3、在百度网盘里有STM32H743的例程&#xff1a;【通过网盘分享的文件&#xff1a;S…...

mac上使用docker搭建gitlab

在 Mac 上搭建 GitLab 可以使用 Docker 来简化安装过程 一、安装详细步骤 1. 安装 Docker 如果你尚未安装 Docker&#xff0c;可以通过以下步骤安装&#xff1a; 下载并安装 Docker Desktop for Mac.安装完成后&#xff0c;启动 Docker Desktop&#xff0c;确保 Docker 运行…...

二维数组操作

代码结构 main.c #include <stdio.h> #include <stdlib.h>#define LEN 100int main() {//通过指针引用多维数组# if 1//定义多维数组int a[3][5] {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};int row sizeof(a) /sizeof(a[0]);int colum sizeof(a[0]) / sizeof(a[0…...

uniapp设置tabBar高斯模糊并设置tabBar高度占位

1、设置tabBar高斯模糊 2、设置tabBar高度占位 &#xff08;1&#xff09;需要先在App.vue中获取一下 uni.getSystemInfoSync().windowBottom; //返回值是tabBar的高度&#xff08;2&#xff09;在app.vue中定义一个全局样式 3、在需要的页面底部&#xff0c;加上一个view&…...

上市公司代理成本数据大全(第一类和第二类代理成本均有)1991-2023年

一、计算方式&#xff1a; &#xff08;1&#xff09; 第一类代理成本 AC1:经营费用率&#xff0c;参考顶刊《管理世界》李文贵和余明桂(2015)老师的研究构建代理成本 AC2:管理费用率&#xff0c;参考C刊《经济管理》彭雅哲和汪昌云(2021) 老师的研究构建代理成本 AC3:资产周转…...

CA-Markov模型概述及其MATLAB实现

CA-Markov模型概述及其MATLAB实现 1 Markov模型2 CA-Markov模型2.1 元胞自动机(Cellular Aumatomata, 简称CA)2.1.1 构成2.2 准确度评估(Accuracy assessment)2.2.1 Kappa coefficient参考1.参考文献2.其它参考资料1 Markov模型 Markov模型是一种数学模型,用于描述系统在不…...

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講&#xff1a;訓練不了人工智慧嗎&#xff1f;你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符&#xff0c;使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…...

HCIP-HarmonyOS Application Developer 习题(二十二)

1、用户将手机导航迁移至智能手表之后&#xff0c;智能手表如果需要获取手机传过来的数据&#xff0c;从下列哪个方法中获取? A、onCompleteContinuation() B、onStartContinuation() C、onRestoreData() D、onSaveData() 答案&#xff1a;C 分析&#xff1a;FA发起迁移后&am…...

c++原型模式(Prototype Pattern)

原型模式&#xff08;Prototype Pattern&#xff09; 原型模式是一种创建型设计模式&#xff0c;它允许你通过复制现有对象来创建新的对象&#xff0c;而不是通过类实例化来创建对象。这种模式在开发时需要大量类似对象的情况下非常有用。原型模式的核心是一个具有克隆方法的接…...

联通大数据面试题及参考答案

Flink 是怎么使用的? Flink 是一个分布式流批一体的开源平台,以下是其一般使用步骤及相关要点: 环境搭建 首先要根据需求选择合适的部署模式,比如本地模式用于开发测试,集群模式(如 Standalone、YARN、Kubernetes 等)用于生产环境。安装相应的 JDK 版本(Flink 基于 Ja…...

MySQL数据库:SQL语言入门 【3】(学习笔记)

目录 5&#xff0c;TCL —— 事务控制语言&#xff08;Transaction Control Language&#xff09; &#xff08;1&#xff09;事务的概念作用 &#xff08;2&#xff09;事务的特性 【1】原子性 【2】一致性 【3】隔离性 【4】持久性 &#xff08;3&#xff09;并发事务带来…...

uniapp 实现tabbar分类导航及滚动联动效果

思路&#xff1a;使用两个scroll-view&#xff0c;tabbar分类导航使用scrollleft移动&#xff0c;内容联动使用页面滚动onPageScroll监听滚动高度 效果图 <template><view class"content" ><view :class"[isSticky ? tab-sticky: ]">…...

华为数字化转型的本质为何是管理变革

随着全球经济的加速数字化转型&#xff0c;企业纷纷进入了数字化时代的大潮。华为作为数字化转型的领军者&#xff0c;已经成功实践了从传统企业向数字化企业的蜕变。对于企业而言&#xff0c;数字化转型不仅仅是新技术的应用&#xff0c;更是一场管理变革。在这场变革的背后&a…...

【数据库】深入解析慢 SQL 的识别与优化策略

文章目录 什么是慢 SQL&#xff1f;慢 SQL 的危害如何检测分析慢 SQL使用 MySQL 慢查询日志利用 EXPLAIN 分析执行计划通过 Profiling 获取详细执行信息借助慢 SQL 收集分析平台 实际案例解析&#xff1a;600秒的慢 SQL 优化之旅问题描述初步分析优化步骤1. 优化 SQL 语句结构2…...

Linux从入门到精通

远程连接linux操作系统 Linux的图形化界面并不稳定&#xff0c;因此往往使用命令行去接触Linux操作系统 远程连接到Linux操作系统需要借助一个叫做finalshell的软件&#xff0c;官方地址如下&#xff1a; finalshell官方下载 在linux的terminal终端中输入指令 ifconfig就可以…...

代码随想录算法训练营第四十四天|Day44 动态规划

1143.最长公共子序列 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ye4y1L7CQ https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 #define max(a, b) ((a) > (b) ? (a) : (b)) int longestCommonSu…...

C++初阶——优先队列

一、什么是优先队列 优先队列是一个容器适配器&#xff0c;存储于优先队列中的元素按照某种优先级自动排序。优先队列类似于堆&#xff0c;元素可以随时插入&#xff0c;但是只能弹出优先级最高的元素。默认是一个大根堆&#xff0c;也就是元素越大&#xff0c;优先级越高。 二…...

10月月报 | Apache DolphinScheduler进展总结

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区10月份月报更新啦&#xff01;这里将记录 DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度Merge之星 感谢以下小伙伴10月份为 Apache DolphinScheduler 所做的精彩贡献&#xff08;排…...

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统

安装WSL命令 管理员打开PowerShell或Windows命令提示符&#xff0c;输入wsl --install&#xff0c;然后回车 注意&#xff1a;此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意&#xff1a;默认安装最新的Ubuntu发行版。 注意&#xff1a;默认安装路径是…...

《AI 之影》

《AI 之影》 城市的喧嚣如同一幅永不停息的画卷&#xff0c;在钢筋水泥的丛林中&#xff0c;人们匆忙地穿梭&#xff0c;追逐着各自的梦想与欲望。而在这看似平凡的都市之中&#xff0c;一场悄然的变革正在酝酿。 他叫佑介&#xff0c;一个孤独的城市漫步者。每天&#xff0c;他…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...