h1_key

当前位置:首页 >新闻资讯 > 产品资讯>意法半导体>STM32F103单片机IO不够用应该这么来
STM32F103单片机IO不够用应该这么来
2022-06-23 755次


 

先说为什么会不够用

  一般在项目开发阶段需求都是慢慢的添加的,预计需要18个IO结果20个还不够,甚至有的时候已经全部用完了现有的资源,还需要多出一个或者两个IO来做一个系统运行指示灯这样的功能,就没必要换一款更高性能的单片机来做了,这时候就会想能不能再“压榨”一下单片机把多余的资源释放出来。其实STM32F103单片机JTAG端口重映射可以完成这样的事情。

  STM32F103单片机JTAG端口重映射

  JTAG接口

  简单理解这是一个下载程序用的接口使用的工具是Jlink

  SWD接口

  简单理解就是一个下载程序的接口使用的工具是STlink

  IO口

  简单理解就是一个可以进行输入输出的普通接口

  STM32的IO口

  STM32有很多IO口,IO口占据了绝大多数的管脚,但是有的管脚天生就不平凡被安排了更牛逼的工作那就是下载程序用,如果想要它由牛逼变成普通就要对本事下载接口的管脚进行功能重新映射。

  映射的关系由寄存器进行控制也可以库函数来实现,但是映射的方式不多,也就三种

  §全功能 SWJ,JTAG没有JTRST。

  §禁用JTAG,启用SWJ。(PB3/PB4/PA15 可重映射为其他功能)

  §完全禁用 SWJ和 JTAG。(PB3/PB4/PA13/PA14/PA15 均可重映射为其他功能)

  §为什么要这样搞?

  因为这样设计可以允许更多的GPIO被解放出来。

  比如

  第一种可以解放PB4

  第二种可以解放PB3 PB4 PA15

第三种可以解放PB3 PB4 PA13 PA14 PA15

 

 

为什么可以这样搞?

  

7.png8.png

  

如何解放对应的IO呢?

    STM32F103单片机IO不够用应该这么来

  先说为什么会不够用

  一般在项目开发阶段需求都是慢慢的添加的,预计需要18个IO结果20个还不够,甚至有的时候已经全部用完了现有的资源,还需要多出一个或者两个IO来做一个系统运行指示灯这样的功能,就没必要换一款更高性能的单片机来做了,这时候就会想能不能再“压榨”一下单片机把多余的资源释放出来。其实STM32F103单片机JTAG端口重映射可以完成这样的事情。

  STM32F103单片机JTAG端口重映射

  JTAG接口

  简单理解这是一个下载程序用的接口使用的工具是Jlink

  SWD接口

  简单理解就是一个下载程序的接口使用的工具是STlink

  IO口

  简单理解就是一个可以进行输入输出的普通接口

  STM32的IO口

  STM32有很多IO口,IO口占据了绝大多数的管脚,但是有的管脚天生就不平凡被安排了更牛逼的工作那就是下载程序用,如果想要它由牛逼变成普通就要对本事下载接口的管脚进行功能重新映射。

  映射的关系由寄存器进行控制也可以库函数来实现,但是映射的方式不多,也就三种

  §

  全功能 SWJ,JTAG没有JTRST。

  §

  §

  禁用JTAG,启用SWJ。(PB3/PB4/PA15 可重映射为其他功能)

  §

  §

  完全禁用 SWJ和 JTAG。(PB3/PB4/PA13/PA14/PA15 均可重映射为其他功能)

  §

  §

  为什么要这样搞?

  因为这样设计可以允许更多的GPIO被解放出来。

  比如

  第一种可以解放PB4

  第二种可以解放PB3 PB4 PA15

  第三种可以解放PB3 PB4 PA13 PA14 PA15

  为什么可以这样搞?

  

9.png10.png 

 

如何解放对应的IO呢?

 

进行端口复用

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、关闭JTAG-DP,关闭SW-DP

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、关闭JTAG-DP,开启SW-DP

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用

  库函数写法

  

 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x4 << 24);   //2、关闭JTAG-DP,关闭SW-DP
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x2 << 24) ;  //2、关闭JTAG-DP,开启SW-DP
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x1 << 24) ;  //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x0 << 24) ;  //2、都被占用

 

库函数写法

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

//开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //Full SWJ Disabled (JTAG-DP + SW-DP)GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
 //开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//JTAG-DP Disabled and *SW-DP Enabled*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRSTGPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);

 

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  ·

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x4 << 24); //2、关闭JTAG-DP,关闭SW-DP

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x2 << 24) ; //2、关闭JTAG-DP,开启SW-DP

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x1 << 24) ; //2、JTAG-DP + SW-DP NOJNRST

  AFIO -> MAPR &= ~(0x7 << 24); //1、清除[26 : 24]AFIO -> MAPR |= (0x0 << 24) ; //2、都被占用

  库函数写法

  

 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x4 << 24);   //2、关闭JTAG-DP,关闭SW-DP
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x2 << 24) ;  //2、关闭JTAG-DP,开启SW-DP
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x1 << 24) ;  //2、JTAG-DP + SW-DP NOJNRST
AFIO -> MAPR &=  ~(0x7 << 24);   //1、清除[26 : 24]AFIO -> MAPR |=   (0x0 << 24) ;  //2、都被占用

库函数写法

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

//开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //Full SWJ Disabled (JTAG-DP + SW-DP)GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
 //开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//JTAG-DP Disabled and *SW-DP Enabled*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //开启AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRSTGPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);

 

  • STM32H723VGT6:100引脚封装里保留550 MHz M7与564 KB RAM,把取舍集中在I/O和外设并行度上
  • 把一颗550 MHz Cortex-M7、1 MB Flash和564 KB RAM的微控制器收进14 mm × 14 mm的LQFP100封装,不可能什么都不放弃。STM32H723VGT6的取舍方式相当清晰:核心频率、双精度FPU、L1缓存、存储容量全部保留,以太网、USB HS/FS OTG和3路FDCAN也都在片内,但通用I/O从144引脚变体的112个减少到80个,ADC通道数量相应收缩,部分高速接口的并行布设空间变得紧张。它的工程定位不是“缩小版ZGT6”,而是一颗在100引脚级别上把M7算力和存储规模放在第一位、把接口并行度作为可协商变量的器件。
    2026-10-23 3次
  • STM32H723ZGT6:112个I/O与550 MHz Cortex-M7如何撑起一台“接口满载”的嵌入式设备
  • 在嵌入式系统里,有一类设计对算力的需求是真实的,但真正让工程师头疼的往往不是主频够不够高,而是接口够不够用。显示屏要占一组引脚,以太网要占一组,两三路CAN FD和十来个串口、SPI、I²C同时存在时,引脚预算会以肉眼可见的速度耗尽。STM32H723ZGT6把550 MHz Cortex-M7、1 MB Flash和564 KB RAM放进LQFP144封装,给出112个I/O,正是为了回应这种“接口先于算力成为瓶颈”的局面。
    2026-10-23 2次
  • STM32H743VIH6:在8 mm × 8 mm封装中保留480 MHz M7与完整存储,但I/O需要精打细算
  • 把一颗480 MHz Cortex-M7、2 MB Flash和1 MB RAM的微控制器放进8 mm × 8 mm的TFBGA100封装,必然要做出取舍。STM32H743VIH6的取舍方式是:核心性能、存储容量、模拟外设和通信控制器的种类基本保留,但通用I/O被压缩到82个,并且封装本身带来了一些需要在选型和采购阶段就确认的工程约束。这颗器件的价值不在于“小封装里什么都有”,而在于让空间受限的系统仍能获得H743级别的计算和存储资源,代价是引脚预算必须被当作一种稀缺资源来管理。
    2026-10-23 4次
  • STM32H743XIH6:168个I/O与480 MHz Cortex-M7构成的嵌入式系统集成平台
  • 当一块嵌入式板卡需要同时驱动显示屏、连接多路现场总线、处理高速数据采集,并且还要保留足够的引脚用于存储扩展和系统监控时,选型的焦点会从“核心够不够快”转向“芯片能不能把整个系统装进去”。STM32H743XIH6在TFBGA240封装中提供了168个I/O、480 MHz Cortex-M7核心、2 MB双bank Flash和1 MB RAM,外设覆盖以太网、双CAN FD、双USB OTG、LCD-TFT控制器和Chrom-ART图形加速器。它的工程角色不是一颗“高性能MCU”,而是一个能够承担复杂系统集成的高密度计算平台。
    2026-10-23 2次
  • STM32H750XBH6:480 MHz Cortex-M7与“小Flash、大RAM”架构的工程逻辑
  • 在微控制器选型中,Flash容量通常被视为一项越大越好的指标。STM32H750XBH6提供了一个值得认真对待的反例:它的片内Flash只有128 KB,却配备了1 MB RAM,核心是480 MHz Cortex-M7,封装为240+25球的TFBGA。这种“小Flash、大RAM”的比例不是配置失误,而是一种有意的系统架构选择——把代码存储的主要责任交给外部存储器,把宝贵的片内资源集中在数据吞吐和实时执行上。理解这一架构,是判断这颗器件是否适合某个设计的前提。
    2026-10-23 3次

    万联芯微信公众号

    元器件现货+BOM配单+PCBA制造平台
    关注公众号,优惠活动早知道!
    10s
    温馨提示:
    订单商品问题请移至我的售后服务提交售后申请,其他需投诉问题可移至我的投诉提交,我们将在第一时间给您答复
    返回顶部