STM32F0的一个引脚不仅可用于通用的IO外往往还可以用于多个集成外设的输入输出端口;
所以当用于外设口时除了将引脚设置成外设模式外还要选择哪一个外设
以STM32F030的PB6,PB7引脚为例,当这两个引脚用于UART1的RX,TX时代码如下:
void UartInit(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//Enable USART1 clock
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );
//USART1 Pins configuration
//引脚连接到外设0
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
//引脚配置为外设模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init( USART1, &USART_InitStructure );
USART_Cmd( USART1, ENABLE );
}
选择外设的代码是:
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
那么为什么是GPIO_AF_0呢?而不是AF1,AF2...,其实在数据手册上专门有一个表格说明一个引脚对应
的外设的顺序;
打开STM32F030的数据手册,在“4 Pinouts and pin descriptions”中找到表“Table 13. Alternate functions selected through GPIOB_AFR registers for port B”,这里说明了PB6,PB7引脚对应的外设顺序;要注意的是这个引脚顺序与表“Pin definitions”表格上的外设顺序可能不一样哦!
如果是使用LL库,无需调用专用的配置函数(GPIO_PinAFConfig),在初始化io时设置其复用功能即可
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LL_GPIO_PIN_2;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|