当前位置: 首页 > news >正文

单片机中NRST引脚复用为GPIO

多数单片机引脚较多,一般为48Pin,但也有许多引脚少的单片机以低廉的成本在某些应用上具有较大的优势。

这里以20Pin的PY32F003F18P6TU和8Pin的PY32F002BL15S7为例说明少量引脚单片机的特殊引脚复用。

20Pin的PY32F003F18P6TU的NRST引脚复用为普通GPIO

  • 首先我们需要知道的是NRST引脚的端口类型是I/O,并且具有通道引脚号PF2,同时在引脚定义表格的下方说明了通过设置option bytes即可将引脚转为普通GPIO引脚PF2在这里插入图片描述
  • option bytes是什么呢?Option Bytes(选项字节)是 微控制器(MCU)中用于存储硬件配置参数的非易失性存储区域,决定芯片上电后的基础工作模式。也就是说它是FLASH中存储上电后单片机如何工作的控制参数。
  • 如何修改option bytes?请看如下代码
    static void ConfigurePF2AsGPIO(void)
    {// 解锁 FLASHHAL_FLASH_Unlock();// 解锁 Option BytesHAL_FLASH_OB_Unlock();// 配置 Option BytesFLASH_OBProgramInitTypeDef OBInitCfg;OBInitCfg.OptionType = OPTIONBYTE_USER;		  // 选项类型 用户OB字节OBInitCfg.USERType = OB_USER_NRST_MODE; 	  // 修改 NRST_MODEOBInitCfg.USERConfig = OB_RESET_MODE_GPIO;    // 设置NRST 为 GPIOHAL_FLASH_OBProgram(&OBInitCfg);		//写入配置// 锁定 FLASHHAL_FLASH_Lock();// 锁定 Option BytesHAL_FLASH_OB_Lock();// 重新加载 Option Bytes,触发 MCU 重启HAL_FLASH_OB_Launch();
    }
    
  • 为避免重复运行导致的重启,在main函数开始前检查设置的对应数值是否为NRST配置数值,如果是则进入修改。也可以检查是否为GPIO配置数值。
    // 检查 PF2 NRST 是否已配置为 GPIO
    if (READ_BIT(FLASH->OPTR, FLASH_OPTR_NRST_MODE) == OB_RESET_MODE_RESET)
    {ConfigurePF2AsGPIO(); // 如果未配置,则调用函数进行修改
    }
    

8Pin的PY32F002BL15S7的NRST引脚复用为普通GPIO

  • 首先和上面的20Pin的PY32F003F18P6TU一样,我们也可以在手册上看到相似的内容,但因为引脚较少,有些不一样的东西,如下图,单片机的6号引脚既具备PA6的功能,也具备PC0的NRST功能:
    在这里插入图片描述
    在这里插入图片描述
  • 那一个引脚具有多个通道的功能如何使用呢?我们先看7号引脚。7号引脚既可以作为PA7使用,也可以作为PC1使用。如果我们需要使用PA7的USART_RX功能,则只需要GPIO初始化PA7引脚,并使用AF3复用功能,PC1不初始化即可(用哪个初始化那个)。
    在这里插入图片描述
    在这里插入图片描述
    void HAL_UART_MspInit(UART_HandleTypeDef *huart)
    {GPIO_InitTypeDef  GPIO_InitStruct = {0};/* Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_USART1_CLK_ENABLE();/* GPIO initializationPA06:TX,PA07:RX*/GPIO_InitStruct.Pin       = GPIO_PIN_6;GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull      = GPIO_PULLUP;GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF1_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Alternate = GPIO_AF3_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 interrupt enable */HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);HAL_NVIC_EnableIRQ(USART1_IRQn);
    }
    
  • 回到我们的问题,NRST复用为普通GPIO。这里既有1个引脚连接多通道问题,也有NRST与通道复用的问题。因此需要先将NRST功能禁用,再初始化为PA6,才能正常使用USART_TX功能。如果不禁用NRST功能,直接初始化PA6,则程序异常,系统不断重启。
  • 禁用NRST,与20Pin的PY32F003F18P6TU相似,但有不同,由于8Pin的单片机引脚少,因此她的下载接口SWDIO与NRST功能的Option Bytes在hal库中由同一字段控制,需要选择合适的控制字写入。
    控制字OBInitCfg.USERConfig可设置为:
    在这里插入图片描述
    示例代码:
    static void ConfigurePF2AsGPIO(void)
    {// 解锁 FLASH 和 Option BytesHAL_FLASH_Unlock();HAL_FLASH_OB_Unlock();// 配置 Option BytesFLASH_OBProgramInitTypeDef OBInitCfg;OBInitCfg.OptionType = OPTIONBYTE_USER;OBInitCfg.USERType = OB_USER_SWD_NRST_MODE; // 修改 SWD 和 NRST MODEOBInitCfg.USERConfig = OB_SWD_PB6_GPIO_PC0; // 设置PB6为SWD,PC0为GPIO 模式HAL_FLASH_OBProgram(&OBInitCfg);// 锁定 FLASH 和 Option BytesHAL_FLASH_Lock();HAL_FLASH_OB_Lock();// 重新加载 Option Bytes,触发 MCU 重启HAL_FLASH_OB_Launch();NVIC_SystemReset();
    }
    
  • 此时PC0被设置为普通GPIO,再GPIO初始化PA6为AF1的USART_TX即可。
    void HAL_UART_MspInit(UART_HandleTypeDef *huart)
    {GPIO_InitTypeDef  GPIO_InitStruct = {0};/* Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_USART1_CLK_ENABLE();/* GPIO initializationPA06:TX,PA07:RX*/GPIO_InitStruct.Pin       = GPIO_PIN_6;GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull      = GPIO_PULLUP;GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF1_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Alternate = GPIO_AF3_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 interrupt enable */HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);HAL_NVIC_EnableIRQ(USART1_IRQn);
    }
http://www.dtcms.com/a/573909.html

相关文章:

  • React 13
  • 【功能安全】AEB功能HARA分析
  • 佛山做外贸网站特色中企动力做过的网站
  • 重庆网站建设冒号做网站优化给业务员提成
  • 影刀RPA完全指南:从零入门到自动化高手(2/10)
  • 学习笔记:Jquery getJSON方法分析(一)
  • Linux--进程池
  • 洞头区网站建设收费网站模板制作步骤
  • wordpress直接自己网站怎么做优化
  • 【开题答辩全过程】以 分布式菌菇销售系统为例,包含答辩的问题和答案
  • ui设计网站建设是什么意思深圳做网站制作
  • Canal:让 MySQL 数据同步像呼吸一样自然
  • PE工具开发实战:非正向与安全解析
  • 进一步加强网站建设管理郑州app拉新项目
  • 徐州百度推广总代理台州专业关键词优化
  • C++ 中模板元编程与 SFINAE 机制
  • 【实用运维工具】一键完成Oracle数据库的健康巡检,生成WORD报告
  • ICLR 2025 Spotlight | 打破AI“黑箱”!最新IIS评分框架:揭示模型性能与可解释性的共生关系
  • Java实现国密算法 SM2 /SM3 /SM4(基于 BouncyCastle)
  • 文件网站建设高新公司网站建设哪家好
  • Zabbix企业级分布式监控系统(上)
  • 深度解析:接口性能优化实战指南
  • 站点创建成功html代码hr表示
  • 一、Netty-高并发IO底层原理(5种主要的IO模型)
  • 网站开发外包 验收c2c有哪些网站
  • Jenkins是什么
  • 建网站公司浩森宇特大连网络营销师招聘网
  • LeetCode - 杨辉三角 / 二叉树的最大深度
  • RV1126 NO.39:OPENCV查找图形轮廓并画框
  • 【第1章>第3节】基于FPGA的图像腐蚀处理算法的Verilog实现