[STM32]Nucleo-F446RE(主控:STM32F446RE)测评


测:

*基本概念:

1、 什么是Nucleo?(说实话,作者我也是对这个概念很好奇)

Nucleo是意法半导体加入ARM embed项目后的又一个风格系列板卡,有两个鲜明的特点:1.兼容Arduino UNO R3 Shield扩展板、2. 支持ARM embed项目。或许有人会有疑问,什么是ARM embed项目?mbed是一个面向ARM Cortex-M系列处理器的原型开发平台,主要用于培育物联网(IoT)的协作项目,包括了免费的软件库(SDK),硬件参考设计(HDK)和在线工具(Web)三部分,为用户提供简单、方便快捷的基于ARM Cortex-M处理器的MCU开发、调试等操作。

参考网址:http://www.eeboard.com/evaluation/stm32f401-nucleo/

2、什么是STM32 Nuleo 核心板?

方案简述: TM32 Nucleo 核心板是ST为用户全新设计的开放式开发平台,为用户提供了经济、灵活的途径,用于快速验证创意,制作产品样机。用户可以灵活选择带有目标单片机的多种核心板。此核心板配有两种扩展接口,一个是兼容Arduino标准的接口,用于连接符合Arduino标准的外设,另一种接口引出了全部通用I/O端口,用户评估芯片功能。

STM32 Nucleo 核心板集成了ST-LINK/V2-1,提供调试和编程的用途。

STM32 Nucleo 核心板还配套了完整的STM32软件库和各种例程,同时可以直接享用embed在线的多种资源。

核心MCU: STM32F0、STM32F1、STM32F3、STM32F4、STM32L0、STM32L1

参考网址:http://www.stmcu.com.cn/ecosyste ... paign=Baidu-Generic

3、STM32 Nuleo类开发板的特点是什么?

特点:Nulceo系类的开发板套件是ST公司2014年新出的学习套件。Nucleo是意法半导体加入ARM embed项目后 的又一个风格系列板卡,有两个鲜明的特点:

a.兼容Arduino UNO R3 Shield扩展板、

b. 支持ARM embed项目。

或许有人会有疑问,什么是ARM embed项目?mbed是一个面向ARM Cortex-M系列处理器的原型开发平台,主要用于培育物联网(IoT)的协作项目,包括了免费的软件库(SDK),硬件参考设计(HDK)和在线工具 (Web)三部分,为用户提供简单、方便快捷的基于ARM Cortex-M处理器的MCU开发、调试等操作。

4、mbed是什么?

mbed是一个面向ARM处理器的原型开发平台,它具体包括免费的软件库(SDK),硬件参考设计(HDK)和在线工具(Web)三部分内容,各个部分的具体介绍如下:

SDK:mbed设计了一个硬件抽象层,从而屏蔽了不同mcu厂商提供了微处理之间的差异,对于用户来说,他只需要和这个硬件抽象层打交道即可,也就是说,用户基于mbed开发的应用可以很方便地更换使用不同厂商的arm微处理器,从而留给用户更多的选择。

HDK:HDK是mbed提供的硬件参考设计,它是面向用户开发设计的,所以HDK提供了统一了程序上载接口,单步调试接口,串口调试接口,用户无需购买其它硬件就可以开始软件开发工作。

WEB:为了省去用户开发环境安装的麻烦,mbed提供了一个完备的基于浏览器的微处理器软件开发环境,包括代码编写,程序编译,版本控制等功能,用户只要上网就可以开发,编译结果只要下载保存到mbed开发板上即可工作,非常方便。

参考网址:http://www.bubuko.com/infodetail-374136.html

STM32 Nuleo类开发板的“进化”:

Nucleo板的对比:

*Nucleo-F446RE板硬件功能介绍:

1、外观图片

2、Nucleo板外观

Nucle板的结构组成:

板卡上集成了ST-LINK,可用于调试和下载程序;

板卡支持Arduino 接口,同时还提供ST Morpho 扩展排针,用于连接微控制器的所有周边外设;

特别突出的是此款板卡支持mbed项目。

如果感兴趣的话,可以仔细参考如下的附件:(这个附件中有对该Nucleo的硬件及IO的介绍,以及电路原理图等等)

User manual STM32 Nucleo-64 boards.pdf (1.94 MB, 下载次数: 5)

3、Nucleo板硬件功能介绍

开发板名:STM32 Nucleo-F446RE(主控STM32F446RE)

下载线: mini-USB数据线(预留SW方式的调试接口和ST-LINK接口)

ST-LINK主控是STM32F103CBT6,带8M的晶振

a、ST-LINK8M晶振波形(示波器有点烂,凑合着看)

b、Nucleo-F446RE板的外部晶振只有32.768Khz的LSE OSC,HSE OSC没有焊接(包括其匹配电容),这个我在后面的评中说明下。

32.768Khz的LSE OSC在板子上的料件表面mark为32C501

c、因为我手里除了Nucleo-F446RE的板子,还有stm32F407的板子,对比了下两个主控的Clock Tree,发现差异还是很大。

详细的可以参考下二者英文参考手册:如下从Clock tree 直观的就能看出二者的差异。

4、Nucleo板原理图的了解

从原理图的格式来看,ST公司的工程师用的是Altium Designer来设计的。而且为了使读者对原理图结构有较好的理解,在第一页使用了sheet symbol。

并且,工程师有添加Note。

扩展IO的示意图:

为什么该板的USB cable能实现ST-link调试呢(前提是ST-link的跳线帽插上,这个是默认的)?我们看硬件电路原理图就明白了。这个在后面我们调试和烧录

的时候就用到了。

5、关于STM32F446:

STM32F446产品系列是高度集成的节能产品,具有高性能和丰富的连接性,Flash最小为256KB。

它利用ST的专有ART Accelerator™、智能架构、先进的Flash技术及其嵌入式ARM Cortex-M4内核,实现了225 DMIPS和608 CoreMark® 的领先性能(180MHz频率下从嵌入式Flash执行)。

通过多个接口进行高效并发通信,使工业、科技、医疗以及物联网(Internet-of-Things,IoT)应用更加智能并具有更多交互,同时先进的处理技术和动态电压调节、广泛的时钟门控以及灵活的睡眠模式实现了有效的节能。

性能:

在180 MHz频率下,从Flash执行时,STM32F446能够提供225 DMIPS/608 CoreMark性能,并且利用意法半导体的ART加速器实现了FLASH零等待状态。 DSP指令和浮点运算单元扩大了产品的应用范围。

功效:该系列产品采用意法半导体90 nm工艺和ART加速器,具有动态功耗调整功能,能够在运行模式下和从Flash存储器执行时实现低至200 μA/MHz的电流消耗(@ 180 MHz)。 停机模式下,功耗为50 μA(典型值)。

集成:

2个专用音频PLL,SPDIF输入,3路半双工I2S和2路串行音频接口(SAI),支持全双工I2S和时分复用(TDM)模式。

多达20个通信接口(包括4个USART、2个速度达11.25 Mbit/s的UART、4个速度达45 Mbit/s的SPI、3个具有新型可选数字滤波器功能的I2C、2个CAN、SDIO、HDMI CEC以及摄像头接口)

两个12位DAC、三个速度为2 MSPS或7.2 MSPS(交错模式)的12位ADC定时器多达17个:频率高达180 MHz的16和32位定时器

使用灵活的90 MHz存储控制器可以轻松扩展存储范围,带有一个32位的并行接口,能支持Compact Flash、SRAM、PSRAM、NOR、 NAND以及SDRAM存储器

由于90MHz Dual quadSPI接口支持内存映射模式,可进行经济实惠的NOR闪存扩展

STM32F446系列产品在小至3.85 x 3.728 mm的封装内提供了256~512KB Flash、128KB SRAM和64~144个引脚。

STM32F446总线矩阵:

STM32F446RE 线路图标:

STM32F446各个型号的说明:

请各位看客参考如下的网址:

http://www.st.com/st-web-ui/active/cn/jp/catalog/mmc/SC1244/SC1169/SS1577/LN1875

STM32F446系列微控制器的一些文章:

意法半导体最新的STM32F446系列微控制器为设计人员带来更多应用选择

http://www.eccn.com/products_2015010514174251.htm

[原创] ST STM32F446高性能 32位MCU开发方案:

http://solution.eccn.com/solution_2015041709240074.htm

6、Nucleo硬件及软件配置:

因为该Nucleo板除板子自身,还需要A转mini-B的USB cable,这个我自己有;开发平台win7 64位系统。

软件配置方面IAR EWARM、Keil MDK-ARM、GCC-based IDE等等。

*Nucleo-F446RE板软件配置:

1、Nucleo使用软件:

Ⅰ、 IAR EWARM

这个软件我相信大家也很熟悉,我没有下载这个软件所以没办法给大家做说明。

Ⅱ、GCC-based IDE

这个软件可能做Linux和嵌入式软件开发用的较多。

Ⅲ、mbed 在线编译器

①、连接mini—usb线后,我们就会看到一个512kb可用的flash memory存储设备:

②、 打开这个512kb可用的盘符:

③、打开HTM的网页:

由于时间的关系,我没有再去深究这个,因为感觉需要花点时间才能适应一下。

但是,如果有兴趣的看客可以参考如下的网址:(ST社区的这个网页讲的还不错)

http://www.stmcu.org/module/forum/thread-597478-1-1.html

Ⅳ、Keil MDK-ARM

这个软件,应该是现在我们国内大多数工程师的使用的主流,所以我想展示下为Nucleo-F446RE板,怎么看其KEIl 开发环境的配置。

a、我安装的是最新的keil for arm的5.16a的版本(https://www.keil.com/demo/eval/arm.htm),为什么我要去安装最新的呢?因为我之前使用的是keil 5.11的版本,这个版本(5.11)中CMSIS的pack和MDK-Middleware不能满足要求,也不支持STM32F446xx的片子。

5.11 pack展示:

b、那么怎么看keil的版本及pack支持哪些Device呢?我们可以浏览(http://www.keil.com/dd2/pack/)这个网址,找到

STMicroelectronics STM32F4 Series Device Support, Drivers and Examples

我们可以看到Version: 2.4.0刚好增加了STM32F446的片子,所以我们STM32F4xx_DPF 的pack的版本至少在2.4或者以上都可,而CMISI的pack的版本至少是4.3或者以上,MDK-Middleware的版本至少是.6.3或者以上,Keil.ARM_Compiler的版本至少是1.0或者以上。

所以,鉴于以上情况,我安装了keil5.16a的版本,其实后来我试了下5.13也可以。

5.16a pack安装成功展示,可以看到符合要求:

5.16a的CMSIS的pack的版本是4.3的,Keil.ARM_Compiler的版本是1.0的,MDK-Middleware的版本是6.5的,STM32F4xx_DPF的版本是2.5的。所以完全满足。

c、那么安装好keil软件后就可以下载库了。

百度经验分享下载stm32固件库的方法如下:

http://jingyan.baidu.com/article/948f59242eb91dd80ef5f972.html

STM32F446xx库下载地址:

http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF262063

至于怎么使用这个stm32cubef4库,我在后面的内容中介绍。

Ⅴ、ST-link驱动(ST-link的固件的安装与firmware的升级):

a、下载st-link的驱动:

ST-LINK/V2 Win7、Vista和WinXP的PC端USB驱动:

http://www.stmcu.org/document/list/index/sort-new/category-523?p=3

firmware的升级:

http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF262063

b、下载st-link的驱动安装成功

Ⅵ、STM32 ST-LINK Utility
STM32 ST-LINK Utility下载地址:
http://www.st.com/web/catalog/tools/FM146/CL1984/SC720/SS1450
ST-LINK Utility与Nucleo-F446RE板连接成功示意图:

以上,我们已经准备好了,硬件和软件的配置,那么我们就开始一个小小的实验
*Nucleo-F446RE板程序实现和烧录、调试:
在这里程序的烧录我想用两种方法:

Ⅰ、MDK + ST-LINK仿真:

因为之前已经在(http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF262063),这个网址下载好了库。

a、在stm32cubef4的压缩包中解压得到stm32cubef4的文件夹,在该文件夹下找到如下的文件夹STM32F446E,在里面找到Project,

打开一个比较简单的GPIO_IOToggle,GPIO电平翻转的程序。

b、打开工程,我们可以看到main函数在while的主要实现了对PA5实现了电平翻转。

  1. int main(void)

  2. {

  3. /* STM32F4xx HAL library initialization:

  4. - Configure the Flash prefetch, instruction and Data caches

  5. - Configure the Systick to generate an interrupt each 1 msec

  6. - Set NVIC Group Priority to 4

  7. - Global MSP (MCU Support Package) initialization

  8. */

  9. HAL_Init();

  10. /* Configure the system clock to 180 MHz */

  11. SystemClock_Config();

  12. /*##-1- Enable GPIOA Clock (to be able to program the configuration registers) */

  13. __HAL_RCC_GPIOA_CLK_ENABLE();

  14. /*##-2- Configure PA05 IO in output push-pull mode to drive external LED ###*/

  15. GPIO_InitStruct.Pin = GPIO_PIN_5;

  16. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  17. GPIO_InitStruct.Pull = GPIO_PULLUP;

  18. GPIO_InitStruct.Speed = GPIO_SPEED_FAST;

  19. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  20. /*##-3- Toggle PA05 IO in an infinite loop #################################*/

  21. while (1)

  22. {

  23. HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

  24. /* Insert a 100ms delay */

  25. HAL_Delay(100);

  26. }

  27. }

复制代码

d、PA5硬件连接示意图:

e、Options for Target 选项设置

f、编译产生HEX文件,并以ST-LINK的方式通过USB calble down load 程序:

g、也可以利用ST-LINK 调试(DEBUG)程序:

Ⅱ、将keil产生的hex通过ST-LINK Utility下载

最后,为了保证程序是正确的,既然这个实验中,我们实现了GPIO的PA5的电平翻转,那么按道理来说我们需要在示波器上看看直观的波形;
但是,示波器在公司,所以就用万用表测试了下。所以电平翻转可以实现。

评:
1、从板子的组成来看:
板子开了个槽,是将调试模块和主要硬件模块(主控、硬件功能模块、IO等)分开了,是将调试模块和主要硬件模块集成在了同一块板子上。但是,我发现没有JLINK调试接口。其实我个人用的JINK仿真器,不知道以后会不会ST工程师会考虑预留JLINK的调试接口;

2、从板子的外观来看:
a、ST的工程师预留了HSE OCS的位置包括其匹配电容。而GPIO_IOToggle程序中也是选用的STM32内部自带的的HSI 16M的晶振。在我觉得这个应该是需要使用者自己来选择外部晶振。

因为一般我们会用8m的外部晶振,可是在超频的情况下,如stm32f407会用248M的晶振,如下是stm32f407的Sys-tick的函数:

  1. /************************************************************************************************************

  2. *Copyright(C).2015-2016,Your Company

  3. *遵循的开源规范

  4. *FileName:sys_tick.c

  5. *Author:

  6. *Version:Ver1.0

  7. *Date:

  8. *Description:

  9. *Others:

  10. *Function List:

  11. *History:

  12. 1.Date:

  13. Atuthor:

  14. Modification:

  15. 2.

  16. *****************************************************************************************************************/

  17. static u8 fac_us = 0; // us延时倍乘数

  18. static u16 fac_ms = 0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数

  19. //systick中断服务函数,使用ucos时用到

  20. void SysTick_Handler(void)

  21. {

  22. }

  23. //启动文件227行

  24. /***************************************************************************************************************

  25. *Function: delay_init()

  26. *Description:初始化延迟函数

  27. 当使用ucos的时候,此函数会初始化ucos的时钟节拍

  28. SYSTICK的时钟固定为AHB时钟的1/8,(stm32英文参考手册6.2 Clock page150)

  29. SYSCLK:系统时钟频率

  30. *Calls:无

  31. *Calls By:无

  32. *Input:u8 SYSCLK

  33. *Output:无

  34. *Return:无

  35. *Others:无

  36. ****************************************************************************************************************/

  37. void delay_init(u8 SYSCLK)

  38. {

  39. SysTick->CTRL = 0 ;//disable systick

  40. //reference M3/M4内核权威指南page315

  41. //分析:根据文档16位,2位,1位,0位都有各自的作用

  42. SysTick->CTRL &= ~(1<<2);//External reference clock (STCLK)

  43. fac_us = SYSCLK / 8 ;//如果外部的时钟是8Mhz的话,那么就是1us的时间,stm32英文参考手册6.2 Clock page150

  44. fac_ms = (u16)fac_us*1000;//每个ms需要的systick时钟数

  45. }

  46. /***************************************************************************************************************

  47. *Function: delay_us()

  48. *Description:用来实现微秒级的延时

  49. 延时nus nus的单位是us

  50. SYSCLK的单位是Hz

  51. *Calls:无

  52. *Calls By:无

  53. *Input:u8 SYSCLK

  54. *Output:无

  55. *Return:无

  56. *Others:nus为要延时的us数

  57. 注意:nus的值,不要大于798915us,(最大值即(2^24=16777216)/fac_us)

  58. 在这个地方需要解释的是由于SysTick是24位的寄存器,那么它最大load的值是2^24=16777216.

  59. 再,fac_us在最大的情况下是SYSCLK/8=168/8=21Mhz.所以根据数学的计算nus<=(2^24)/(SYSCLK/8)=798915us

  60. ****************************************************************************************************************/

  61. void delay_us(u32 nus)

  62. {

  63. u32 temp;

  64. if(nus == 0) return ;//nus=0,直接退出

  65. SysTick->LOAD = nus *fac_us //加载value

  66. SysTick->VAL = 0x00; //清空计数器 Clearing of current value

  67. SysTick->CTRL = 0x01; //SYSTICK timer enable,因为该计数器是个倒计数器

  68. do

  69. {

  70. temp = SysTick->CTRL;

  71. }

  72. //temp&0x01就是在判断able/disable SYSTICK timer

  73. //!(temp&(1<<16))就是在判断是否到达0值

  74. while((temp&0x01)&& !(temp&(1<<16)));//等待时间到达

  75. SysTick->CTRL = 0x00; //disable SYSTICK timer

  76. SysTick->VAL = 0x00 ;//clear the current value to 0

  77. }

  78. /***************************************************************************************************************

  79. *Function: delay_xms()

  80. *Description:用来实现毫秒级的延时

  81. 延时nms

  82. *Calls:无

  83. *Calls By:无

  84. *Input:u8 SYSCLK

  85. *Output:无

  86. *Return:无

  87. *Others:注意nms的范围

  88. 对168M的条件下

  89. SysTick->Load为24位寄存器,所以最大的延时为:nms<=(2^24)/((SYSCLK/8)*1000)=798ms

  90. SYSCLK的单位为Hz,nms的单位为ms

  91. ****************************************************************************************************************/

  92. void delay_xms(u16 nms)

  93. {

  94. u32 temp;

  95. SysTick->LOAD = (u32)nms * fac_ms; //时间加载(SysTick->Load为24bit)

  96. SysTick->VAL = 0x00;//清空计数器

  97. SysTick—>CTRL = 0x01; //SYSTICK timer enable,因为该计数器是个倒计数器

  98. do

  99. {

  100. temp = SysTick->CTRL ;

  101. }

  102. while((temp & 0x01)&& !(temp &(1<<16)));//等待时间到达

  103. SysTick->CTRL = 0x00; //disable SYSTICK timer

  104. SysTick->VAL = 0x00 ;//clear the current value to 0

  105. }

  106. /***************************************************************************************************************

  107. *Function: delay_ms

  108. *Description:超频情况下,实现毫秒级的延时

  109. 延时nms

  110. nms:0~65535,是因为nms是u16的类型,所以

  111. *Calls:无

  112. *Calls By:无

  113. *Input:u8 SYSCLK

  114. *Output:无

  115. *Return:无

  116. *Others:因为在这里是一种特殊情况,是哪种特殊情况呢?是超频的情况。

  117. 在超频SYSCLK=248Mhz的情况下,

  118. 所以delay_xms<=(2^24)/((SYSCLK/8)*1000)=541.

  119. 频率越高 一个周期就越短 延时需要的时钟数就越多.

  120. 这样写是为了避免 延时的时钟数超出其数据类型的表达范围

  121. 所以要考虑最高频率(超频使用)下延时需要的时钟数

  122. ****************************************************************************************************************/

  123. void delay_ms(u16 nms)

  124. {

  125. u8 repeat = nms / 540;//这里用540,是考虑熬某些客户可能超频使用

  126. //比如超频到248M的时候,delay_xms最大只有541左右

  127. u16 remain = nms % 540;

  128. while(repeat)

  129. {

  130. delay_xms(540);//主要是为了防止向这个函数传入的参数超出其范围

  131. repeat--;

  132. }

  133. if(remain) delay_xms(remain);

  134. }

复制代码

b、我在看外部晶振的走线,外部晶振的走线方式是:先经过匹配电容,再连接到晶振。而Nucleo-F446RE这个板子却是:先经过晶振再到匹配电容(图片拍的不清晰,所以没有上传)。 另一方面TI在对msp430的走线上也是有要求。所以,我不知道这个方面ST有没有相关的说明。
如下的TI的附件中有相关的描述:

MSP430晶振布局要领.pdf (78.24 KB, 下载次数: 0)

c、Nucleo-F446RE这个板子,主控用的是64pin的STM32F446RE,而这个板子其实是还有一个重要的方向的用途是物联网。我个人觉得64pin的IO是不是有点少了?
3、mbed 在线编译器
mbed是一个面向ARM Cortex-M系列处理器的原型开发平台,主要用于培育物联网(IoT)的协作项目。尽管我在ST的社区找到了关于mbed一些简单的介绍视频(如下)。如果mbed是针对物联网的项目,那么ST的工程师是否考虑下对这个mbed的更深入一些的介绍呢,这样如果作为使用者的我们也好利用这个工具去实现一些项目,这样会更加方便一些。
ARM® mbed™集成开发环境入门:
http://www.stmcu.org/video/index/detail/id-3968
http://www.stmcu.org/video/index/detail/id-3344
4、软件的使用
其实拿到这个板子,关于MDK的选则方面我还是花了点时间的。其实作为我来说的话,我不太希望把时间花在软件的准备上面(因为5.11的pack不支持STM32F446RE这个片子)。所以ST的工程师是否能考虑在Nucleo类板子的自带的纸版的介绍用大致的说明下软件的要求或者以网页的形式说明并打印在自带的纸版上面。
5、STM32CubeF4的使用
STM32CubeF4里面MDK(以MDK为例),就拿GPIO_IOToggle这个程序来说,其他的程序我还没来得及看。这个程序中什么时钟的配置啊,还有一些条件编译啊都在里面main.c的文件中,我不知道ST工程师是怎么的想法,还是说需要我们用户自己来整理呢。
但是对于我来说,使用起来不太好,不太利于实现结构化的程序。
我习惯将这些时钟配置等等之类的定义在其他文件中,而main.c文件中,就写功能实现的语句就可以。
6、STM32F446xx温度
我们用Cortex-M3的内核也好,用Cortex-M4的stm32f446xx也好,我们最终是拿它来做实际的项目。那么项目的环境有好一些的,还有恶劣的环境,比如说温湿度。我在用户手册中看到了stm32f446可以工作在-40~+105℃的范围内,所以我们在选择的时候可以留意下。

用户手册(即datasheet)

【STM32F446xx】基于ARM Cortex-M4内核的32位微控制器,MCU FPU,225DMIPS,高达512KB.pdf
以上,是我自己对这个板子做的一些action及一些较大胆的感想,希望ST的工程师及各位高工帮忙指正我描述的不对的地方,和需要改进的地方。
总体来说,使用了下Nucleo-F446RE这个板子,feeling还是不错的。

(0)

相关推荐