jtag引脚定义_嵌入式13——IO 引脚复用器和映射

STM32L4 有很多的内置外设,GPIO与这些外设的外部引脚是复用的。也就是说,都是一个 IO引脚。

如果可以复用为内置外设的功能引脚,那么当这个 IO 作为内置外设使用的时候,就叫做复用

《STM32L4XX 参考手册》第八章和芯片数据手册有详细的讲解哪些 GPIO 管脚是可以复用为哪些内置外设。

STM32L4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF) 连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚外设之间不会发生冲突。

每个 IO 引脚都有一个复用器, 该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0-7)和 GPIOx_AFRH(针对引脚 8-15)寄存器对这些输入进行配置:

1) 完成复位后,所有 IO 都会连接到系统的复用功能 0(AF0)。

2)外设的复用功能映射到 AF1 到 AF13。

3) Cortex-M4 EVENTOUT 映射到 AF15。

简单的理解就是,每个引脚都可以配置为多个复用功能,那么这个引脚到底配置为哪个功能,可以通过开关(配置)来设定,就像一个模拟开关一样。复用器示意图如下图 所示:

21a06cb3c029440aba8b4000cccc839b.png

举个例子, STM32L4 开发板的原理图上PB13 的原理图如图所示:

afec4589cc5ff9d224edbdd3cf2481b5.png

如上图所示, PB13 可以作为 TIM1&15_CH1N、 I2C2_SCL、 SPI2_SCK、DFSDM1_CKIN1、U3_CTS、 LPU1_CTS、 TSG_G1_IO2、 SWPMI1_TX、 SAI2_SCK_A 等复用功能输出。这么多复用功能,如果这些外设都开启了,那么对 STM32L4 来说那就可能乱套了,外设之间互相干扰。

STM32L4中由于有复用器功能,可以让 PB13 在某个时刻仅连接到需要使用的特定的外设,因此不会发生互相干扰的情况。

引脚 0-7 控制寄存器为 GPIOx_AFRL,对于引脚 8-15,控制寄存器为 GPIOx_AFRH。从图中可以看出。当需要使用复用功能的时候,我们配置相应的寄存器 GPIOx_AFRL 或者 GPIOx_AFRH,让对应引脚通过复用器连接到对应的复用功能外设。

这里我们列出 GPIOx_AFRH 寄存器的描述,GPIOx_AFRL 的作用跟 GPIOx_AFRH 类似,只不过 GPIOx_AFRL(这个寄存器有32位) 控制的是一组 IO 口的低八位(它控制的低八位),GPIOx_AFRL 控制的是一组 IO 口的高八位。

GPIOx_AFRH 寄存器描述如下图 4.4.3 所示:

311dfa9685f183d11631e541c9c962c9.png

从表中可以看出, 32 位寄存器 GPIOx_AFRH 每四位控制一个 IO 口,所以每个寄存器控制32/4=8 个 IO 口。寄存器对应四位的值配置决定这个 IO 映射到哪个复用功能 AF在微控制器完成复位后,所有 IO 口都会连接到系统复用功能 0(AF0)。这里要注意,对于系统复用功能 AF0,我们将 IO 口连接到 AF0 之后还要根据所用功能进行配置

1) JTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是 JTAG/SWD 功能。如果我们要作为 GPIO 来使用,就需要对对应的 IO 口复用器进行配置

2) RTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。

3) MCO:这些引脚在系统复位之后要使用的话要配置为复用功能模式。

对于外设复用功能的配置, 除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律要配置为复用功能模式,这个配置是在 IO 口对应的 GPIOx_MODER 寄存器配置的。

配置 GPIOx_AFRH 或者 GPIOx_AFRL 寄存器,将 IO 口通过复用器连接到所需要的复用功能对应的AFx。

不是每个 IO 口都可以复用为任意复用功能外设。哪些 IO 可以复用为相关外设查看芯片对应的数据手册。

对于 STM32L4,数据手册里面的 Table 17. Alternate function AF0 to AF7和 Table 18. Alternate function AF8 to AF15 开始就是所有端口的 AF 映射表, 表格列出了所有的端口 AF 映射表,因为表格比较大,所以这里只列出 PORTA 的几个端口为例:

28de704acfd22a7722b9487bd9ff7ef8.png

从表中可以看出,PB6 连接 AF7 可以复用为串口 1 的发送引脚 USART1_TX,PB7 连接 AF7可以复用为串口 1 的接收引脚 USART1_RX。

接下来以串口 1 为例来讲解配置 GPOPB.6 和GPIOB.7 口为串口 1 复用功能的一般步骤。

① 首先,要使用 IO 复用功能,必须先打开对应的 IO 时钟复用功能外设时钟,这里我们使用了 GPIOB 以及 USART1,所以我们需要使能 GPIOB 和 USART1 时钟。方法如下:

__HAL_RCC_GPIOB_CLK_ENABLE(); //使能 GPIOB 时钟
__HAL_RCC_USART1_CLK_ENABLE(); //使能 USART1 时钟

② 其次,我们在 GIPOx_MODER 寄存器中将所需 IO(对于串口 1 是 PB6,PB7) 配置为复用功能(ADC 和 DAC 设置为模拟通道)。

③ 再次,我们还需要对 IO 口的其他参数,例如上拉/下拉以及输出速度等进行配置。

④ 最后,我们需要配置 GPIOx_AFRL 或者 GPIOx_AFRH 寄存器,将 IO 连接到所需的 AFx

对于 PB6,PB7 复用为 USART1 的发送接收引脚,根据表 4.4.4 可知都需要连接 AF7。上面三步,在我们 HAL 库中是通过 HAL_GPIO_Init 函数来实现的,参考代码如下:

GPIO_InitTypeDef GPIO_Initure;
GPIO_Initure.Pin=GPIO_PIN_6; //PB6
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
GPIO_Initure.Alternate=GPIO_AF7_USART1;//连接 AF7 复用为串口 1 的发送引脚
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化 PB6

通过上面的配置, PB6 就通过映射器链接到 AF7,也就是复用为串口 1 的发送引脚。这个时候, PB6 将不再作为普通的 IO 口使用。

对于 PB7,配置方法一样,同样也是链接 AF7,修改 Pin成员变量值为 GPIO_PIN_7 即可。从表中可以看出, PB6 还可以作为 TIM4_CH1 功能引脚,如果我们希望 PB6 作为TIM4_CH1 引脚,那么我们需要修改 PB6 的映射关系,修改方法如下:

GPIO_Initure.Alternate= GPIO_AF2_TIM4;//连接 AF2 复用为 TIM4_CH1 引脚

对 于 GPIO初始化结构体成员变量 Alternate 的值为 , 在 HAL 库中的文件stm32l4xx_hal_gpio_ex.h 里面有详细定义,定义如下如下:

#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00)
#define GPIO_AF0_MCO ((uint8_t)0x00)
#define GPIO_AF0_SWJ ((uint8_t)0x00)
#define GPIO_AF0_TRACE ((uint8_t)0x00)
/***********此处省略其他代码******************/
#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值