目录

PY32F0系列的封装

在PY32F0系列的封装可以分为两大类, 20PIN及以上的和小于20PIN的.

  • 20PIN, 24PIN 和 32PIN, 带有独立的 NRST 和 BOOT0, PIN脚互相独立不复用;
  • 8PIN, 10PIN 和 16PIN, 没有 BOOT0, 存在多个PIN脚共用同一个物理管脚的情况

这篇主要介绍没有BOOT0的情况如何修改Option Bytes, 以及如何在物理管脚上使用不同的PIN

PY32F002A 的封装

PY32F002AL15S, PY32F002AA15M, PY32F002AW15S

可以看到 SOP8 和 SOP10 存在复用情况

PY32F002AW15U, PY32F002AF15P

PY32F003 的封装

因为PY32F003型号较多, 这里只列出小于20PIN的封装

PY32F003L1xS, PY32F003L2XD, PY32F003L2xS

PY32F003A18N, PY32F003W1XS

PY32F002A/PY32F003 管脚复用

从上面的管脚配置可以看到, 大部分型号都存在同一物理管脚的复用情况, 有一些是功能脚(PF2/NRST)与普通IO脚的复用.

在 OB(Option Bytes)中禁用和启用 PF2/RESET

PF2/NRST这个PIN是比较麻烦的一个功能脚, 因为默认启用了RESET功能, 不受PIN模式的影响, 所以无论你把它设置成INPUT, OUTPUT 还是 ANALOG, RESET永远生效, 和这个PIN同处于同一个物理管脚的PIN就没法正常使用.

要禁用它的RESET功能, 要在芯片的 OB(Option Bytes)里修改. OB 位于地址 0x1FFF 0E80, 占用4个字节, 其中2字节是配置, 另外2字节是这两个字节的反码. 对应 RESET 功能的设置 NRST_MODE 存储于第14位, 0表示仅复位输入, 1表示禁用复位输入,启用 GPIO 功能.

对于正常带 PF4/BOOT0 的型号, 在上电时拉高 BOOT0, 就可以从 system memory 启动 boot loader, 通过 ISP 工具连接后在工具里修改 OB, 但是 SOP8 和 SOP16 这些封装没有 BOOT0, 所以没法使用 ISP 工具修改. 只能通过代码或第三方工具(例如JLink)修改. 以下以LL库为例, 说明在代码中修改OB的方法

在OB中关闭PF2复位输入的方法

static void APP_FlashSetOptionBytes(void)
{
FLASH_OBProgramInitTypeDef OBInitCfg; LL_FLASH_Unlock();
LL_FLASH_OB_Unlock(); OBInitCfg.OptionType = OPTIONBYTE_USER;
OBInitCfg.USERType = OB_USER_BOR_EN | OB_USER_BOR_LEV | OB_USER_IWDG_SW | OB_USER_WWDG_SW | OB_USER_NRST_MODE | OB_USER_nBOOT1;
/*
* 默认的值: OB_BOR_DISABLE | OB_BOR_LEVEL_3p1_3p2 | OB_IWDG_SW | OB_WWDG_SW | OB_RESET_MODE_RESET | OB_BOOT1_SYSTEM;
*/
OBInitCfg.USERConfig = OB_BOR_DISABLE | OB_BOR_LEVEL_3p1_3p2 | OB_IWDG_SW | OB_WWDG_SW | OB_RESET_MODE_GPIO | OB_BOOT1_SYSTEM;
LL_FLASH_OBProgram(&OBInitCfg); LL_FLASH_Lock();
LL_FLASH_OB_Lock();
/* 重新载入OB, 这会触发软复位, MCU重启 */
LL_FLASH_OB_Launch();
}

注意, 上面这个方法执行后会重启MCU, 所以在调用前要做个判断, 否则它会一直循环重启下去

/* 检查 PF2 是否已经关闭了复位 */
if(READ_BIT(FLASH->OPTR, FLASH_OPTR_NRST_MODE) == OB_RESET_MODE_RESET)
{
/* 如果没关闭则调用 */
APP_FlashSetOptionBytes();
}
// 否则继续正常执行

这样执行完之后, RESET按钮就失效了, 如果要恢复, 要再将OB改回默认的值

OB_BOR_DISABLE | OB_BOR_LEVEL_3p1_3p2 | OB_IWDG_SW | OB_WWDG_SW | OB_RESET_MODE_RESET | OB_BOOT1_SYSTEM;

同一物理管脚的其它PIN, 设为模拟(ANALOG)模式

以下以SOP16封装的为例, 启用 PF1, PF0, 禁用对应同一管脚的 PA14 和 PF2

static void APP_GPIO_Config(void)
{
//... // PF1 SCL
GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
GPIO_InitStruct.Alternate = LL_GPIO_AF_12;
LL_GPIO_Init(GPIOF, &GPIO_InitStruct); // PF0 SDA
GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
GPIO_InitStruct.Alternate = LL_GPIO_AF_12;
LL_GPIO_Init(GPIOF, &GPIO_InitStruct); /**
* 根据数据手册第20页, 同管脚的其它PIN应当设为 ANALOG.
*/
// PA14
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_14, LL_GPIO_MODE_ANALOG);
// PF2
LL_GPIO_SetPinMode(GPIOF, LL_GPIO_PIN_2, LL_GPIO_MODE_ANALOG); //...
}

电路连线避免干扰

管脚复用之后, 一些功能脚带的开关按钮和电阻电容就会对其它PIN造成影响.

例如对于复位键, 如果上面加了电容, 其容量一般是104(100nF), 用于避免按键抖动, 如果将这个脚禁用复位, 改为I2C的输出, 这个电容就会对输出信号造成干扰, 100nF的容量基本能消除掉1KHz以上的频率, 所以要将这样的电容去掉.

启动增加延时, 确保上电烧录

因为小封装没有 BOOT0, 所以在 SWD 口烧录失败的情况下, 没法用 ISP 工具救场, 如果你的程序加电后没有预留足够长时间的 delay, 又把 SWD 口的 PA13 PA14 给关掉了, 那下一次烧录就会干瞪眼.

一个好习惯是在设置完时钟之后, 保留一到两秒的延时, 可以在加电后从容不迫地按下烧录按钮.

int main(void)
{
uint8_t i; BSP_RCC_HSI_24MConfig();
/**
* 在SWD口关闭前停留2秒, 保证上电后有足够长的烧录等待时间
*/
LL_mDelay(2000); //...

代码示例

以 SOP16 封装的 PY32F003W18S 为例, 依然使用 1602LCD 作为参考.

代码通过禁用 PA14 和 PF2, 将 PF1 和 PF0 设置为 I2C 外设接口, 驱动 1602LCD.

源代码已经提交到 GitHub 仓库, 地址: https://github.com/IOsetting/py32f0-template/tree/main/Examples/LL/I2C/PCF8574_1602LCD_PY32F003W_PF0_PF1

运行示例

普冉PY32系列(七) SOP8, SOP10和SOP16封装的PY32F003/PY32F002A管脚复用的更多相关文章

  1. 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 PY32F0系列上市其实相 ...

  2. 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 以下介绍PY32F0系列在 ...

  3. 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...

  4. WCF编程系列(七)信道及信道工厂

    WCF编程系列(七)信道及信道工厂   信道及信道栈 前面已经提及过,WCF中客户端与服务端的交互都是通过消息来进行的.消息从客户端传送到服务端会经过多个处理动作,在WCF编程模型中,这些动作是按层 ...

  5. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  6. C语言高速入口系列(七)

    C语言高速入口系列(七) C语言指针进阶 本章引言: 在前面第5节中我们对C语言的指针进行了初步的学习理解;作为C语言的灵魂, C指针肯定没那么简单,在这一节中,我们将会对指针进行进一步的学习,比方二 ...

  7. 7.oracle学习门户系列七---网络管理和配置

    oracle学习门户系列七 网络管理和配置 们学习了模式和用户.包含模式定义以及模式的作用. 这篇我么来看下ORACLE数据库中的网络管理和配置.只是这篇好像和上篇没有继承啊.这怎么看? Ok,事实上 ...

  8. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

  9. java多线程系列(七)---Callable、Future和FutureTask

    Callable.Future和FutureTask 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量 ...

  10. java基础解析系列(七)---ThreadLocal原理分析

    java基础解析系列(七)---ThreadLocal原理分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...

随机推荐

  1. Linux模拟手动输入指令

    当执行一个命令,其中会询问你的选择的时候,在脚本上,可以如此模拟手动输入: 运行的命令 <<EOF 键盘输入 EOF 例如挂载硬盘: DISK=/dev/sdb /sbin/fdisk $ ...

  2. 运行不出来真的QAQ

    学C的时候最大的苦恼是编译不通过和运行不正确 学了C++之后就开始有编译过了但运行不出来的情况了TAT

  3. MySQL错误合集

    Error Code: 1052. Column 'Sno' in field list is ambiguous ambiguous意味含糊不清,常见于多个表中有相同名字的属性,在查询时需要分别说明 ...

  4. zxb2022习题班16

    (1) 原则:合同中包含多项履约义务的,企业应当按照各单项履约义务所承诺的商品的单独售价的比例,将交易价格分摊至各单项履约义务. 方法:按照A和B商品单独售价的相对比例, 2x22年4月16日 借:合 ...

  5. Shell脚本结构化-控制流

    脚本结构化命令 上一章给出的那些 shell 脚本里,shell 按照命令在脚本中出现的顺序依次进行处理.对顺序操作来说,这已经足够了,因为在这种操作环境下,你想要的就是所有的命令按照正确的顺序执行. ...

  6. Java 数据库表关联更新

    SqlServer 关联更新语句: update a set a.pname = b.name from 表a a inner join 表b b on a.pid = b.id MySQL 关联更新 ...

  7. 互联网架构 之备份服务器 rsync

    备份服务器(Rsync) 1.介绍备份的场景 1.什么情况下需要备份 一般数据比较重要的情况下,数据如果丢失很容易找不回来了的,建议备份. 2.什么是备份 将原有的数据复制一份或几份存起来,以备不时之 ...

  8. 艾思软件app开发公司帮您分析:开发一个APP多少钱?

    首先你要知道你所要开发的APP, 是不是已经成熟的相同的产品, 如果有的话那还是建议直接购买, 这种已经能满足你需求的成品APP价格会很便宜, 总成本一般也就1到2万的级别. 如果没有那就需要定制开发 ...

  9. VS中多字节字符集和UNICODE字符集的使用说明

    两者的核心区别: 1.在制作多国语言软件时,使用Unicode(UTF-16,16bits,两个字节).无特殊要求时,还是使用多字节字符集比较好. 2.如果要兼容C编程,只能使用多字节字符集.这里的兼 ...

  10. js 字符串和16进制的互相转换(转)

    字符串转16进制 function strToHexCharCode(str) { if(str === "") return ""; var hexCharC ...