STM32F4是由ST(意法半导体)开发的一种高性能微控制器。其采用了90 纳米的NVM 工艺和ART(自适应实时存储器加速器,Adaptive Real-Time MemoryAccelerator™)。
简介:
ST(意法半导体)推出了以基于ARM® Cortex™-M4为内核的STM32F4系列高性能微控制器,其采用了90 纳米的NVM 工艺和ART(自适应实时存储器加速器,Adaptive Real-Time MemoryAccelerator™)。
ART技术使得程序零等待执行,提升了程序执行的效率,将Cortext-M4的性能发挥到了极致,
使得STM32 F4系列可达到210DMIPS@168MHz。
自适应实时加速器能够完全释放Cortex-M4 内核的性能;当CPU 工作于所有允许的频率(≤168MHz)时,在闪存中运行的程序,可以达到相当于零等待周期的性能。
STM32F4系列微控制器集成了单周期DSP指令和FPU(floating point unit,浮点单元),提升。
了计算能力,可以进行一些复杂的计算和控制。
STM32 F4系列引脚和软件兼容于当前的STM32 F2系列产品。
优点
※兼容于STM32F2系列产品,便于ST的用户扩展或升级产品,而保持硬件的兼容能力。
※集成了新的DSP和FPU指令,168MHz的高速性能使得数字信号控制器应用和快速的产品开发达到了新的水平。提升控制算法的执行速度和代码效率。
※先进技术和工艺
- 存储器加速器:自适应实时加速器(ART Accelerator™ )。
- 多重AHB总线矩阵和多通道DMA:支持程序执行和数据传输并行处理,数据传输速率非常快。
- 90nm工艺
※高性能
- 210DMIPS@168MHz。
- 由于采用了ST的ART加速器,程序从FLASH运行相当于0等待更多的存储器。
- 多达1MB FLASH (将来ST计划推出2MB FLASH的STM32F4)。
- 192Kb SRAM:128KB 在总线矩阵上,64KB在专为CPU使用的数据总线上高级外设与STM32F2兼容。
- USB OTG高速 480Mbit/s。
- IEEE1588, 以太网 MAC 10/100。
- PWM高速定时器:168MHz最大频率。
- 加密/哈希硬件处理器:32位随机数发生器(RNG)。
- 带有日历功能的32位RTC:<1 μA的实时时钟,1秒精度。
※更多的提升
- 低电压:1.8V到3.6V VDD,在某些封装上,可降低至1.7V。
- 全双工I2S
- 12位 ADC:0.41us转换/2.4Msps(7.2Msps在交替模式)。
- 高速USART,可达10.5Mbits/s。
- 高速SPI,可达37.5Mbits/s。
- Camera接口,可达54M字节/s。
1.STM32F407ZG应用。
电机驱动和应用控制
医疗设备
工业应用:PLC,变频器,断路器。
打印机和扫描仪
报警系统,可视对讲,暖通空调
家用音响设备
2.STM32F407ZG概述。
STM32F407ZG系列是基于高性能的ARM®Cortex™-M4F的32位RISC内核,工作频率高达168 MHz的。的Cortex-M4F核心功能支持所有ARM单精度数据处理指令和数据类型的单精度浮点单元(FPU)。它还实现了一套完整的DSP指令和内存保护单元(MPU),从而提高应用程序的安全性。
该STM32F407ZG系列采用高速嵌入式存储器(多达1 MB闪存,高达192 KB的SRAM),最多4字节的备份SRAM,以及广泛的增强I / O的连接到两条APB总线和外设,两个AHB总线和一个32位的多AHB总线矩阵。
所有STM32F407ZG设备提供3个12位ADC,两个DAC,1个低功耗RTC,12个通用16位定时器,其中包括两个用于电机控制的PWM定时器,两个通用32位定时器。一个真正的随机数发生器(RNG)。他们还配备了标准和先进的通信接口。
3.STM32F407ZG参数。
STM32F407ZG存储器程序闪存(KB) 1024 RAM(KB) 192 。
STM32F407ZG性能参数,工作频率(兆赫) 168 。
16位定时器(IC / OC / PWM) 12(24/24/30)
32位定时器(IC / OC / PWM) 2(8/8/8)
A / D转换器 3X12位 。
D / A转换器 2X12位 。
通信接口 3xSPI 2xI2S 2xI2C; 4xUSART 2xUART 两个USB OTG(FS + FS / HS); 。
2xCAN 1xSDIO 以太网MAC10/100 的I / O 114 。
电压(V):1.8到3.6 。
4.STM32F407ZG封装与引脚。
LQFP144
stm32f411和407区别是:
stm32f407:又称STM32F4,由ST(意法半导体)开发的一种高性能微控制器。采用了90纳米的NVM工艺和ART。特点不同。stm32f411:按片内Flash的大小可分为三大类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。
疑问
在做待机唤醒实验时,会有这样的疑问:只有进入待机模式的代码,那么唤醒是如何唤醒的?
原理
(此节主要针对待机唤醒原理进行简单介绍,可以根据自己情况自动略过)
STM32F4待机模式
在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。
STM32F4 的 3 种低功耗模式。
在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2.2uA 左右的 电流。停机模式是次低功耗的,其典型的电流消耗在350uA 左右。最后就是睡眠模式了。
进入/退出待机模式
拓展:
在进入模式的第三步:将WUF位清零,查看寄存器PWR_CSR。
清零需要通过PWR_CR进行配置:CWUF位置1。
退出模式
根据图1及下面stm32部分时钟树可知,在待机的状态下,PLL、HSI 和 HSE 振荡器被断电、1.2V供电区别断电,可以认为只有LSI、LSE振荡器在工作,因此RTC、独立看门狗可以工作,从而进行待机唤醒。(还有WKUP上升沿、NRST复位)
代码
#include "wkup.h"。
#include "led.h"。
#include "delay.h" 。
#include "usart.h" 。
//系统进入待机模式
void Sys_Enter_Standby(void)。
{
while(WKUP_KD); //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机)。
RCC_AHB1PeriphResetCmd(0X04FF,ENABLE);//复位所有IO口。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟 。
PWR_BackupAccessCmd(ENABLE);//后备区域访问使能。
//这里我们就直接关闭相关RTC中断。
RTC_ITConfig(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA,DISABLE);//关闭RTC相关中断,可能在RTC实验打开了。
RTC_ClearITPendingBit(RTC_IT_TS|RTC_IT_WUT|RTC_IT_ALRB|RTC_IT_ALRA);//清楚RTC相关中断标志位。
PWR_ClearFlag(PWR_FLAG_WU);//清除Wake-up 标志。
PWR_WakeUpPinCmd(ENABLE);//设置WKUP用于唤醒。
PWR_EnterSTANDBYMode(); //进入待机模式。
//检测WKUP脚的信号
//返回值1:连续按下3s以上。
// 0:错误的触发 。
u8 Check_WKUP(void) 。
u8 t=0;
u8 tx=0;//记录松开的次数。
LED0=0; //亮灯DS0 。
while(1)
{
if(WKUP_KD)//已经按下了。
{
t++;
tx=0;
}else
{
tx++;
if(tx>3)//超过90ms内没有WKUP信号。
{
LED0=1;
return 0;//错误的按键,按下次数不够。
}
}
delay_ms(30);。
if(t>=100)//按下超过3秒钟。
{
LED0=0; //点亮DS0 。
return 1; //按下3s以上了。
}
}
}
//中断,检测到PA0脚的一个上升沿. 。
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)。
{ 。
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位。
if(Check_WKUP())//关机? 。
{
Sys_Enter_Standby(); //进入待机模式 。
}
}
//PA0 WKUP唤醒初始化。
void WKUP_Init(void)。
{
GPIO_InitTypeDef GPIO_InitStructure;。
NVIC_InitTypeDef NVIC_InitStructure;。
EXTI_InitTypeDef EXTI_InitStructure;。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式。
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; 。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 。
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉。
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 。
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0。
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0。
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件。
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 。
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0。
EXTI_Init(&EXTI_InitStructure);//配置。
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2。
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2。
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道。
NVIC_Init(&NVIC_InitStructure);//配置NVIC。
//(检查是否是正常开)机 。
if(Check_WKUP()==0)。
{
Sys_Enter_Standby(); //不是开机,进入待机模式 。
}
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
此处为wkup.c代码,比较简单,这里不再进行阐述,下面主要针对上述疑问进行解释。(通过查阅资料,自行理解的逻辑)
理解
首先,开机后,从int main()函数进行初始化,进行到WKUP_Init();对PA0进行相关配置,检查是否长按开机键,没有,进入Sys_Enter_Standby()函数,在函数内最后进入待机模式:PWR_EnterSTANDBYMode()。
PWR_EnterSTANDBYMode()配置在原理中已经进行介绍,不再重复,主要针对函数内的WFI进行介绍:
WFI: wait for Interrupt 等待中断,即下一次中断发生前都在此hold住不干活。
也就是说:当前大环境是正常运行状态,当运行于此处时,卡住不进行后续代码执行,相当于进行待机处理。
所以在初始化时,运行到WFI就卡在了一个地方。
当按键wkup被按下时,其实已经进行了待机唤醒处理,(从按下时,灯光亮了一下就可以看出来,程序已经开始运行了,没有继续卡在原处),此时是从int main()函数第一行开始重新运行。进行到WKUP_Init();对PA0进行相关配置,检查是否长按开机键。
没有按够3s,重复上述1、2步骤;
当按键达到3s后,跳过WKUP_Init()函数中的ifCheck_WKUP()函数,程序正常运行,从而达到唤醒功能。并配置PA0中断方式。
当再次按键达到3s后,进入中断,判断有没有按够3s。时间不够,继续运行正常状态;时间达到3s,Sys_Enter_Standby()。
再次进入待机模式。
void EXTI0_IRQHandler(void)。
{ 。
EXTI_ClearITPendingBit(EXTI_Line0); // 清除LINE10上的中断标志位。
if(Check_WKUP())//关机? 。
{
Sys_Enter_Standby(); //进入待机模式 。
}
}
stm407和417区别如下:
1、stm32f407又称STM32F4,由ST(意法半导体)开发的一种高性能微控制器,采用了90纳米的NVM工艺和ART。
2、stm32f417按片内Flash的大小可分为三大类小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。