STM32L011K4 Flash 操作

__attribute__((section(”XXXX“)))的编译属性---section __attribute__((section(”name“)))是gcc编译器支持的一个编译特性(arm编译器也支持此特性),实现在编译时把某个函数/数据放到name的数据段中。 阅读详情

转载一篇文章STM32L011K4 Flash 操作

STM32L011K4 Flash 操作

在L011中,除了普遍的Flash和OB外,还有EEPROM,而且还可以让Flash掉电运行.所以,他其实有4个密码,没错,是4个密码啊.如果Flash掉电了,那么就要RAM运行,也可以省一些电的.在Keil中这样定义RAM中运行代码.

__attribute__ ((section (".ramcode"))) void MyFunc(void){
	while(1);
}

不过这2K RAM,是不是真的有点小呢,对于如果在RAM运行,就看要运行的小代码多大了.当然建议把Flash操作过程代码都放在RAM调试,当OK了再转移到Flash,不然调试过程因为Flash没法获取就没法调试了.
说回来那4个钥匙,手册也给了我们.

FLASH->PDKEYR = 0x04152637;
FLASH->PDKEYR = 0xFAFBFCFD;
FLASH->PEKEYR = 0x89ABCDEF;
FLASH->PEKEYR = 0x02030405;
FLASH->PRGKEY = 0x8C9DAEBF;
FLASH->PRGKEY = 0x13141516;
FLASH->OPTKEY = 0xFBEAD9C8;
FLASH->OPTKEY = 0x24252627;

开锁顺序我也整理了一下.

  1. 编程EEPROM:PEKEY
  2. 编程Flash扇区:PEKEY+PRGKEY
  3. 编程OP字节:PEKEY+PRGKEY+OPTKEY
  4. 编程Flash RunMode 下掉电模式:PDKEY

EEPROM的地址范围是0x08080000 – 0x080801FF,测试程序如下.

uint8_t i = 0;
__attribute__ ((section (".ramcode"))) void EEPROM_WriteBytes(uint32_t addr, uint8_t code)
{
    /* 储存总线没有进行写入/擦除工作. */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 输入密码解锁储存器 */
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    /* 等待解锁成功 */
    while(FLASH->PECR & FLASH_PECR_PELOCK);
    /* 编程内容 */
    *(uint8_t *)(addr) = code;
    /* 等待编程完成 */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 加锁储存器 */
    FLASH->PECR |= FLASH_PECR_PELOCK;
}
int main(void)
{
    for(i = 0; i < 0xff; i++)
    {
        EEPROM_WriteBytes(0x08080000, i);
        if(*(uint8_t *)(0x08080000) != i)
        {
            while(1); /* 错误发生 */
        }
    }
    while (1)
    {
    }
}

当然了,实际操作中,可以全部写完再加锁,甚至可以不加(就是有点不安全吧).EEPROM的寿命是100K次的,也就是10万次,寿命是很足够的记录很多数据.大致推算也有几十MB的写入寿命了,这EEPROM又这么慢,很耐用的.
接下来看看Flash.其中已知Flash编程需要2个Key.根据Flash特性还要先擦后写.每个扇区大小是128B,所以这一系列器件最大的竟然可以到1536扇区.但是这个Flash只支持一次性编程32Bit或者一次性编程16 Word(Half Page).一次性编程Half Page肯定比32Bit不断来回节省的.

#include "stm32l0xx.h"
__attribute__ ((section (".ramcode"))) void Flash_WriteBytes(uint32_t addr, uint32_t code)
{
    /* 储存总线没有进行写入/擦除工作. */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 输入密码解锁储存器 */
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    FLASH->PRGKEYR = 0x8C9DAEBF;
    FLASH->PRGKEYR = 0x13141516;
    /* 等待解锁成功 */
    while(FLASH->PECR & FLASH_PECR_PELOCK);
    /* 设置清除位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 设置编程位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
    /* 给首地址写0x00000000,这样可以擦除这个扇区. */
    *(__IO uint32_t *)addr = 0x00000000U;
    while (FLASH->SR & FLASH_SR_BSY);
    /* 清除编程位 */
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 编程内容 */
    *(__IO uint32_t *)addr = code;
    /* 等待编程完成 */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 加锁储存器 */
    FLASH->PECR |= FLASH_PECR_PELOCK;
    FLASH->PECR |= FLASH_PECR_PRGLOCK;
}
int main(void)
{
    /* 编程第二Word	*/
    Flash_WriteBytes(0x08003F84, 0x87654321);
    /* 编程第三Word时候,因为第一Byte被擦,所以内容会没了. */
    Flash_WriteBytes(0x08003F88, 0x87654321);
    /* 当然编程第一Word也没问题. */
    while (1)
    {
    }
}

也可以连续写16Word,用Hlaf-Page模式,在需要写16Word时候,这样比较节省时间,只占用一次编程时间.但是16Word需要连续在一个半页范围,不能是一个Page中间抽取一半.

#include "stm32l0xx.h"
__attribute__ ((section (".ramcode"))) void Flash_WriteBytes(uint32_t addr, uint32_t code)
{
    uint8_t i = 0;
    /* 储存总线没有进行写入/擦除工作. */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 输入密码解锁储存器 */
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    FLASH->PRGKEYR = 0x8C9DAEBF;
    FLASH->PRGKEYR = 0x13141516;
    /* 等待解锁成功 */
    while(FLASH->PECR & FLASH_PECR_PELOCK);
    /* 设置清除位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 设置编程位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
    /* 给首地址写0x00000000,这样可以擦除这个扇区. */
    *(__IO uint32_t *)addr = 0x00000000U;
    while (FLASH->SR & FLASH_SR_BSY);
    /* 清除编程位 */
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 设置一次性编程半页 */
    SET_BIT(FLASH->PECR, FLASH_PECR_FPRG);
    /* 编程内容(16Word) */
    for(i = 0; i < 16; i++)
    {
        *(__IO uint32_t *)(addr + i * 4) = code;
    }
    /* 等待编程完成 */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 加锁储存器 */
    FLASH->PECR |= FLASH_PECR_PELOCK;
    FLASH->PECR |= FLASH_PECR_PRGLOCK;
}
int main(void)
{
    /* 编程	*/
    Flash_WriteBytes(0x08003F80, 0x89ABCDEF);
    while (1)
    {
    }
}

如果跨越半Page,也不会出什么问题,只是时间不再是那么优化.编程几个Byte的时候估计也有用,不过就是15Byte优化程度最高.
因为L0不支持8Bit/16Bit/64Bit编程的,所以会出现如图问题.

#include "stm32l0xx.h"
__attribute__ ((section (".ramcode"))) void Flash_WriteBytes(uint32_t addr, uint32_t code)
{
    /* 储存总线没有进行写入/擦除工作. */
    while (FLASH->SR & FLASH_SR_BSY);
    /* 输入密码解锁储存器 */
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    FLASH->PRGKEYR = 0x8C9DAEBF;
    FLASH->PRGKEYR = 0x13141516;
    /* 等待解锁成功 */
    while(FLASH->PECR & FLASH_PECR_PELOCK);
    /* 设置清除位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 设置编程位 */
    SET_BIT(FLASH->PECR, FLASH_PECR_PROG);
    /* 给首地址写0x00000000,这样可以擦除这个扇区. */
    *(__IO uint32_t *)addr = 0x00000000U;
    while (FLASH->SR & FLASH_SR_BSY);
    /* 清除编程位 */
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_PROG);
    CLEAR_BIT(FLASH->PECR, FLASH_PECR_ERASE);
    /* 编程内容 */
    *(__IO uint8_t *)(addr) = code;
    /* 等待编程完成 */
    while (FLASH->SR & FLASH_SR_BSY);
    if(FLASH->SR & FLASH_SR_SIZERR)
    {
        while(1); /* 因为不能以8bit编程,所以会错误,停在这里.编程不了的. */
    }
    /* 加锁储存器 */
    FLASH->PECR |= FLASH_PECR_PELOCK;
    FLASH->PECR |= FLASH_PECR_PRGLOCK;
}
int main(void)
{
    /* 编程	*/
    Flash_WriteBytes(0x08003F80, 0x89ABCDEF);
    while (1)
    {
    }
}

其中SR状态寄存器的内容比较复杂.

  1. FWWER 标志,当写入/擦除过程中有Flash指令读取,就会置位,这个正常操作中不应该出现,可以在编程Flash时候关闭所有中断.
  2. NOTZEROERR  标志,当写入的位置不是0,就是不能写入,不应该编程这些位,如果发现可能是坏块产生了,也可能是逻辑错误.
  3. RDERR 标志,当Flash区域有读保护时候,读取这些内容就会出错.置位这个.
  4. OPTVERR 标志,写OP字节时候,因为OP字节格式不对,所以错误,程序设计问题了,当然对于我们做实验,OP可以自行用工具设置.
  5. SIZERR 标志,只能编译uint32_t格式数据,其他都会这个错,程序可以避免.
  6. PGAERR 标志,编程不对齐,程序逻辑问题.
  7. WRPERR 标志,有写保护,所以错误.
  8. READY 标志,储存器可用.
  9. ENDHV 标志,编程中有高压.
  10. EOP 标志,编程结束.
  11. BSY 标志,繁忙标志.程序常用来判断的标志.

这么看来,除了NOTZEROERR,其他只要程序没问题,就不会发生,而NOTZEROERR,是用久了之后发生的.
下面看看编程OB,编程OB需要3把钥匙.然而其实很简单,主要是要知道OB的作用.

#include "stm32l0xx.h"
void OptionByteProg(uint8_t index, uint16_t data);
__INLINE __attribute__ ((section (".ramcode"))) void OptionByteProg(uint8_t index, uint16_t data)
{
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    FLASH->PRGKEYR = 0x8C9DAEBF;
    FLASH->PRGKEYR = 0x13141516;
    FLASH->OPTKEYR = 0xFBEAD9C8;
    FLASH->OPTKEYR = 0x24252627;
    /* 前16Bit是反码,后16Bit是正常,用来做校验. */
    *(__IO uint32_t *)(OB_BASE + index * 4) = (uint32_t)((~data << 16) | data);
    while(FLASH->SR & FLASH_SR_BSY);
}
int main(void)
{
    /* 编程OB的第二个字节,设置位00000000 00001000,就是给96 - 127扇区写保护. */
    OptionByteProg(2, 0x0008);
    /* 刷新OB,会复位MCU,当然这个程序会导致反复复位. */
    SET_BIT(FLASH->PECR, FLASH_PECR_OBL_LAUNCH);
    /* 这里永远执行不了. */
    while (1)
    {
    }
}

然而OB中的IWDG_ULP 被删除了.

还有一个是Flash的PD位.在RUN模式下,让Flash掉电,那么程序只能在RAM运行了.掉电后就这样了.

#include "stm32l0xx.h"
__attribute__ ((section (".ramcode"))) void Flash_PD_Test(void)
{
		uint32_t i = 0;
		FLASH->PDKEYR = 0x04152637;
		FLASH->PDKEYR = 0xFAFBFCFD;
		FLASH->ACR |= FLASH_ACR_RUN_PD;
		for(i = 0;i<10;i++);
}
int main(void)
{
		Flash_PD_Test();
    while (1)
    {
    }
}

剩下两个寄存器,分析一下,写这些程序就像填空题.

其中针对STM32L011K4有部分是无效的,就不介绍,下面介绍一些在L011K4有效的位.

  1. NZDISABLE 检查是不是已经完整擦除
  2. OBL_LAUNCH 让OB生效,然后会产生复位
  3. ERRIE 错误中断使能
  4. EOPIE 编程完成中断使能
  5. FPRG Half-Page 加速编程模式
  6. ERASE 擦除
  7. FIX 修正一些BUG,加长编程时间.
  8. DATA 编程的位置是EEPROM,然而我测试写不写没所谓.他们地址都不同.
  9. PROG 编程标志
  10. OPTLOCK/PRGLOCK/PELOCK 锁定标志

接着是FLASH_ACR标志.

这里主要是RUN_PD和SLEEP_PD,他们定义在RUN或者SLEEP模式时候,Flash的工作状态,是掉电还是工作中.然后LATENCY是延迟,看现在是Nucleo板子,电压比较高,除了跑32MHz,其他时候都不用.

缓存对于程序有降低功耗和各种的功能.不过如果没FLASH等待的话,性能不会因为缓存而提升.

为什么会降低功耗,因为不用去Flash读取东西了啊.就省了一些.BUF里面有6个缓冲区,当然比什么Cache小很多了,但是也不错了,每个缓冲区大小32Bit,就算存8Bit数据,也是32Bit的.
开Buf是简单事情.

#include "stm32l0xx.h"
int main(void)
{
    FLASH->ACR = FLASH_ACR_PRE_READ | FLASH_ACR_PRFTEN;
    while (1)
    {
    }
}

拓展一下,如果EEPROM是每次都解锁加锁,也太麻烦了.所以,可以一次性解锁,没事时候不加锁,不过就是写程序就是要谨慎一些了.

#include "stm32l0xx.h"
uint32_t i = 0;
int main(void)
{
    FLASH->PEKEYR = 0x89ABCDEF;
    FLASH->PEKEYR = 0x02030405;
    for(i = 0x08080000; i < 0x080801ff; i++)
    {
        *(uint8_t *)(i) = 0xFF - (i & 0x000000FF);
        while (FLASH->SR & FLASH_SR_BSY);
    }
    while (1)
    {
    }
}

 

STM32 __attribute__((section(“***“))) __attribute__ ((at()));__attribute__((section("***"))) 阅读详情

相关推荐

单片机MCU如何实现让部分代码运行在RAM中

MCU在实际的使用中,通常程序都是运行在flash上的,RAM的高速空间并没有得到充分的利用,如果我们的程序需要运行的更快,系统有更好的实时性,我们可以考虑将这部分代码放到RAM中运行,下边我们将以STMF103RCT6作为举例,向大家介绍在keil环境中如何使程序在RAM中运行。注意使用方法一时,该函数中调用到的所有函数也要放到RAMCODE section中,#pragma arm section code=“RAMCODE ”和#pragma arm section中可以包含多段代码。

m0_70911440的博客 3363

STM32CubeIDE 把固件信息直接定位在指定的ROM位置

一般我们实现把固件信息写到文件最后,都是通过工具去添加的,但是这样对于一些需求修改频繁的场景,这样显得相当的繁琐。而后续查找资料发现可以使用__attribute__((at(地址(0x8000000或0x2000000))关键字来解决。但是发现我们使用的是CubeIDE,使用的是GCC编译器,无法识别at。所以最后参考资料,没有发现专门有这样使用的方法,然后自己摸索后发现这样修改可以实现。需要修改STM32FXXX_FLASH.ld文件即可实现。看不懂这个文件的内容可以参考如下链接解释的相当详细 htt

lzs2327的博客 3291

NBM5100A与STM32L011K4的低功耗物联网设计实践

电源管理芯片(PMIC)与微控制器(MCU)的协同设计是物联网设备低功耗优化的核心技术。通过动态电压调节和智能电源管理策略,PMIC能够根据负载需求实时调整供电参数,而超低功耗MCU则通过时钟门控和外设管理实现能效提升。NBM5100A作为高性能电池管理芯片,结合STM32L011K4的Cortex-M0+内核,在纽扣电池供电场景下可降低40%以上能耗。这种硬件级优化方案特别适合智能门锁、环境传感器等需要长期续航的物联网终端,实测显示其睡眠模式电流可控制在3.2μA以下,大幅延长设备使用寿命。

weixin_34122604的博客 456

KEIL中如何程序在 RAM 中运行

前言 最近老是遇到使用KEIL时需要将部分或者全部程序放到RAM中运行的问题。故此花了不少时间搜索资料和几番尝试,现将其总结在本篇文章中,也是为大家以后的工作节省时间罢。本文中会介绍通过STM32F411Nucleo的一个例子来介绍几种让程序在RAM中运行的方法。在该例子中,通过调用ToggleLED函数来翻转LED2亮灭。接下来,我们将通过多种方法将这段代码放在RAM中运行。 Toggl

羽化的博客 2万+

基于KMX63和STM32L011K4的低功耗HMI手势识别方案

惯性测量单元(IMU)通过加速度计和陀螺仪的组合,能够精确捕捉物体的三维空间运动,这一原理被广泛应用于姿态检测和人机交互领域。在嵌入式系统中,结合超低功耗微控制器(如STM32L0系列)与高精度IMU传感器(如KMX63),可以构建高效节能的运动交互解决方案。这类技术特别适合需要长期电池供电的便携设备,如智能遥控器、可穿戴设备等应用场景。通过优化传感器数据融合算法和电源管理策略,开发者能够在保持高响应精度的同时实现微安级功耗,为自然直观的人机交互提供可靠硬件支持。

weixin_30888413的博客 451

STM32L011K4外扩EEPROM存储方案与实现

在嵌入式系统开发中,外扩存储是解决微控制器内置Flash容量不足的常见方案。EEPROM作为一种非易失性存储器,具有数据保持时间长、擦写次数高等特点,特别适合存储配置参数和日志数据。通过I2C接口,EEPROM可以方便地与STM32等微控制器连接,实现数据的可靠存储与读取。本文以STM32L011K4与M24M01E-F EEPROM为例,详细介绍了硬件设计要点、软件驱动实现以及写均衡算法等关键技术,为低功耗嵌入式设备提供了实用的外扩存储解决方案。

weixin_34195546的博客 463

flash块 stm32l0_STM32L011K4 Flash 操作

在L011中,除了普遍的Flash和OB外,还有EEPROM,而且还可以让Flash掉电运行.所以,他其实有4个密码,没错,是4个密码啊.如果Flash掉电了,那么就要RAM运行,也可以省一些电的.在Keil中这样定义RAM中运行代码.__attribute__ ((section (".ramcode"))) void MyFunc(void){while(1);}不过这2K RAM,是不是真的...

weixin_42139042的博客 970

Si4732与STM32L011K4实现低功耗数字收音机方案

数字收音机技术通过将模拟射频信号转换为数字信号处理,大幅提升了接收灵敏度和抗干扰能力。其核心原理是利用数字信号处理器(DSP)进行信道选择、解调和音频处理,相比传统模拟电路具有参数可编程、性能稳定等优势。在嵌入式系统设计中,低功耗微控制器如STM32L011K4与专用收音芯片Si4732的组合,能实现μA级待机电流和优异的射频性能。这种方案特别适合车载设备、便携式收音机等场景,其中I2C接口配置和天线匹配电路是关键实现要点。通过优化电源管理和DSP参数,实测显示该方案FM接收灵敏度可达1.5μV,AM信噪比

weixin_34414650的博客 328

STM32L011K4与A5000 LTE的安全物联网连接方案

物联网设备安全连接是边缘计算中的关键技术挑战,特别是在资源受限的嵌入式系统中。TLS协议作为主流的安全通信标准,通过加密和身份验证机制保障数据传输安全。在STM32L011K4这类超低功耗MCU上实现安全连接,需要平衡资源占用与安全强度。本文以Quectel A5000 LTE模块为例,详解如何利用硬件安全特性(如AES加速)和轻量级协议(如HMAC-SHA256),在智能表计、环境监测等典型物联网场景中构建安全连接方案。针对公共云(AWS/Azure/Aliyun)和私有云部署,分别提供了三元组认证和双向

axfcjwkbi259888707的博客 328

STM32L011K4与NBM7100A在低功耗物联网设备中的电池优化方案

在物联网和便携式医疗设备中,低功耗设计是延长电池寿命的关键。通过动态阻抗匹配和负载预测算法,可以有效应对电池在脉冲负载下的极化现象。STM32L011K4微控制器结合NBM7100A电量监测芯片,实现了智能电源路径管理,显著提升电池利用率。该方案特别适用于LoRa无线模块和微型电机驱动等场景,通过超级电容缓冲策略,将典型物联网节点的电池寿命从6个月延长至18个月以上。

weixin_29188997的博客 278

STM32L011K4与M95M04 EEPROM嵌入式存储方案

嵌入式系统中的数据持久化存储是确保用户配置和系统参数长期保存的关键技术。基于SPI接口的EEPROM存储器因其非易失性、高可靠性和可擦写特性,成为嵌入式存储的主流解决方案之一。STM32L011K4微控制器与M95M04 EEPROM的组合,通过硬件SPI接口实现高速数据传输,支持100万次擦写周期和40年数据保持,特别适合智能家居、医疗设备等低功耗场景。该方案采用CRC校验和磨损均衡算法保障数据完整性,通过页写入优化和批量操作策略提升存储效率。在嵌入式开发中,这种高性价比的存储方案能有效解决传统Flash

weixin_33725270的博客 321

STM32L011K4与AD7490高精度信号采集方案详解

在嵌入式系统开发中,模数转换器(ADC)是实现模拟信号数字化的核心器件。SAR型ADC因其逐次逼近的工作原理,在精度与速度间取得良好平衡,广泛应用于工业检测、医疗设备等领域。AD7490作为16位高精度ADC,配合STM32L011K4超低功耗MCU,可构建高效信号采集系统。通过SPI接口通信和DMA传输优化,系统可实现1MSPS采样率的同时保持低功耗特性。该方案特别适合振动监测、环境传感等需要长时间电池供电的物联网终端设备,实测待机电流可低至0.5μA。

weixin_33796205的博客 442

高精度ADC ADS127L11与STM32L011K4的低功耗信号采集方案

模数转换器(ADC)作为连接模拟世界与数字系统的关键器件,其精度与功耗特性直接影响测量系统的性能。Δ-Σ架构通过过采样和数字滤波技术,在24位高分辨率ADC中实现111.5dB动态范围。配合STM32L011K4低功耗MCU的SPI接口和DMA控制器,可构建工业级精密测量系统。该方案在400kSPS采样率下仅消耗18.6mW功率,支持宽带和低延迟双模式,适用于医疗设备、工业传感器等场景。通过优化信号链设计、电源管理和数字滤波算法,可进一步提升系统信噪比和能效比。

weixin_33720956的博客 398

EM3080-W与STM32L011K4条形码识别系统设计

条形码识别技术作为自动识别领域的核心技术,通过光电传感器采集条码信息,经解码算法转换为可处理数据。其核心原理是利用不同宽度的黑白条纹对光的反射差异实现信息编码。在工业自动化和零售仓储等场景中,高效可靠的条码识别系统能显著提升作业效率。EM3080-W线性图像传感器内置20多种码制解码算法,配合STM32L011K4微控制器的低功耗特性,构建了高性价比的硬件方案。通过UART通信协议实现数据传输,采用DMA+环形缓冲区优化处理效率。该系统支持硬件触发扫描和低功耗设计,在-20℃低温环境下仍保持稳定工作,识别准

weixin_30617797的博客 348

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

Shopee滑块验证码太刁钻?手把手教你用Python+Playwright绕过弧形验证(附影刀RPA接入代码)

本文详细介绍了如何使用Python和Playwright结合SadCaptcha第三方服务高效破解Shopee平台的弧形滑块验证码,并集成到影刀RPA工作流中。该方案开发周期短、准确率高(>90%),特别适合跨境电商自动化操作,已在实际项目中验证成功。

weixin_29284657的博客 567

STM32L011K4与WSEN-ISDS传感器低功耗运动追踪方案

MEMS传感器作为嵌入式系统的核心感知器件,通过微机电系统实现运动状态检测。其工作原理基于电容式或压阻式传感元件,将物理量转换为电信号。在物联网和穿戴设备领域,6轴IMU(惯性测量单元)因能同时测量加速度和角速度而广泛应用。通过I2C/SPI接口与MCU通信,配合卡尔曼滤波等算法可实现精确姿态解算。本文以STM32L011K4与WSEN-ISDS为例,详解低功耗硬件设计、传感器校准及运动融合算法实现,特别适合智能手环、工业监测等需要长期电池供电的场景。实测显示该方案可使系统功耗降至5μA以下,续航达6-8个

weixin_34347651的博客 358

19-5 ACC 自适应巡航控制系统需求

本专题由深圳季连AIgraphX李博及团队出品,主要讲解ACC自适应巡航控制系统的开发与仿真测试。具体说来,包括ACC标准/法规分析、系统需求、系统架构、软件需求、软件架构、算法建模、验证场景分析、仿真实验搭建等内容。 本节主要讲ACC系统需求。

AIgraphX 1088

STM32L011 启动映射异常问题

STM32L011 调试中反复进入中断向量表并报错的排查过程。问题根源是 BOOT0 引脚被 0Ω 电阻错误拉高,导致芯片从 SRAM 启动,使 0x00000000 地址映射到 SRAM,CPU 在处理中断时读取了错误的向量表,最终跳转到 0x0/0x2 等非法地址。

m0_74373230的博客 240

FPGA高速通信双核解析:CMAC与Interlaken硬核的实战对比

本文深入对比了FPGA中两大高速通信硬核CMAC与Interlaken的核心差异与应用场景。CMAC作为标准以太网接入方案,适用于网卡、交换机等需对外互联的场景;而Interlaken则以极低延迟和高效通道化能力,专为芯片间、板间裸数据高速传输设计。文章通过实战案例与性能指标分析,为FPGA高速通信方案选型提供清晰指南。

f9g0h的博客 844

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2185

4-20mA电流环技术解析与STM32工业应用实践

电流环是工业自动化中广泛采用的模拟信号传输技术,其核心原理是利用4-20mA电流变化传递过程变量。相比电压信号,电流传输具有抗干扰强、不受线路电阻影响等技术优势,特别适合DCS系统、变频控制等工业场景。以STM32L011K4微控制器为例,通过配置12位ADC采样、三点校准算法及优化电源管理,可构建高可靠电流检测系统。结合INA196电流检测放大器等关键器件,工程师需要关注信号链设计、EMC防护等工程实践要点,确保在化工厂、电力系统等严苛环境中稳定运行。

conghuang7343的博客 445

加权均值向量算法(INFO)详解:从数学原理到智能算法

本文系统介绍了加权均值向量算法(INFO)的理论基础、数学模型与实现应用。该算法基于加权均值数学概念,通过MeanRule规则平衡探索与开发能力,具有结构新颖、参数合理的特点。核心内容包括:1) 算法理论基础,阐述加权均值数学定义与小波函数权重计算;2) 算法原理,详细解析更新规则、向量组合和局部搜索三阶段数学模型;3) 实现方法,提供MATLAB代码关键参数解析;4) 改进方向,介绍INFO-KELM混合模型等变体;5) 应用案例,涵盖函数优化、工程设计与机器学习领域。

qq_42212808的博客 234

STM32L0x系列官方库

STM32L0x系列官方库 【下载地址】STM32L0x系列官方库 本资源为STM32L0系列微控制器提供官方库支持,涵盖ADC、FLASH、USB、UART、LCD、SDIO等常用功能模块,适用于L010RB、L011K4、L031K6、L053R8、L073RZ、STM32L073Z等型号开发。库中附带详细的开发文档...

gitblog_06753的博客 352

基于Simulink的超级电容快速响应特性建模与仿真

本文介绍了基于Simulink的超级电容快速响应特性建模与仿真方法。主要内容包括:超级电容的工作原理、一阶RC等效电路模型及其动态电压方程;通过Simulink搭建超级电容模型的两种方法(Simscape Electrical推荐方案和基础模块透明教学方案);仿真100A×100ms放电脉冲下的电压响应特性,并与锂电池进行动态对比;分析超级电容在混合储能系统中的功率分配优势。文章还提供了工程实践要点和扩展方向,如电压均衡、温度影响评估以及与DC-DC变换器集成等。通过建模实践,验证了超级电容在毫秒级响应、高

xiaoheshang_123的博客 98

CUDA编程00 - 配置CUDA开发环境

第一步:在一台装有Nvidia显卡和驱动的机器上,用nvidia-smi命令查看显卡所支持cuda版本。安装时按提示下一步即可,安装完成用 nvcc -V 命令检查是否成功。第二步: 到Nvidia官网下载CUDA Toolkit并安装,第三步:编写HelloWorld。

GPU全栈博主 1359
上一篇: 随机游动的Matlab小程序
下一篇: NVIDIA Control panel Application,8.1.760.0已停止工作 解决办法
netccdn
博客等级 码龄12年 40粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值