STM32 串口二中断触发写入 Flash:使用 *mode_1 命令修改变量
首先,需要在代码中定义一个变量 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。
原文地址: https://www.cveoy.top/t/topic/n5Gv 著作权归作者所有。请勿转载和采集!