GPIO模块配置(二)【除N32G45x外其他系列】 https://bbs.21ic.com/icview-3276040-1-1.html
在测试GPIO复用功能时候发现一个有意思的现象,就是一个IO只能指定一个复用功能,这样可以避免一个IO同时做UART和SPI功能引脚。因为每个IO都有一个(GPIOx_AFL/GPIOx_AFH)寄存器知道复用功能。比如下面这个配置后PA9、PA10只能用作USART1功能。
void UART_GPIO_Config(USART_Module* USARTx)
{
GPIO_InitType GPIO_InitStructure;
if (USARTx == USART1) {
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOA, ENABLE);
/* Tx--PA9 Rx--PA10 */
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}
}
但这时在想,如果其他IO也复用为USART1的引脚呢,比如PA4\PA5,PB6\PB7也同时配置为复用功能,并且都复用为USART1。
void UART_GPIO_Config(USART_Module* USARTx)
{
GPIO_InitType GPIO_InitStructure;
if (USARTx == USART1) {
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB, ENABLE);
/* Tx--PA9 Rx--PA10 */
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
/* Tx--PA4 Rx--PA5 */
GPIO_InitStructure.Pin = GPIO_PIN_4;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF1_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
/* Tx--PB6 Rx--PB7 */
GPIO_InitStructure.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_USART1;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
}
}
这个时候有趣的现象出现了,PA9、PA4、PB6 三个复用输出功能,同时复用到了USART1--Tx。
而PA10、PA5、PB7三个复用输入功能,只有一个(PA10)复用到了USART1--Rx。
根据目前测试现象猜测,针对N32G43x系列(拥有独立GPIOx_AFL/GPIOx_AFH寄存器的系列),外设引脚重映射:
如果作为输出功能,一个外设输出可以映射到多个IO;
如果作为输入功能,一个外设只能映射到一个IO(避免输入信号冲突)。
(如果有错误,欢迎指出共同讨论~)
|