Category Archives: Embedded Systems

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 */<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);</p>
<p>GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />
GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>/* USART configuration */<br />
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);</p>
<p>USART_InitStructure.USART_BaudRate = u32BaudRate;<br />
USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />
USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />
USART_InitStructure.USART_Parity = USART_Parity_No;<br />
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />
USART_Init(USART1, &amp;USART_InitStructure);</p>
<p>USART_Cmd(USART1, ENABLE); // Enable USART 

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

<br />
		/* GPIO Configuration */<br />
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);<br />
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);</p>
<p>		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;<br />
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;<br />
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;<br />
		GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;<br />
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;<br />
		GPIO_Init(GPIOA, &amp;GPIO_InitStructure);</p>
<p>		/* USART configuration */<br />
		USART_InitStructure.USART_BaudRate = u32BaudRate;<br />
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;<br />
		USART_InitStructure.USART_StopBits = USART_StopBits_1;<br />
		USART_InitStructure.USART_Parity = USART_Parity_No;<br />
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;<br />
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;<br />
		USART_Init(USART1, &amp;USART_InitStructure);</p>
<p>		USART_Cmd(USART1, ENABLE);				// Enable USART<br />

这两者唯一的区别在于后者将串口时钟初始化放在了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) 原创,作者戴晓天保留对该文的所有权与变更权。你可以在注明原作者的前提下自由转载,唯一的条件是保留原文的完整性。

串行Flash芯片w25x16使用心得

这一段时间因项目需要使用了Winbond公司的w25x16/w25x32串行Flash存储芯片,对Flash芯片的使用方法略有心得,现整理成文。

在Flash中存储数据与在EEPROM中存储数据不同,不仅需要考虑数据的存储结构,还需要针对Flash独有的特性进行特殊处理。其中最显著的不同点在于Flash在编程前,必须保证待写入区域全部为空(0xFF),否则无法正常执行写入操作;并且Flash在操作时一般需要按数据区域(Section)进行操作,而并非字节。

串行Flash的主要特性有(以w25x16为例):
1、写入前必须保证待写区域为空(全部为0xFF);
2、一次批量编程最多只能写入Page(256B)的大小,如果中途发生换页,需要更改地址后重新发送写入命令;
3、一次擦除至少擦除一个Section(4KB);
4、16个页(Page)构成一个数据区域(Section),16个数据区域(Section)构成一个数据块(Block);
5、擦除时间较长,约为300ms/Sector;
6、编程时间为150+12*n us (折合3ms / page);
7、大容量Flash存在坏区的可能。

对以上问题进行分析,我们可以得到以下一些结论:
1、必须对当前可用的数据块进行检查与标记,从而在编程前保证数据区域的写有效性;
2、单次最多只能写入256字节,当写入的数据发生了换页,需要进行页面切换;如果写入的数据大于256字节,必须进行拆分;
3、若想修改单个数据,必须将整个数据进行读-修改-擦除-写入操作,必须保留与Section同样大小(4K)的临时存放空间。又因为擦除和编程都是比较费时的,可以看到,这个操作代价很高,所以应该尽量避免频繁的修改;
4、擦除时间长还会提高在擦除后、写入前发生断电导致数据全部丢失的风险,需要有一定的安全机制;
5、批量写入的效率更高,可以有一定的写缓冲机制以提高性能;
6、需要对Flash进行校验与坏块标记。

可以看到,Flash的这些特性很像硬盘。在操作系统下,可以使用近乎相同的驱动与文件系统,比如现在流行的SSD硬盘,正是发挥了Flash电原理而非机械原理的速度优势,并且很容易对现有硬盘系统进行直接替换。但换一个角度,在嵌入式应用中,这些特性确实大大增加了编程与设计的难度。

STM意法半导体2012全国研讨会记录

本周三,我前往南京绿地洲际酒店参与了ST公司的全国巡回研讨会。

本次研讨会主要介绍了ST公司MCU家族的两款新系列:STM32F0与STM32F3。

STM32F0系列用于成本敏感的领域,主频在48MHz,可将STM32F1系列进行直接替换,降低产品成本。相比F1系列,STM32F0中加入了1路32位定时器与2路模拟比较器功能。

STM32F3系列基于Cortex-M4,可以认为是F4系列的低成本替代品。相比F4系列,F3系列的主频只有72MHz,但保留了其DSP运算与浮点运算的优势,同时在STM32F37x产品中,率先使用了16位比较积分型ADC。

除这两款产品之外,ST还介绍了自己的新模拟器件,以及支持IIC与射频的双口EEPROM。

这次研讨会传递给我的信息是:ST公司在STM32F1系列市场基本稳健的情况下,开始打出低成本的战略,进一步挤压8位机市场,同时新产品中越来越突出模拟特性,如16位ADC、模拟比较器、PGA等特性的加入,使其MCU逐步向SoC迈进,可见ST称霸单片机市场的雄心。

挑战低功耗7小时纪实

今天,我的一位同事在低功耗设计上遇到了麻烦,他所设计的一个电池供电的设备不到几天就将电池消耗殆尽。经过测量,我发现这个设备的待机功耗过大,达到6.6mA,经核算,按照该功耗,即使设备一直处于休眠状态也只能工作2天。

按照低功耗设计的一般分析方法,可以从硬件和软件两个方面减小设备的功耗。

首先,我怀疑是所用的一些模块功耗较大,于是我把一些可插拔的模块断开,但是功耗没有明显下降,可见功耗损失不来自这些部分。

之后,我仔细核对了他的原理图,我发现了几个可能导致功耗较大的问题:
1、有一些不必要的上拉电阻,如SWD接口的上拉;
2、开关电源的电压反馈分压电阻过小,只有数k;
3、电路中有一个调试中使用的Max232芯片;
4、用于AD检测的分压电阻较小。

每一步的改进结果让人很吃惊:
1、SWD上拉电阻去除:节约0.01mA
2、电源分压电阻改进,由数k调整至数十k:节约0.8mA
3、电源检测电阻去除,节约150uA
4、Max232去除,节约5mA
5、AD分压电阻从1k、2K改为10k与20k,节约0.3mA
总计降低待机功耗: 6.31mA。

几个电路细节的改进之后,待机功耗就降低到了区区250uA。但我对这个结果仍不满意,我希望再通过软件进行进一步优化,我采取了以下措施:
1、IO设为高组态,防止类似I2C的上拉电阻在休眠后因为引脚电平不正确导致电流灌入;
2、关闭IO时钟;
3、关闭外设模块,将不必要的外设在休眠时关断可以减少不必要的功耗损失;
4、关闭AD使能与时钟;
5、关闭Systick,如果使能了Systick,在休眠时可以关断;
6、使用待机模式而不是睡眠模式。
可惜的是,这些并没有起到显著降低功耗的目的,看来STM32对待机的处理已经做得比较完善。

整个分析、解决过程用了我们7个小时,电路功耗由6.6mA降至250uA,工作时间也由2天提高到了72天。我调侃到,我们只用了7个小时,增加了70天的使用时间,还是值得的。

VLCD液晶仿真器(设计)

Virtual LCD Simulator (C) YunFei Studio @ 2012


软件简介:
在设计嵌入式图形界面时,往往需要对界面进行反复修改,这就需要反复烧写Flash,而一般的图形
界面体积较大,烧写过程需要占用较长时间。另外在图形界面的设计过程中,离不开反复调试验证,而
针对嵌入式领域的调试一般较繁琐,需要有专门的开发环境与调试工具。
针对以上两点问题,我开发了本软件。本软件是专门针对图形液晶的仿真软件,利用本软件可以实现
快速GUI原型设计、虚拟液晶等功能。通过VLCD服务器及相关的编程接口,用户可以使用高级开发环境进
行原型阶段的设计,并且可以很方便的移植到自己的系统中。VLCD也提供了常用外设的仿真功能,包括虚
拟按键、虚拟LED、虚拟触摸屏、虚拟蜂鸣器等,为用户的程序进行更全面的仿真,加速开发进程。
软件还提供了虚拟液晶的功能,利用VLCD.com、VLCD.net工具,用户可以将远程端的数据利用串口或
者网络接口进行实时显示,从而实现数据可视化。


软件功能:
1、支持的仿真模式:单色点阵/彩色TFT
2、可配置的像素大小
3、支持触摸屏
4、支持按钮、流水灯、蜂鸣器等外设
5、支持英文、中文字库
6、使用VS2008编程使用
7、支持网络远程控制(VLCD.net)
8、支持串口控制(VLCD.com)
9、支持个性化配置


 

软件结构:


软件组件:
VLCD Simulator 仿真主程序
VLCD VPanel 仿真控制台
VLCD Port 程序编程接口
VLCD.cmd 命令行接口
VLCD.net 网络控制接口
VLCD.com 串口控制接口


 

STM32F10x启动文件的选择

STM32的启动文件根据型号不同,可分为以下几种:

– startup_stm32f10x_ld_vl.s: for STM32 Low density Value line devices
– startup_stm32f10x_ld.s: for STM32 Low density devices
– startup_stm32f10x_md_vl.s: for STM32 Medium density Value line devices
– startup_stm32f10x_md.s: for STM32 Medium density devices
– startup_stm32f10x_hd.s: for STM32 High density devices
– startup_stm32f10x_xl.s: for STM32 XL density devices
– startup_stm32f10x_cl.s: for STM32 Connectivity line devices

cl:互联型产品,stm32f105/107系列
vl:超值型产品,stm32f100系列
xl:超高密度产品,stm32f101/103系列
ld:低密度产品,FLASH小于64K
md:中等密度产品,FLASH=64 or 128
hd:高密度产品,FLASH大于128