STM32F4与STM32F1的区别
• stm32F1是cortex- M3的内核。 Stm32f4是cortex-M4的内核
• F1最高主频 72MHz, F4最高主频168MHz。
• F4具有单精度浮点运算单元,F1没有浮点运算单元。
• F4的具备增强的DSP指令集。F4的执行16位DSP指令的时间只有F1的30%~70%。F4执行32位DSP指令 的时间只有F1的25%~60%。
• 程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个 4GB 的线性地址空间内。 可访问的存储器空间被分成 8 个主要块,每个块为 512MB 。
F1小容量产品是指闪存存储器容量在 16K 至 32K 字节,中容量产品是指闪存存储器容量在 64K 至 128K ,大容量产品是指闪存存储器容量在 256K 至 512K 。
主存储块容量:
小容量产品主存储块最大为 4K × 64 位,每个存储块划分为 32 个 1K 字节的页 ( 见表 2) 。
中容量产品主存储块最大为 16K × 64 位,每个存储块划分为 128 个 1K 字节的页 ( 见表 3) 。
大容量产品主存储块最大为 64K × 64 位,每个存储块划分为 256 个 2K 字节的页 ( 见表 4) 。
互联型产品主存储块最大为 32K × 64 位,每个存储块划分为 128 个 2K 字节的页 ( 见表 5) 。
• F1内部SRAM最大64K字节, F4内部SRAM有192K字节(112K+64K+16K)。 STM32F10xxx 内置 64K 字节的静态 SRAM 。它可以以字节、半字 (16 位 ) 或全字 (32 位 ) 访问。 SRAM 的起始地址是 0x2000 0000 。 STM32F405xx/07xx 和 STM32F415xx/17xx 带有 4 KB 备份 SRAM,和 192 KB 系统 SRAM 。 STM32F42xxx 和 STM32F43xxx 带有 4 KB 备份 SRAM,和 256 KB 系统 SRAM 。
• STM32F4主存储器块,分为 4 个 16 KB扇区、1个64 KB扇区和7个128 KB扇区,系统存储器,器件在系统存储器自举模式下从该存储器启动。512 字节 OTP(一次性可编程),用于存储用户数据。对于 STM32F40x 和 STM32F41x ,容量高达 1 MB(STM32F407ZGT6:1MB,STM32F407ZET6:512KB)。1MB(FFFFF)
• F4有备份域SRAM(通过Vbat供电保持数据),F1没有备份域SRAM。
• F4从内部SRAM和外部FSMC存储器执行程序的速度比F1快很多。F1的指令总线I-Bus只接到Flash上,从SRAM和FSMC取指令只能通过S-Bus,速度较慢。F4的I-Bus不但连接到Flash上,而且还连接到SRAM和FSMC上,从而加快从SRAM或FSMC取指令的速度。
• F1最大封装为144脚,可提供112个GPIO;F4最大封装有176脚,可提供140个GPIO。
• F1的GPIO的内部上下拉电阻配置仅仅针对输入模式有用,输出时无效。而F4的GPIO在设置为输出模式时,上下拉电阻的配置依然有效。即F4可以配置为开漏输出,内部上拉电阻使能,而F1不行。
• F4的GPIO最高翻转速度为84MHz,F1最大翻转速度只有18MHz。
• F1最多可提供5个UART串口,F4最多可以提供6个UART串口。
• F1可提供2个I2C接口,F4可以提供3个I2C接口。
• F1和F4都具有3个12位的独立ADC,F1可提供21个输入通道,F4可以提供24个输入通道。F1的ADC最大采样频率为1Msps,2路交替采样可到2Msps(F1不支持3路交替采样)。F4的ADC最大采样频率为2.4Msps,3路交替采样可到7.2Msps。
• F1只有12个DMA通道,F4有16个DMA通道。F4的每个DMA通道有4*32位FIFO,F1没有FIFO。
• F1的SPI时钟最高速度为 18MHz, F4可以到37.5MHz。
• F1没有独立的32位定时器(32位需要级联实现),F4的TIM2和TIM5具有32位上下计数功能。
• F1和F4都有2个I2S接口,但是F1的I2S只支持半双工(同一时刻要么放音,要么录音),而F4的I2S支持全双工,放音和录音可以同时进行。
• 关于管脚:
F1系列的某个管脚的外设在复用的时候是会影响别的引脚复用的(二者有相同的复用功能,当一个管脚复用该功能时,另一个管脚在复用时 是会受影响的)因为F1系列没有这个寄存器只要引脚对应的外设使能就能用,看似配置简单一些,实则管脚配置时是要注意外设之间的冲突的。相比之下F4系列配置非常随意,没有此顾虑,这也是为什么F4系类很少使用引脚重映射的功能,而F1相对F4来说使用频率要高的多,总之就f4比f1灵活吧
STM32F4的USART1跟STM32F1在很多方面还是有区别的。
第一,在STM32F1里边,这样方式配置时钟复用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1,ENABLE);
//打开复用时,但是在F4里边这个就不管用了。库里边根本就没有了这个变量RCC_APB2Periph_AFIO
第二,GPIO的输入输出模式配置也有变化。
这样的用法:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;。这种模式已经不存在,在F4的库里边只有这个模式:GPIO_Mode_AF。所有使用复用功能的引脚都应设置成这种模式。这样比F1方便多了。你不用考虑这个引脚应该设置成浮空输入还是推挽输出,因为引脚设置错误基本可以消失。
总结原因:F4没有了时钟复用功能。配置完成之后,需要用GPIO_PinAFConfig()设置功能映射。
以下程序在STM32F4硬件上运行,原始使用默认PA9PA10作为串口引脚,现在更换PB6 PB7来做串口1.这个映射比F1也简单多了。
总结原因:F4没有了时钟复用功能。配置完成之后,需要用GPIO_PinAFConfig()设置功能映射。
以下程序在STM32F4硬件上运行,原始使用默认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(GPIOB,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);
}
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(GPIOB,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发送功能。理解了上面的那个不同之处,添加接收功能也很简单。