首先,需要在代码中定义一个变量 x,并将其起始地址指向 flash 中的一个空间。可以通过以下代码实现:

uint32_t x = 0;
uint32_t* x_addr = (uint32_t*)0x08008000; // 假设起始地址为 0x08008000

接下来,在串口二的中断处理函数中,判断收到的命令是否为 *mode_1,如果是,则将 x 的值设置为 20,并将其写入 flash 中。可以通过以下代码实现:

// 假设串口二的中断处理函数为 USART2_IRQHandler
void USART2_IRQHandler(void)
{
    if (USART2->SR & USART_SR_RXNE) // 判断是否接收到新数据
    {
        char ch = USART2->DR; // 读取接收到的数据

        // 判断是否收到命令 *mode_1
        static const char* mode_1_cmd = '*mode_1';
        static uint8_t cmd_index = 0;
        if (ch == mode_1_cmd[cmd_index])
        {
            cmd_index++;
            if (cmd_index == strlen(mode_1_cmd))
            {
                // 收到完整命令,执行相应操作
                x = 20;
                HAL_FLASH_Unlock(); // 解锁 flash
                HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, (uint32_t)x_addr, x); // 将 x 写入 flash
                HAL_FLASH_Lock(); // 锁定 flash
            }
        }
        else
        {
            cmd_index = 0; // 未匹配到完整命令,重置命令匹配索引
        }
    }
}

在代码中,使用了一个静态变量 cmd_index 来记录当前匹配到的命令字符的索引。每次接收到一个新字符时,判断是否与命令的下一个字符匹配。如果匹配成功,则将 cmd_index 加 1,继续匹配下一个字符。如果匹配失败,则将 cmd_index 重置为 0,从头开始匹配命令。

当 cmd_index 达到命令长度时,表示已经匹配到完整命令,执行相应操作即可。在本例中,将 x 的值设置为 20,并使用 HAL 库提供的函数将其写入 flash 中。在写入 flash 时,需要先调用 HAL_FLASH_Unlock() 解锁 flash,写入完成后再调用 HAL_FLASH_Lock() 锁定 flash。

STM32 串口二中断触发写入 Flash:使用 *mode_1 命令修改变量

原文地址: https://www.cveoy.top/t/topic/n5Gv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录