STM32专题之内部FLASH详解
目录一、小叙内部Flash二、庖丁解牛之STM32内部Flash的构成三、寻觅将应用程序写入到内部Flash的底层逻辑四、熟稔于心工程的空间分布五、实践出真知之代码实战5.1 库函数是工具5.2 如何使用内部Flash存储数据实验接下来进入正题一、小叙内部FlashSTM32芯片内部有一个Flash可以通过下载器烧录进去程序并且由于Flash本身的特性是掉电不丢失所以芯片复位的话内核就从该内部Flash加载代码并运行。这里需要注意除了使用下载器读取Flash内部数据在运行期间芯片也能对内部Flash进行读写所以除了本身的应用程序如果还有空余空间此空间还可以用来保存一些需要掉电不丢失的数据类似于SPI Flash保存的数据。访问内部的Flash速度要比访问SPI Flash要快的多所以紧急情况下还可以保存一些关键记录。有时为了防止程序被更改还会禁止读写Flash的内容可能是第一次运行时计算加密的信息存储到某些区域然后再删除自身的加密代码不留痕迹这将会涉及到对Flash的操作那么这就会引出下面的内容二、庖丁解牛之STM32内部Flash的构成四个区域即主存储区、系统存储区、OTP区域以及选项字节区域。主存储区我们所说的内部Flash大小1MB就是指这个区域。是用来存储应用程序/代码的。由图可知主存储区分为2部分块1和块2共2MB我们的STM32F407ZGT6主存储区大小1MB所以只有块1。双块存储格式由于我们的芯片不支持此功能目前这里只提一下需要详细了解可参考教程系统存储区用户不能访问此区域是一段芯片出厂固化的启动代码用来实现串口、USB、以及CAN等ISP烧录功能。OTP区域One Time Program一次写入的存储区域512字节写入后不能更改常用于存储应用程序的加密密钥。选项字节配置Flash的读写保护、电源管理中的BOR级别、软件/硬件看门狗等功能共32字节通过修改FLASH的选项控制寄存器修改。三、寻觅将应用程序写入到内部Flash的底层逻辑1.写入前先对Flash解锁2.在擦除扇区和写入数据时还要先设置最大操作位数通过配置FLASH_CR寄存器的PSIZE位这是由于电源电压的影响3.写入数据前先擦除存储区域也就是擦除扇区4.擦除完毕就可以写入数据这里需要注意的是写入数据时不仅是使用指针对地址赋值赋值前还需要配置一系列的寄存器这里卖个关子具体配置哪些见下文。为什么要解锁被上锁了为什么上锁这是由于FLASH里面存储的是应用程序非常重要防止误操作被修改在芯片复位后默认会给FLASH上锁上锁后是不允许设置FLASH的控制寄存器也不能修改FLASH内的内容。但是我们需要写入内容到FLASH中就要先解锁怎么解锁呢其实很简单的只需要在FLASH的秘钥寄存器FLASH_KEYR中依次写入KEY10x45670123KEY2 0xCDEF89AB即可。为什么要设置最大操作位数通过配置FLASH_CR寄存器的PSIZE位来设置电源电压由于电源电压会影响最大操作位数进而直接会影响到擦除和写入的速度。大部分使用32位的宽度量产时可能就是64位的宽度此外还需要vpp引脚外加8-9v的电压源且通电时间1h否则FLASH将损坏。接下来就开始扇区擦除扇区擦除指令是STM32提供好的其中批量擦除指令仅针对主存储区。扇区擦除分3步1.检测忙不即查看FLASH_SR的BSY位为0则当前未执行任何FLASH操作。2.激活扇区擦除功能、选择是哪个扇区并且执行开始擦除。即将FLASH_CR中的SER位置1并设置SNB位为扇区编号是哪个也就是哪个扇区要擦除最后START位置1将开始擦除。3、检测忙不即查看FLASH_SR的BSY位为0则表示擦除完成。擦除完毕就可以写入数据了。写入数据也分3步走1.检测忙不即查看FLASH_SR的BSY位为0则当前未执行任何FLASH操作。2.激活FLASH编程后对存储地址执行写入操作。即将FLASH_CR的PG位置1表示激活FLASH编程然后对对应的存储器地址主存储区或OTP区进行写入数据操作。3.检测忙不即查看FLASH_SR的BSY位为0则表示写入完成。四、熟稔于心工程的空间分布在使用内部Flash存储其它数据之前一定要了解空间分布即内部Flash哪段空间写入了程序代码。怎么查看两个方法1.双击工程的主文件夹 2.Listing文件夹中找Template.map文件我们要找的内容在.map文件的后面部分是一段以Mermory Map of the image开头的记录 Memory Map of the image Image Entry point : 0x08000189 Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000e28, Max: 0x00100000, ABSOLUTE) Execution Region ER_IROM1 (Base: 0x08000000, Size: 0x00000e14, Max: 0x00100000, ABSOLUTE) Base Addr Size Type Attr Idx E Section Name Object 0x08000000 0x00000188 Data RO 3 RESET startup_stm32f40xx.o 0x08000188 0x00000000 Code RO 4960 * .ARM.Collect$$$$00000000 mc_w.l(entry.o) 0x08000188 0x00000004 Code RO 5224 .ARM.Collect$$$$00000001 mc_w.l(entry2.o) 0x0800018c 0x00000004 Code RO 5227 .ARM.Collect$$$$00000004 mc_w.l(entry5.o) 0x08000190 0x00000000 Code RO 5229 .ARM.Collect$$$$00000008 mc_w.l(entry7b.o) 0x08000190 0x00000000 Code RO 5231 .ARM.Collect$$$$0000000A mc_w.l(entry8b.o) 0x08000190 0x00000008 Code RO 5232 .ARM.Collect$$$$0000000B mc_w.l(entry9a.o) 0x08000198 0x00000000 Code RO 5234 .ARM.Collect$$$$0000000D mc_w.l(entry10a.o) 0x08000198 0x00000000 Code RO 5236 .ARM.Collect$$$$0000000F mc_w.l(entry11a.o) 0x08000198 0x00000004 Code RO 5225 .ARM.Collect$$$$00002712 mc_w.l(entry2.o) 0x0800019c 0x00000024 Code RO 4 .text startup_stm32f40xx.o 0x080001c0 0x00000062 Code RO 5241 .text mc_w.l(uldiv.o) 0x08000222 0x00000002 PAD 0x08000224 0x00000024 Code RO 5254 .text mc_w.l(init.o) 0x08000248 0x0000001e Code RO 5256 .text mc_w.l(llshl.o) 0x08000266 0x00000020 Code RO 5258 .text mc_w.l(llushr.o) 0x08000286 0x00000002 Code RO 4796 i.BusFault_Handler stm32f4xx_it.o 0x08000288 0x00000002 Code RO 4797 i.DebugMon_Handler stm32f4xx_it.o 0x0800028a 0x00000002 PAD 0x0800028c 0x000000a8 Code RO 4877 i.Debug_USART_Config bsp_debug_usart.o 0x08000334 0x00000070 Code RO 1415 i.FLASH_EraseSector stm32f4xx_flash.o 0x080003a4 0x0000003c Code RO 1417 i.FLASH_GetStatus stm32f4xx_flash.o 0x080003e0 0x00000010 Code RO 1421 i.FLASH_Lock stm32f4xx_flash.o 0x080003f0 0x00000038 Code RO 1442 i.FLASH_ProgramByte stm32f4xx_flash.o 0x08000428 0x0000003c Code RO 1444 i.FLASH_ProgramHalfWord stm32f4xx_flash.o 0x08000464 0x00000024 Code RO 1447 i.FLASH_Unlock stm32f4xx_flash.o 0x08000488 0x00000022 Code RO 1448 i.FLASH_WaitForLastOperation stm32f4xx_flash.o 0x080004aa 0x0000007c Code RO 1857 i.GPIO_Init stm32f4xx_gpio.o 0x08000526 0x00000020 Code RO 1858 i.GPIO_PinAFConfig stm32f4xx_gpio.o 0x08000546 0x00000002 Code RO 4798 i.HardFault_Handler stm32f4xx_it.o 0x08000548 0x00000002 Code RO 4799 i.MemManage_Handler stm32f4xx_it.o 0x0800054a 0x00000002 Code RO 4800 i.NMI_Handler stm32f4xx_it.o 0x0800054c 0x00000026 Code RO 4878 i.NVIC_Configuration bsp_debug_usart.o 0x08000572 0x00000002 PAD 0x08000574 0x00000068 Code RO 155 i.NVIC_Init misc.o 0x080005dc 0x00000014 Code RO 156 i.NVIC_PriorityGroupConfig misc.o 0x080005f0 0x00000002 Code RO 4801 i.PendSV_Handler stm32f4xx_it.o 0x080005f2 0x00000002 PAD 0x080005f4 0x0000001c Code RO 2561 i.RCC_AHB1PeriphClockCmd stm32f4xx_rcc.o 0x08000610 0x0000001c Code RO 2573 i.RCC_APB2PeriphClockCmd stm32f4xx_rcc.o 0x0800062c 0x000000a4 Code RO 2582 i.RCC_GetClocksFreq stm32f4xx_rcc.o 0x080006d0 0x00000002 Code RO 4802 i.SVC_Handler stm32f4xx_it.o 0x080006d2 0x00000002 PAD 0x080006d4 0x000000b8 Code RO 13 i.SetSysClock system_stm32f4xx.o 0x0800078c 0x00000002 Code RO 4803 i.SysTick_Handler stm32f4xx_it.o 0x0800078e 0x00000002 PAD 0x08000790 0x0000005c Code RO 15 i.SystemInit system_stm32f4xx.o 0x080007ec 0x0000002c Code RO 4804 i.USART1_IRQHandler stm32f4xx_it.o 0x08000818 0x00000018 Code RO 4511 i.USART_Cmd stm32f4xx_usart.o 0x08000830 0x0000000e Code RO 4514 i.USART_GetFlagStatus stm32f4xx_usart.o 0x0800083e 0x00000040 Code RO 4515 i.USART_GetITStatus stm32f4xx_usart.o 0x0800087e 0x00000036 Code RO 4517 i.USART_ITConfig stm32f4xx_usart.o 0x080008b4 0x000000bc Code RO 4518 i.USART_Init stm32f4xx_usart.o 0x08000970 0x00000008 Code RO 4525 i.USART_ReceiveData stm32f4xx_usart.o 0x08000978 0x00000008 Code RO 4528 i.USART_SendData stm32f4xx_usart.o 0x08000980 0x00000002 Code RO 4805 i.UsageFault_Handler stm32f4xx_it.o 0x08000982 0x00000002 PAD 0x08000984 0x00000020 Code RO 5096 i.__0printf$5 mc_w.l(printf5.o) 0x080009a4 0x0000000e Code RO 5266 i.__scatterload_copy mc_w.l(handlers.o) 0x080009b2 0x00000002 Code RO 5267 i.__scatterload_null mc_w.l(handlers.o) 0x080009b4 0x0000000e Code RO 5268 i.__scatterload_zeroinit mc_w.l(handlers.o) 0x080009c2 0x00000002 PAD 0x080009c4 0x000002c0 Code RO 5103 i._printf_core mc_w.l(printf5.o) 0x08000c84 0x00000024 Code RO 4883 i.fputc bsp_debug_usart.o 0x08000ca8 0x0000011c Code RO 4936 i.inter_flash_test bsp_inter_flash.o 0x08000dc4 0x00000030 Code RO 4765 i.main main.o 0x08000df4 0x00000020 Data RO 5264 Region$$Table anon$$obj.o这一段就是该工程的ROM存储器分布映像在STM32中ROM区域的内容就是存储到内部Flash的代码。其中Load Region LR_IROM1指的的加载空间Execution Region ER_IROM1指的是执行空间。代码包含程序和数据在芯片中时如何运行的在芯片刚上电时会加载程序和数据例如他会从程序的存储区域加载到执行区域还把一些已初始化的全局变量从ROM复制到RAM中以便程序运行时可以修改变量的内容。加载完成后程序开始从执行区域开始执行。从上面的代码可以看出加载空间和执行空间的基地址都是0x0800 0000对应的正是内部Flash的起始地址也就是说STM32的内部Flash就直接是执行空间他们大小分别是0x00000e28和0x00000e14执行空间ROM比较小的原因是因为部分RW-Data类型的变量被COPY到RAM空间了。他们的最大空间都是0x00100000等于1MB也就是内部Flash的最大空间。计算程序占用的空间时需要使用加载区域的大小计算。这里例子使用的内部Flash区域就是0x0800 0000到0x0800 0000 0x0000 0e28地址的空间区域。我们经过对比STM32内部Flash的构成那个表可以看出仅使用扇区0就可以满足本程序那么扇区1后面的空间就可以应用其它用途了。加载空间和执行空间描述之后是一个ROM详细地址分布表它列出了各段的基址、大小Type是该段的类型CODE表示代码DATA表示数据PAD表示段之间的填充区域为了地址对齐。五、实践出真知之代码实战5.1 库函数是工具1、FLASH解锁、上锁函数//stm32f4xx_flash.c void FLASH_Unlock(void) { if((FLASH-CR FLASH_CR_LOCK) ! RESET) { /* Authorize the FLASH Registers access */ FLASH-KEYR FLASH_KEY1; FLASH-KEYR FLASH_KEY2; } }//stm32f4xx_flash.c void FLASH_Lock(void) { /* Set the LOCK Bit to lock the FLASH Registers access */ FLASH-CR | FLASH_CR_LOCK; }这里复习下和|的用法任何数 1 任何数任何数 0 0。任何数 | 1 1任何数 | 0 任何数。2、设置操作位数和擦除扇区//stm32f4xx_flash.c FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange) { uint32_t tmp_psize 0x0; FLASH_Status status FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_FLASH_SECTOR(FLASH_Sector)); assert_param(IS_VOLTAGERANGE(VoltageRange)); if(VoltageRange VoltageRange_1) { tmp_psize FLASH_PSIZE_BYTE; } else if(VoltageRange VoltageRange_2) { tmp_psize FLASH_PSIZE_HALF_WORD; } else if(VoltageRange VoltageRange_3) { tmp_psize FLASH_PSIZE_WORD; } else { tmp_psize FLASH_PSIZE_DOUBLE_WORD; } /* Wait for last operation to be completed 即等待上一步操作完成*/ status FLASH_WaitForLastOperation(); if(status FLASH_COMPLETE) { /* if the previous operation is completed, proceed to erase the sector */ FLASH-CR CR_PSIZE_MASK;//CR的第9位和第10位清0即PSIZE位清0 FLASH-CR | tmp_psize; FLASH-CR SECTOR_MASK; FLASH-CR | FLASH_CR_SER | FLASH_Sector;//激活扇区并选中某个扇区 FLASH-CR | FLASH_CR_STRT; /* Wait for last operation to be completed */ status FLASH_WaitForLastOperation(); /* if the erase operation is completed, disable the SER Bit */ FLASH-CR (~FLASH_CR_SER); FLASH-CR SECTOR_MASK; } /* Return the Erase Status */ return status; }3、写入数据//stm32f4xx_flash.c FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data) { FLASH_Status status FLASH_COMPLETE; /* Check the parameters */ assert_param(IS_FLASH_ADDRESS(Address)); /* Wait for last operation to be completed */ status FLASH_WaitForLastOperation(); if(status FLASH_COMPLETE) { /* if the previous operation is completed, proceed to program the new data */ FLASH-CR CR_PSIZE_MASK; FLASH-CR | FLASH_PSIZE_WORD; FLASH-CR | FLASH_CR_PG; *(__IO uint32_t*)Address Data; /* Wait for last operation to be completed */ status FLASH_WaitForLastOperation(); /* if the program operation is completed, disable the PG Bit */ FLASH-CR (~FLASH_CR_PG); } /* Return the Program Status */ return status; }5.2 如何使用内部Flash存储数据实验编程思路1、解锁 2、找出空闲区擦除目标区 3、进行读写测试为了方便的向FLASH_CR的SNB位写入要擦除的扇区号我们自定义一个GetSector函数用来实现根据内部的FLASH地址找出所在的扇区并返回该扇区对应的SNB位寄存器的值。static uint32_t GetSector(uint32_t Address) { uint32_t sector 0; if((Address ADDR_FLASH_SECTOR_1) (Address ADDR_FLASH_SECTOR_0)){ sector FLASH_Sector_0; } else if((Address ADDR_FLASH_SECTOR_2) (Address ADDR_FLASH_SECTOR_1)){ sector FLASH_Sector_1; } else if((Address ADDR_FLASH_SECTOR_3) (Address ADDR_FLASH_SECTOR_2)){ sector FLASH_Sector_2; } else if((Address ADDR_FLASH_SECTOR_4) (Address ADDR_FLASH_SECTOR_3)){ sector FLASH_Sector_3; } else if((Address ADDR_FLASH_SECTOR_5) (Address ADDR_FLASH_SECTOR_4)){ sector FLASH_Sector_4; } else if((Address ADDR_FLASH_SECTOR_6) (Address ADDR_FLASH_SECTOR_5)){ sector FLASH_Sector_5; } else if((Address ADDR_FLASH_SECTOR_7) (Address ADDR_FLASH_SECTOR_6)){ sector FLASH_Sector_6; } else if((Address ADDR_FLASH_SECTOR_8) (Address ADDR_FLASH_SECTOR_7)){ sector FLASH_Sector_7; } else if((Address ADDR_FLASH_SECTOR_9) (Address ADDR_FLASH_SECTOR_8)){ sector FLASH_Sector_8; } else if((Address ADDR_FLASH_SECTOR_10) (Address ADDR_FLASH_SECTOR_9)){ sector FLASH_Sector_9; } else if((Address ADDR_FLASH_SECTOR_11) (Address ADDR_FLASH_SECTOR_10)){ sector FLASH_Sector_10; } else { sector FLASH_Sector_11; } return sector; }编写测试代码--思路如下1、解锁2、清除标志位3、擦除扇区4、写值以字为单位5、上锁6、校验#define FLASH_USER_START_ADDR ADDR_FLASH_SECTOR_8 #define FLASH_USER_END_ADDR ADDR_FLASH_SECTOR_11 #define DATA_32 ((uint32_t) 0x00000000) int InternalFlash_Test(void) { uint32_t uwStartSector 0;//起始扇区 uint32_t uwEndSector 0;//结束扇区 uint32_t uwAddress 0; uint32_t uwSectorCounter 0; __IO uint32_t uwData32 0; __IO uint32_t uwMemoryProgramStatus 0; /* FLASH 解锁 */ FLASH_Unlock(); /* 清除各种FLASH的标志位 */ FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); uwStartSector GetSector(FLASH_USER_START_ADDR); uwEndSector GetSector(FLASH_USER_END_ADDR); /* 开始擦除操作 */ uwSectorCounter uwStartSector; while(uwSectorCounter uwEndSector){ if(FLASH_EraseSector(uwSectorCounter, VoltageRange_3) ! FLASH_COMPLETE){ return -1; } /* 计数器指向下一个扇区 */ uwSectorCounter 8; } /* 以字为单位写入数据 */ uwAddress FLASH_USER_START_ADDR; while(uwAddress FLASH_USER_END_ADDR){ if(FLASH_ProgramWord(uwAddress, DATA_32) FLASH_COMPLETE){ uwAddress 4; //表示向后偏移四个字节 } else { return -1; } } /* FLASH 上锁 */ FLASH_Lock(); /* 校验 */ uwAddress FLASH_USER_START_ADDR; uwMemoryProgramStatus 0; while(uwAddress FLASH_USER_END_ADDR) { uwData32 *(__IO uint32_t *)uwAddress; if(uwData32 ! DATA_32) { uwMemoryProgramStatus; } uwAddress 4; } /* 数据校验 */ if(uwMemoryProgramStatus) { return -1; } else { return 0; } }最后main函数执行测试函数#include stm32f4xx.h #include ./usart/bsp_debug_usart.h #include ./led/bsp_led.h #include ./interFLASH/bsp_inter_flash.h /** * brief 主函数 * param 无 * retval 无 */ int main(void) { /*初始化USART 配置模式为 115200 8-N-1 */ Debug_USART_Config(); LED_GPIO_Config(); LED_BLUE; printf(下面将开始进行读写内部FLASH实验\r\n); if(InternalFlash_Test() 0) { LED_GREEN; printf(读写内部FLASH实验测试成功\r\n); } else { printf(读写内部FLASH实验测试失败\r\nd); LED_RED; } while(1) { } }详细的代码已共享到附件。

相关新闻

DeepSeek Harness 快速上手!

DeepSeek Harness 快速上手!

一、DeepSeek Harness 介绍 1.1 什么是 DeepSeek Harness DeepSeek Harness(简称 DSH)是 DeepSeek 开源的一款 AI 智能体开发平台:提供网页界面、会话管理,以及代码执行、文件操作、任务看板、SSH 运维等工具能力,让开发者像使用集成开发环境(IDE)一样与…

2026/8/26 15:58:11 阅读更多 →
南大:自进化神经符号技能提升空间推理

南大:自进化神经符号技能提升空间推理

📖标题:Self-Evolving Neuro-Symbolic Skills for Tool-Augmented Spatial Reasoning 🌐来源:arXiv, 2608.07955 🛎️文章简介 🔸研究问题:如何让大型视觉语言模型通过积累可复用的技能而非从零…

2026/8/26 16:15:07 阅读更多 →
实时汇率查询 API 怎么用?从接口调用到实时汇率获取的完整教程

实时汇率查询 API 怎么用?从接口调用到实时汇率获取的完整教程

一、需求背景在做跨境电商、国际结算、外汇展示或多币种报价时,经常需要接入一个稳定的汇率查询接口。本文以实时汇率查询换算接口为例,演示如何通过 Java 发起请求并解析汇率数据。二、接口信息参数必填说明from是源币种代码,如 CNYto是目标…

2026/8/26 17:38:00 阅读更多 →

最新新闻

数字化转型:制造企业价值链及AI在其中的应用

数字化转型:制造企业价值链及AI在其中的应用

一、引言:制造业数字化转型的时代背景 制造业是国民经济的基石,也是衡量一个国家工业实力和综合竞争力的关键标志。从蒸汽机开启的第一次工业革命,到电力驱动的大规模流水线生产,再到自动化与信息技术的普及,制造业始…

2026/8/26 20:32:55 阅读更多 →
个人技术资源导航合集:PostgreSQL、Linux、Python、Android 等常用工具与学习资料

个人技术资源导航合集:PostgreSQL、Linux、Python、Android 等常用工具与学习资料

摘要:本文是一篇个人技术资源导航合集,汇总了日常开发中常用的工具与学习资料,涵盖 PostgreSQL、Linux、Python、Android、协议、ffmpeg、appium 等方向,方便读者快速定位所需资源,提升学习和开发效率。 本文是一篇个…

2026/8/26 20:32:55 阅读更多 →
迁移WSL时的报错:0x80073d21 此应用的发布者不允许将其移动到其他位置

迁移WSL时的报错:0x80073d21 此应用的发布者不允许将其移动到其他位置

本文旨在防止想迁移Windows下的Linux到C盘以外的小伙伴掉进坑里。 避免踩坑,迁移WSL一定要用LxRunOffline!!! LxRunOffline:https://github.com/DDoSolitary/LxRunOffline/releases 如果使用过程中报以下错误&#xf…

2026/8/26 20:32:55 阅读更多 →
【通刷】晶晨A311D和晶晨S922X-slimbox 9.20-ATV-安卓9_刷机固件包

【通刷】晶晨A311D和晶晨S922X-slimbox 9.20-ATV-安卓9_刷机固件包

【通刷】晶晨A311D和晶晨S922X-slimbox 9.20-ATV-安卓9_刷机固件包刷机固件下载:链接: https://pan.baidu.com/s/1EyYgLNZlxv-UvHpmTRxA_g?pwd5v8w 提取码: 5v8w链接:https://www.123865.com/s/Jbe8Vv-DwGN 提取码:6688备用链接:…

2026/8/26 20:32:55 阅读更多 →
shell编程---变量

shell编程---变量

shell编程---变量shell 脚本编程与编译程序编程一样,都可以定义变量,变量其实就是一个标签,用于记录特定的内容。 Shell 变量一般初始值为空值,除非必要赋值。 变量赋值方法为:变量名 变量值(赋值符号两边不…

2026/8/26 20:32:55 阅读更多 →
AI 会取代程序员吗?

AI 会取代程序员吗?

因 AI 编程工具被推出, 人们开启思考, “AI 会不会取代程序员? ”, AI 行业持续推出新的升级以及更新, 所以好多人担忧, 能完全取代人类程序员的 AI 工具或许很快会成为主流。然而, 实际状况断然绝非这般。此篇文章会对AI替代程序员的可能性予以评估, 而且会介绍怎样依靠掌握关…

2026/8/26 20:31:55 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →