如何理解STM32引脚中的GPIO,AFIO时钟分配策略和管脚复用

适用COTEX-M3系列的MCU也有两三年的时间了,一直用的是ST的产品,由于开发紧张,时间紧迫,整个过程不求甚解,只要东西能够做出来,也就不关心到底是怎么回事。最近刚好有点时间,在整理之前的软件设计时发现了一些疑惑:

使用过STM32系列产品的开发人员都知道,在该款芯片上凡是要使用某一个功能,必须给该功能分配相应的时钟,如何来分配这个时钟资源就成了一个问题:举个具体的例子,以STM32F103X8为例,假设需要使用PA9进行串口正常输出,时钟应该如何配置??数据手册管脚定义如下:如何理解STM32引脚中的GPIO,AFIO时钟分配策略和管脚复用_第1张图片

参考给出的时钟分配策略是这样:

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

大致意思就是分配了GPIOA的时钟,AFIO的时钟,同时分配了串口1的时钟。为什么要这样,是因为COTEX-M3采用了模块化设计,同时为了降低功耗,使硬件可裁剪,对于每一个模块进行单独的时钟配置,当不使用某一个模块时则不使能该模块的时钟,达到模块不工作节省功耗的目的。从这个角度考虑,串口1要正常输出就涉及到了3个模块,

1.串口最终体现为从PA9进行输出,那就使用了GPIO模块,该模块必须工作才能有数据输出。

2.串口采用的是非基本的GPIO功能(不是简单的读写GPIO寄存器工作模式),使用了alternate function(替换功能),则需要使能AFIO模块时钟

3.串口使用了串口工作模块,因此必须为串口使能时钟。

从下图我们可以更加清楚地看出这种关系:

如何理解STM32引脚中的GPIO,AFIO时钟分配策略和管脚复用_第2张图片

GPIO模块负责将数据转化为物理输出;AFIO模块负责将AFIO通道的信号桥接给GPIO模块;而UART模块则是按照UART协议产生数据传递给AFIO。

查阅网上资料过程,http://www.amobbs.com/thread-5508016-1-1.html中提到可以不打开AFIO时钟,也可以让串口正常工作,该种情况我没有验证,但是按照官方的模板使用了AFIO,同时结合参考手册理解,认为在使用alternate function时最好还是打开AFIO时钟。

同样本文对于一个管脚对应有多工alternate function的时候,当所有的模块都被使能,例如本文前边PA9的UART1_TX和TIM2_CH2均使能的情况下,究竟哪个功能被启用,直接使用http://www.amobbs.com/thread-5508016-1-1.html中的结论,以最后配置为准。例如,假设对UART1进行了配置也对TIM2进行了配置,且梁中国配置中都使用了PA9管脚,那最终PA9对于哪一个外设可以正常使用就取决于哪一个外设最后调用其使能函数。最后一次调用USART_Cmd(USART1,ENABLE);则PA9表现为串口功能;如果最后调用的是TIM_Cmd(TIM2,ENABLE);则PA9表现为定时器功能。


结论:

1.对于STM32的所有外部引脚如果使用的功能不是其上电后reset的默认功能,均需要对该管脚所在端口进行AFIO时钟初始化。

2.同一个管脚多个alternate function的情况,且每一个alternate function均进行了配置,则该管脚最终的功能为最后使能的外设所对应的功能。

你可能感兴趣的:(程序设计)