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

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

STM32F10x系列型谱

STM32家族有丰富的型谱,具有不同引脚数、封装、外设以及储存器大小的型号可供选择。

虽然型号众多,但实际上只有四个大系列:

Access line : STM32F101;

USB Access line :STM32F102;

Performance line : STM32F103;

Connectivly line :  STM32F105、STM32F107。

相同系列的不同型号外设基本一致,只在存储空间和引脚数量上有差别。可见,STM32针对中低端、中端、高端都有合适的型号,给开发者丰富的选择余地。当然,较多的型号会带来厂家生产与销售上的难题,不过这不是开发者考虑的事情了。

为什么选择STM32

自从1976年Intel 8048诞生以来,单片机经历了8位、增强型8位、16位三个时代。

最早的电子工程师使用8位机作为硬件平台,利用汇编语言编写程序。当时的单片机程序空间有限,一般只有1-2KB的ROM可供使用。之后出现了8051单片机,程序空间提高到了4KB,使高级语言的使用也成为了可能。近十年来,增强型8位机发展迅猛,有加强型8051单片机、AVR单片机、PIC单片机等,这些单片机具有很大的ROM与RAM空间,可以使用C语言编程。同时这些单片机具有丰富的外设资源,可以满足工业、消费电子、汽车、仪器仪表等多方面的需要。与次同时,市场上也有很多16位机广受欢迎。比如飞思卡尔的MS9S12系列广泛用于汽车行业,TI的MSP430用于仪器仪表、物联网行业。

L_Intel-D8048H

图1  Intel 8048单片机

如果没有Cortex-M3的诞生,谁也不会想到高端的32位机也能进入单片机市场。STM32单片机的出现动摇了8位机的天下,它丰富的性能、外设、网络、通讯功能,以及完全可以与8位机拼搏的价格,让很多人不由自主的开始关注起它。

STM32卓越的性能、丰富的功能,以及稳健的外设库,让工程师们不再把精力用于调试底层、精简代码,而是把更多的精力放在应用上。我认为这必将是一个划时代的作品,让单片机进入32位的时代,这是一种趋势。利用STM32,工程师可以开发出性能更加优越、功能更加丰富的产品。然而,这也是一次挑战,使用32位处理器需要我们转变很多传统的设计思维。同时复杂性的提高也会导致设计中的要点急剧增多,我们可能会很难找到设计症结的所在。同时资源的丰富也需要我们在功能与性能之间作出权衡。

我相信,不需要过长时间,很多事情就会明朗起来。

STM32_p2326shigh图2  STM32单片机