首页 > 其他分享 >STM32引脚复用与重映射(HAL库)

STM32引脚复用与重映射(HAL库)

时间:2023-04-14 10:58:11浏览次数:37  
标签:TIM3 REMAP HAL 引脚 STM32 MAPR AFIO tmpreg

根据我最近做的实验,我举出下面例子

例:部分重映射,我用来把TIM3_CH2重映射到PB5上

Pin name

Type

Main

Default

Remap

PB5

I/O

PB5

I2C1_SMBA/SPI3_MOSI/I2S3_SD

TIM3_CH2/S PI1_MOSI

 1 GPIO_InitTypeDef gpio_init_struct;            /* IO引脚句柄 */
 2 __HAL_RCC_GPIOB_CLK_ENABLE();               /* 开启GPIOB时钟 */
 3 __HAL_RCC_TIM3_CLK_ENABLE();                /* 开启计时器3时钟 */    
 4 
 5 gpio_init_struct.Pin = GPIO_PIN_5;                    /* CPIO口 */
 6 gpio_init_struct.Mode = GPIO_MODE_AF_PP;           /* 复用推挽输出 */
 7 gpio_init_struct.Pull = GPIO_PULLUP;               /* 上拉 */
 8 gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */
 9 HAL_GPIO_Init(GPIOB, &gpio_init_struct);
10 __HAL_RCC_AFIO_CLK_ENABLE();                         /* 开启AFIO的时钟 */
11 __HAL_AFIO_REMAP_TIM3_PARTIAL();                     /* IO口重映射设置 */

下面是我从头文件stm32f1xx_hal_gpio_ex.h里摘抄的片段:

 1 /**
 2   * @brief Enable the remapping of TIM3 alternate function channels 1 to 4
 3   * @note  ENABLE: Full remap     (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9)
 4   * @note  TIM3_ETR on PE0 is not re-mapped.
 5   * @retval None
 6   */
 7 #define __HAL_AFIO_REMAP_TIM3_ENABLE()  AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_FULLREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP)
 8 
 9 /**
10   * @brief Enable the remapping of TIM3 alternate function channels 1 to 4
11   * @note  PARTIAL: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1)
12   * @note  TIM3_ETR on PE0 is not re-mapped.
13   * @retval None
14   */
15 #define __HAL_AFIO_REMAP_TIM3_PARTIAL()  AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_PARTIALREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP)
16 
17 /**
18   * @brief Disable the remapping of TIM3 alternate function channels 1 to 4
19   * @note  DISABLE: No remap      (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1)
20   * @note  TIM3_ETR on PE0 is not re-mapped.
21   * @retval None
22   */
23 #define __HAL_AFIO_REMAP_TIM3_DISABLE()  AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_NOREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP)
24 
25 /*******************************************************************************************************************************
26     ************************************************************************************************************************/
27 //全映射
28 #define AFIO_REMAP_ENABLE(REMAP_PIN)       do{ uint32_t tmpreg = AFIO->MAPR; \
29                                                tmpreg |= AFIO_MAPR_SWJ_CFG;  \
30                                                tmpreg |= REMAP_PIN;          \
31                                                AFIO->MAPR = tmpreg;          \
32                                                }while(0u)
33 //不开启映射,也就是默认引脚配置
34 #define AFIO_REMAP_DISABLE(REMAP_PIN)      do{ uint32_t tmpreg = AFIO->MAPR;  \
35                                                tmpreg |= AFIO_MAPR_SWJ_CFG;   \
36                                                tmpreg &= ~REMAP_PIN;          \
37                                                AFIO->MAPR = tmpreg;           \
38                                                }while(0u)
39 //部分映射
40 #define AFIO_REMAP_PARTIAL(REMAP_PIN, REMAP_PIN_MASK) do{ uint32_t tmpreg = AFIO->MAPR; \
41                                                           tmpreg &= ~REMAP_PIN_MASK;    \
42                                                           tmpreg |= AFIO_MAPR_SWJ_CFG;  \
43                                                           tmpreg |= REMAP_PIN;          \
44                                                           AFIO->MAPR = tmpreg;          \
45                                                           }while(0u)

简单的说 STM32的 io 有3个功能 一个是默认的 一个是复用 一个是重映射功能(这个其实也属于复用)

  1. 默认就是直接用GPIO时钟使能__HAL_RCC_GPIOB_CLK_ENABLE();端口模式配置也就是GPIO_Init()函数的配置。
  2. 复用:在默认的基础上开启复用外设时钟__HAL_RCC_TIM3_CLK_ENABLE();并配置外设参数。
  3. 重映射:在复用的基础上开启AFIO的时钟__HAL_RCC_AFIO_CLK_ENABLE();进行重映射的配置__HAL_AFIO_REMAP_TIM3_PARTIAL()。

标签:TIM3,REMAP,HAL,引脚,STM32,MAPR,AFIO,tmpreg
From: https://www.cnblogs.com/burningCloud/p/17317607.html

相关文章

  • vivado分配引脚
    方法一手动分配引脚点击openelaborateddesign,在右下角会有I/Oports栏。在packagepin列分配引脚即可,在I/Ostd列修改电压分配。在这个界面ctrls会显示选项,可以保存为xdc文件。xdc文件格式如下:set_propertyPACKAGE_PINU14[get_portsled[0]]set_propertyPACKAGE_P......
  • STM32F407学习
    读懂数据手册,根据数据手册实现功能代码固件库点灯main.cvoiddelay(uint32_tcount){ for(;count!=0;count--); }intmain(void){ /*在这里添加自己的程序*/ LED_GPIO_Config(); while(1) { /*流水灯*/ /* GPIO_ResetBits(GPIOF,GPIO_Pin_6); delay(0xffff......
  • Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome (DP+字典树)
    题目地址:传送门先用dp求出所有的符合要求的半回文串,标记出来。然后构造字典树。然后再dfs一遍求出所有节点的子树和,最后搜一遍就能找出第k个来了。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib......
  • 托管与非托管转换-Marshal 类
    Marshal是一个方法集合,主要应用在C#和非托管代码交互时,主要有如下方法:分配非托管内存复制非托管内存块将托管类型转换为非托管类型其他方法(与非托管代码交互时)常用方法IntPtrptr=xxxx;Datadata=newData();objectobj=data;ptr====>dataMarshal.......
  • new bing侧边栏撰写功能尝试--STM32的使用
    生成结果如下:stm32的使用stm32是一种基于ARMCortex-M内核的32位微控制器,由意法半导体(ST)推出。stm32具有超低的价格、超多的外设、丰富的型号、优异的实时性、极低的开发成本等优势,是目前市场上最受欢迎的单片机之一。本文将介绍stm32的基本特点和使用方法,帮助新手入门stm32的......
  • stm32 使用多串口通信调试总结
    前记: stm32使用多个串口通信,这个项目遇到了不少问题,值得反思和深入总结一下。 提纲: 这次的问题,主要有几个部分组成:A多串口的DMA配置,这个需要注意,尽量不要使用同一个DMA通道,这个高速的接收数据的时候会出问题。B串口的tx和rx配置一定要检查好,不要被复用了......
  • Alkaitu:STM32的IO模拟SPI
    #include"user_spi.h"#include"stm32f10x.h"#include"user_config.h"/*移植需改动六处*//***************************************************************//*挂在是SPI总线上的外设的个数和延迟时间,移植修改第一处*//**************************************......
  • 自用纯C语言实现任务调度(可用于STM32、C51等单片机)
    前言  这个任务调度模块的实现是形成于毕设项目中的,用在STM32中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟用自己自主实现出来的功能还是蛮舒心的。任务调度模式结构  整体上的结构属于......
  • stm32------点亮LED
    从点灯开始,开始stm32的学习之旅!直奔主题:keil软件版本:V5.35.00单片机型号:STM32F103VET6(因手上的是野火的指南者开发板,姑且以此为例)点灯步骤大致为:硬件图确认引脚和驱动电路——>软件配置相应引脚功能(时钟、输出模式)——>简单延时方法——>控制引脚输出高、低电平—......
  • keil 5 stm32f4 固件库 set up文件链接
    STSW-STM32065-STM32F4DSP和标准外设库-意法半导体STMicroelectronics ......