STM32F4跟F1在很多方面还是有区别的。就比如今天要驱动的串口。
碰见俩问题:
第一个,在F1里边你可以使用这样的方式配置时钟复用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//打开复用时
但是。。。在F4里边这个就不管用了。因为F4的变了,以前的那些变量不再爱你了。库里边根本就没有了这个变量RCC_APB2Periph_AFIO
第二,GPIO的输入输出模式也变了。这样的用法:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;。已经不行了。原因同上,GPIO_Mode_IN_FLOATING这种模式已经不存在了。
在F4的库里边只有这个模式:GPIO_Mode_AF。所有使用复用功能的引脚都应设置成这种模式。
这样比F1方便多了。你不用考虑这个引脚应该设置成浮空输入还是推挽输出....因为引脚设置错误基本可以消失。
一下是我的程序,在F4Discover上跑的。刚开始希望使用默认的PA9PA10作为串口引脚,后来发现这两个脚在板子上已经被使用了。于是换成了PB6 PB7来做串口1.这个映射比F1也简单多了。
1、配置GPIO
void Gpio_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB , ENABLE); //不能忘记开时钟
//PB6->TX PB7->Rx
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_USART1);//注意这里
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_USART1);
}
2、串口功能设置:
void USART_Config()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
USART_InitStructure.USART_BaudRate = 115200;//115200;
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);
}
这只是一个测试,所以我只完成了USART发送功能。理解了上面的那个不同之处,添加接收功能也很简单。
总结:变了就变了,我们有了新欢。比F1的更方便更快捷。