h1_key

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


 

先说为什么会不够用

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

  STM32F103单片机JTAG端口重映射

  JTAG接口

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

  SWD接口

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

  IO

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

  STM32IO

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

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

  §全功能 SWJJTAG没有JTRST

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

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

  §为什么要这样搞?

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

  比如

  第一种可以解放PB4

  第二种可以解放PB3 PB4 PA15

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

 

 

为什么可以这样搞?

  

7.png8.png

  

如何解放对应的IO?

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

  先说为什么会不够用

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

  STM32F103单片机JTAG端口重映射

  JTAG接口

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

  SWD接口

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

  IO

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

  STM32IO

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

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

  §

  全功能 SWJJTAG没有JTRST

  §

  §

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

  §

  §

  完全禁用 SWJJTAG(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) ; //2JTAG-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) ; //2JTAG-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);

 

  • ST LIS331DLH:高性能超低功耗三轴MEMS加速度计详解
  • ST意法半导体推出的LIS331DLH是一款超低功耗高性能三轴线性加速度计,属于其著名的“nano”系列MEMS传感器产品。这款器件采用先进的微机电系统技术,在微型化封装中实现了卓越的运动感知能力。其3×3×1mm的超紧凑尺寸和仅20mg的重量,使它在消费电子和工业控制领域获得了广泛应用。
    2025-05-29 100次
  • ‌意法半导体STM32N657Z0H3Q:重新定义高性能嵌入式系统的未来‌
  • 在物联网(IoT)、工业自动化及人工智能(AI)技术飞速发展的今天,嵌入式系统的性能、能效与集成度成为开发者关注的核心。意法半导体(STMicroelectronics)作为全球半导体行业的领军企业,近期推出的‌STM32N657Z0H3Q‌微控制器,以其突破性的架构设计、多领域适应性及卓越的能效表现,为下一代智能设备树立了全新标杆。本文将深入剖析这款产品的核心优势与技术亮点。
    2025-05-06 101次
  • 意法半导体STM32N657L0H3Q:集成专用AI加速单元,专为高效计算
  • 意法半导体STM32N657L0H3Q是STM32N6系列中的一款高性能微控制器(MCU),专为需要高效计算与人工智能加速的场景设计。作为ST首款集成专用AI加速单元的产品,其融合了Cortex-M55内核、Neural-ART NPU及多项创新技术,推动工业自动化、智能硬件等领域的边缘计算能力升级。
    2025-05-06 134次
  • 意法半导体STM32N657B0H3Q:专为‌边缘AI与高性能计算场景‌设计
  • STM32N657B0H3Q是意法半导体(STMicroelectronics)推出的‌STM32N6系列旗舰级微控制器‌,专为‌边缘AI与高性能计算场景‌设计。其核心亮点包括集成‌NPU(神经处理单元)‌、大容量片上SRAM、以及多媒体处理引擎,目标应用涵盖智能眼镜、工业视觉、车载电子等领域。
    2025-05-06 117次
  • 意法半导体STM32N657I0H3Q微控制器深度解析
  • STM32N657I0H3Q是意法半导体(STMicroelectronics)推出的高性能ARM Cortex-M55内核微控制器(MCU),属于STM32N6系列中的旗舰型号。该芯片采用16nm FinFET先进制程工艺,主频高达800MHz,集成4.2MB连续SRAM,并融合了神经网络加速器、图形处理单元(GPU)及多模态外设接口,专为实时信号处理、边缘AI及复杂嵌入式系统设计。
    2025-04-30 121次

    万联芯微信公众号

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