一、前景

        由于作者在用PY32F002A单片机选用的是SOP8型号封装的,IO资源非常有限,因此利用了复用引脚NRST上的IO,想把它设置为推挽模式,但是发现直接初始化并且设置低电平无法直接操作该IO口,咨询FAE后得知需要提前调用一些函数

很多开发者习惯性去配置 GPIO_Init,结果发现引脚电平毫无反应。这是因为 NRST 的功能配置存储在 Flash 的特殊区域,必须通过 Flash 编程的方式来修改底层硬件配置。


二、硬件图

硬件图

三、示例代码

定义以下函数。并且将它加入进main函数上面。

void Set_RST_Pin_To_GPIO(void)
{
    FLASH_OBProgramInitTypeDef OBInitCfg = {0};

    // 1. 检查当前引脚状态,如果已经是 GPIO 模式则不重复烧写,保护 Flash 寿命
    if (READ_BIT(FLASH->OPTR, FLASH_OPTR_NRST_MODE) == OB_RESET_MODE_GPIO)
    {
        return; 
    }

    // 2. 解锁 Flash 和 Option Bytes 访问权限
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();

    // 3. 配置配置项:重点是 OB_USER_NRST_MODE
    OBInitCfg.OptionType = OPTIONBYTE_USER;
    OBInitCfg.USERType   = OB_USER_NRST_MODE; 
    
    // 设置为 GPIO 模式 (如果想改回复位模式,改为 OB_RESET_MODE_RESET)
    OBInitCfg.USERConfig = OB_RESET_MODE_GPIO;

    // 4. 执行编程
    if (HAL_FLASH_OBProgram(&OBInitCfg) == HAL_OK)
    {
        // 5. 锁定并启动(Launch 会强制系统复位,使配置生效)
        HAL_FLASH_Lock();
        HAL_FLASH_OB_Lock();
        
        // 注意:执行此句后芯片会立即复位
        HAL_FLASH_OB_Launch(); 
    }

    // 如果失败,锁定退出
    HAL_FLASH_Lock();
    HAL_FLASH_OB_Lock();
}

注意:

要提前将驱动文件的flash文件加入到工程里去否则无法调用相关flash函数。

需要完整版工程可以在下方留言,或者私信作者。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐