Category Archives: STM32

STM32F4 | 开始你的Discovery

拿到STM32F4 Discovery已经很长时间了,最近想用它做一些数字信号处理的实验,今天花些时间熟悉了其基本的使用用法,写此教程共勉之。

STM32 Discovery的相关资料可以在官网上获得:www.st.com/stm32f4-discovery,这里我们以官方的演示工程Demonstration为例,介绍其工程配置与程序下载方法,该工程实际上就是Discovery出厂时的默认代码。

一、下载代码包

在官网上下载库函数以及示例代码”STSW-STM32068″:

下载、解压后的目录树如下所示:

其中Libraries为库函数,Project为演示工程,Utilities为实用函数库。

二、编译演示工程

1、打开工程文件:.\STM32F4-Discovery_FW_V1.1.0\Project\Demonstration\MDK-ARM

2、编译工程:点击Rebuild All,等待编译完成。

三、配置下载设置

推荐使用板载的ST-Link2,调试起来很方便。因为有外置的SWD接口,也可以外接JLink等其他调试工具。配置方法如下:

[1] 将下载器配置为ST-Link▼

[2] 将接口方式修改为SW方式▼

[3] 添加Flash下载算法▼

(!)低版本的MDK不支持ST-Link,需要升级版本,我之前使用的是V4.12,下载时提示找不到ST-Link,升级为V4.6后解决。如果电脑无法识别ST-Link,请前往官网下载ST-LINK2的驱动:
http://www.st.com/web/en/catalog/tools/FM146/CL1984/SC720/SS1450/PF251168?s_searchtype=partnumber

四、下载演示工程

点击Download按钮下载工程,如果配置无误就可以成功下载了,下载完成后,Discovery板上的流水灯开始运行,按下蓝色按钮进入MEMS测试模式,此时倾斜PCB板可以观察到对应方向上的LED闪烁。

五、结语

其他工程都可以按照此方法进行测试,Peripheral_Examples中有很多对STMF407外设的测试代码,大家可以自己尝试。这里再提供两个参考资料:

STM32的UID(全球唯一ID)介绍与应用

每个STM32芯片在出厂时都具有一个全球唯一的芯片ID(UID),该ID为96位,其存储地址分布如下:

Start Address : 0x1FFF F7E8

Address offset: 0x00 U_ID(00-31)

Address offset: 0x04 U_ID(32-63)

Address offset: 0x08 U_ID(64-96)

该ID的应用领域(引用自Datasheet):

●用来作为序列号(例如USB字符序列号或者其他的终端应用)
●用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。
●用来激活带安全机制的自举过程

STM32 | 串口初始化发送0xFE的Bug

最近在使用STM32F103串口功能时,发现第一个发出的串口数据帧总是不能被正确识别,在监听串口的原始报文后,我发现原来是数据帧前面多了一个0xFE。在经过一些尝试性的程序调整之后,我发现这个问题竟然和串口时钟初始化所在的位置有关。

这是存在问题的初始化程序:

 /* GPIO Configuration */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART configuration */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

USART_InitStructure.USART_BaudRate = u32BaudRate;
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); // Enable USART 

这是修改后工作正常的代码:

		/* GPIO Configuration */
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);

		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
		GPIO_Init(GPIOA, &GPIO_InitStructure);

		/* USART configuration */
		USART_InitStructure.USART_BaudRate = u32BaudRate;
		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);				// Enable USART

这两者唯一的区别在于后者将串口时钟初始化放在了GPIO引脚初始化之前!

我现在还没有办法解释这种情况发生的原因,但是我推测是一些隐晦的时序问题导致串口数据线上产生了一个错误的数据,我还将进一步跟踪这个问题。(文中所用编译器为Keil MDK,有读者反应IAR无此问题,待测试验证)

STM32 | STM32的低功耗设计

在谈到低功耗处理器时,我们第一个想到的总是MSP430,但其实STM32也能拥有不错的低功耗特性。通过合理的进行软件设置,STM32在工作时的功耗可以降至数十mA,而待机功耗可以降到数uA。总的来说,降低STM32功耗的方法主要有以下三种:

1. 关闭不需要的外设时钟

STM32的所有外设都可以独立开启和关断,通过将不需要的AHB/APB的时钟关闭,可以起到降低总待机功耗的作用。各个模块的典型功耗如下所示:

Figure 1. APB1外设的典型功耗

Figure 2. APB2外设的典型功耗

2. 降低主时钟的工作频率

对数字电路而言,功耗是与主频呈正比的。在进行一般任务时主动降低功耗,在需要高性能运算时再恢复到一般频率,通过这种方法可以显著降低设备运行期间的平均功耗,这也是目前很多电脑和手机的功耗优化方案之一。

Figure 3. CPU主频-功耗-温度的关系

3. 进入休眠模式

当设备不需要运行时,可将CPU切换至休眠状态。STM32共有三种休眠状态,如下:

Figure 4. STM32的休眠模式

这三种模式下的典型功耗如下:

Figure 5. Sleep模式下的典型功耗

Figure 6. Stop和Standby模式下的典型功耗

可见Standby模式功耗最低,在数个uA;其次是Stop模式,为数十uA;而Sleep模式的功耗最大,是其余两种模式的100倍。那么既然Standby功耗最低,那么另外两种模式的意义又是什么呢?首先,这三种模式下的唤醒时间各不相同:

Figure 7. 不同休眠模式下的启动时间

其次,这三种模式的特性也不相同:

·Sleep mode

唤醒后程序继续运行

CPU停止运行,但外设继续运行,IO状态保持不变

唤醒时间最短,但功耗较大。

·Stop mode

所有时钟停止运行

IO状态不变

唤醒后程序从休眠处继续运行

1.8 V domain are stopped, the PLL, the HSI and the HSE RC oscillators are disabled. 所以RCC和备份区在启动后需要重新配置。

·Standby mode

功耗最低

每次唤醒后和System Reset/POR一样,程序会重新运行。

IO呈高阻态

RAM与寄存器数据全部丢失,除备份寄存器外。

1.8 V domain are stopped, the PLL, the HSI and the HSE RC oscillators are disabled. 所以RCC和备份区在启动后需要重新配置。

可见Standby有三个缺点:

1) 唤醒时间长

2) 唤醒源单一,只有RTC、WAKEUP、WATCHDOG和RESET

3) 每次唤醒等同与重启,会丢失RAM中的数据

所以究竟使用什么样的休眠程序,还是需要看具体项目的具体特性的,在功耗-唤醒时间-唤醒源-休眠特性上做出一个折中。

参考资料:

·STM32F103xC_D_E Datasheet Rev 7, Sep 2009, ST Microcontroller

·STM32 Technique Reference Manual Rev 14, ST Microcontroller

本文由云飞机器人实验室 (www.yfworld.com) 原创,作者戴晓天保留对该文的所有权与变更权。你可以在注明原作者的前提下自由转载,唯一的条件是保留原文的完整性。

STM32F4 | Discovery开发板简介

不久之前在淘宝上购买了一块STM32F4-Discovery开发板,根据自己的使用情况以及官方提供的说明手册,撰写了这篇关于该开发板的初步介绍,以供初学者参考。

DSC03790Figure 1. F4-Discovery外观与包装

F4-Discovery是ST公司推出的官方开发套件,从开发板板载的资源来看,该开发板在设计上着重突出了F4的数字信号处理能力。其板载的芯片有1片STM32F407VGT6,1个三轴MEMS,1个音频MEMS,以及1片音频DAC。在接口上,其有一个miniUSB接口(用于供电及调试),一个USB OTG接口,一个音频输出接口,并且引出了大多数IO引脚。在人机交互接口上,有2个用户按钮,4个状态指示灯和4个不同颜色的用户LED指示灯。另外F4Discovery还板载了ST-Link/v2调试器,可以起到简单的调试、仿真作用,从而免除了额外的JLINK仿真器。

DSC03792Figure 2. F4-Discovery使用STM32F407VGT6处理器

相比STM32F1系列,基于Cortex-M4的STM32F4系列在处理器最高频率、FLASH容量、RAM容量、浮点数和DSP运算上有更强的能力。F4Discovery使用的主控芯片是STM32F407VGT6,其主频为168MHz,包含1024KB FLASH与192 KB RAM,主频是STM32F1的两倍,存储资源是F1系列的两倍,因为含硬件浮点数运算单元,计算浮点数的能力更是比STM32F1系列大得多。在性能提高的同时,芯片价格也随着水涨船高,目前STM32F407VGT6在淘宝上的价格为50-70元,比STM32F103VET6的20-30元高出一倍。虽然主芯片成本就高达50元,但STM32F4-Discovery的售价却非常便宜,官方为14.9刀,淘宝售价仅在130元左右。F4系列的市场定位是DSC (Digital Signal Controller),可以取代DSP在运动控制方向的应用场合,如电动汽车的无刷电机控制和机械手的运动控制,其定位基本与dspic相同,同时它也是F1系列产品遇到瓶颈后的升级选择。

DSC03791Figure 3. F4-Discovery正面视图

参考资料:

1、STM32F4DISCOVERY data brief,ST Microcontroller,Sept 2011

 

本文由云飞机器人实验室 (www.yfworld.com) 原创,作者戴晓天保留对该文的所有权与变更权。你可以在注明原作者的前提下自由转载,唯一的条件是保留原文的完整性。