• 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發送功能。理解了上面的那個不同之處,添加接收功能也很簡單。