找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6231|回复: 0
打印 上一主题 下一主题
收起左侧

Nucleo-L031K6评测 硬件和软件实验

[复制链接]
跳转到指定楼层
楼主
昨天收到苏柚的评测通知,想必将要收到的板子应该是NUCLEO-L031K6吧。昨天找到nucleo-L031的官网,下了几个资料。【NUCLEO-L031K6官网页面】个人在意的有几个资料:
1、【硬件手册】 只有看懂硬件连接,才能更好的理解板子的设计和引脚的目的。
2、【Bom表】更简洁的告诉板子中涉及的芯片
3、【STM32L0系列产品列表】这个表告诉你一些事实就是L0X1的产品不带USB等,稍后我再说明。
4、【L31K6芯片主页】请浏览这个主页下载相关手册,比如这个【芯片数据表】
5、【cubeL0主页】对于HAL库编程的用户cubeL0是必须的。【cubeL0下载页】
6、【ST-Link V2下载地址】这个想必大家都有


资料准备好,之后又几个概念需要先Highlight一下:
1、时钟频率最大32MHZ,内核M0+
2、芯片封装是LQFP32,不带USB接口
3、带一个LPUART接口,LPTIM接口
4、PA0口是完全的,从PA0-PA15
5、Flash:32K, RAM:8K ,EPROM:1K
6、SPI、I2C、UART、TIM等
7、自带RTC晶振
8、ST-Link和nucleo64的主芯片毫无差别,还是芯片STM32F103CBT6来一张框图表示一下这个产品的概况:


关于这个产品,我觉得最可惜的是不带主芯片USB接口,这个也是几乎所有nucleo的遗憾。对于nucleo64来说,芯片尽管没有焊接出USB接口,好歹芯片是支持的。另外这些引脚也引出来了。可是对于这个芯片就很遗憾了。因为根本没有呀。那么后期有没有那种可能性来更换测试芯片呐。请看下图:


和下图:

再结合我在上面提供的产品列表,你会发现F0522:都有LQFP32 7*7*1.4封装。估计多数引脚也是兼容的,关于这一点,后期还需要确认一下。
所以应该可以添加USB接口。
但是这仍然不够完美,如果在后期的产品中不是一味的兼容Arduino的引脚,添加一些STM32真正有优势的接口,那样会更好。这是我在nucleo身上一直以来的遗憾。你可能会说,USB有什么大不了的。我告诉你,我本来想用这家伙做个逻辑分析仪和hacker硬件。想一想,把这个设备伪装成一个USB-HID设备,插到电脑上很easy的做一些操作,那又多酷。哎,只能说: What a pity!
但是没事,STM32已经给我们准备好了芯片,其它的就靠我们自己了。

在开始之前,硬件手册需要细细研究一番。但是幸运的是板子小,元件也并不太多。
在电路分许中,我意向的原则是先看电源,再看时钟和烧录接口,最后看外围元件和接口。
这次也不例外,开始了解一下电源吧。我一直认为Nucleo的电源设计堪称典范。我用简略的图示来表示电源的流向。
VIN -->--> E5V -->]       [--->-->+3V3_ST_LINK{ST-Link主芯片U5供电}
                                                ]-->[
                        Vusb-->U5V-->]      [--->----->U5V_ST_LINK--->]
                                                                                                                         ]---> -->VO-->+3V3-->-->VDD-->磁珠->AVDD
                                                                                                             E5V -->]                                                        |
                                                                                                                                                                                 |/[目标芯片U2供电]
因为版面限制没有提到+5V的位置,但是大家一看原理图便知。大致可以从这个引脚对外输出+5V

通常情况下电源的输入位VIN和Vusb(micro-usb端口)。当通过ST-LINK调试时由Vusb提供整个片子的电源。也可以从提供外部提供电压范围较广的电源。大致范围参考LD1117S50TR 可知为。而同样是是5V转3.3V却使用LD39050PU33R和LD3985M33R两块芯片。这各种的缘故需要看芯片手册确定。前者的最大电流是500ma,后者是150ma。像平时我做设计时,一般就选大的。人家这是能省则省,这就是专业精神。当然更有可能是省板子空间吧,哈哈~~~肖特基二极管也使用了两款:STPS2L30A和BAT60JFILM两款芯片。应该也是基于电流、耐压和体积的考量吧。(PS:手册上的电流很奇怪)
另一点是ST-LINK的主芯片引脚PB15上连接的芯片,这次改变了。之前是个mos管,这次是一款名字为ST890CDR的芯片。这是一款官网称作1.2 A current limited high side power switch with thermal shutdown的过热保护电源开关。应该比之前一个简单的mos管要安全一些。

另外板子上用到的所有芯片(我没有一个一个查)应该都是ST生产的,这里要给意法半导体竖起大拇指。

这里先简单的做个大体了解,静等板子到吧。


一、硬件分析
1.1 老生常谈之一触即发话说三月七号,快递小哥送来了期待已久的小板子。
这是逛ST论坛近一年收到的第一块板子,甚是激动。
先上一张为拆装的图,盒子还是经典的nucleo塑料盒子的包装。甚是简介,可是不知这包装能不能讲解。好歹,咱nucleo也该有几十万套发给用户吧。

包装的大小相对于传统的nucleo64没有太大的变化,后来才发现这样做的原因可能是为了展示外包装上的信息吧。
但还好在评测之前已经提前了解了这块板子,详见我的上一篇帖子【写在评测之前】。
这样我就可以理性的评测这块板子。首先是看看板子的大小。
有人说这笔arduino的nano还小,不行的是我手边是一个国产的nano。请看一下大小,不知道官方的大小如何。

但是,老实说nucleo可是提供仿真调试的好吧。nano只有一个ft232虚拟出来的串口,除了能够烧写似乎没什么用处。
从pcb板子的质量上,nucleo的设计制造难度不是一丁点。
在上一张和硬币比大小的图片,你就看出到底nucleo有多小

看见没,比五毛钱小多了。我可没用什么五毛钱的特效。这是货真价实的小。
在盒子的包装上印有mbed或者说arduino nano的接口信息,请看:

我确认是一样的,所以设计者为了兼容简单架构的avr也是蛮拼的。但是这里有一个问题是,为什么非要兼容Arduino的nano呐。
如果你注意瞧,你就会发现D0,D1和D3/4/5...什么的不在一起,而且顺序是反的。想必这也是当年avr为了兼容之前的做出的妥协。咱完全不用这样做。毕竟mbed有笔试Arduino,语法的复杂性和易用性都不在一个档次。
老实说,这些年STM32如果做一个调查就会发现我们使用nucleo板用作mbed的设备比例一定非常少。我们购买或者使用nucleo板子的原因是它便宜,简单易用。就像Discovery的板子,我们使用所谓的蝴蝶接口多吗?
所以说我建议ST不放根据自己芯片和引脚的特色,设定一套自己的板子接口。这样更方便开发者学习和使用。比如nucleo32/64/144的引脚和芯片特点制定三种引脚规则。引脚多的可以兼容引脚少的。使用这样的方式,没准能够更好的让用户掌握STM32独特的接口。怎么使用DMA,怎么使用更复杂的TIM,SDIO,LTDC如何使用。这样开发者会根据接口安排自己的学习路径,会不会更好呐?
上面只是我自己的看法,不知道各位蝴蝶粉没有何看法?
在讲L031K6拿出来的时候遇到点小麻烦,据你所知nucleo64板子比较大,靠两边的卡扣扣着时很容易就能取下。但是nucleo32却不是,需要从板子的后边用力,挤压包装后才能取出。为此我擅做主张给Nucleo发了个红腰带。见下图:
     正面                                            


背面
正面是不是也挺好看,背面很实用一拉板子就出来了。【nucleo的设计师别打我】

然后就是连接上电脑了,出现两个相关的设备枚举。对了这次nucleo的USB口换成了micro-B的接口,之前的mini的。micro-B接口的线缆想必大家都不少吧,因为智能手机在type C之前主要就是这种标准的线。(Type A to micro-B)

另外在磁盘中添加了一个40kb的空间,应该是从f103片子的flash里面划出来的。曾经有人写了一篇如何通过编写一个类似nucleo这样的方式烧写程序的文章,大家可以搜索一下。个人觉得这样的方式挺好的。在details的文件中还可以看到板子或者固件烧写的日期。


1.2 板子的设计
下面再来说说板子的设计,老实说我最赞叹的是布线师的技术。自己平时线一多就选择自动布线,然后取消布线根据布线的情况调整原件位置。接着再自动布线,如此反复之后。再手动布置一些主要的线,确认设定的规则之后再自动布线,后期对一些过孔和比较奇特的布线手动做一些调整。总感觉这样的方法很不专业。不知道nucleo的设计师是如何搞得。起初我还以为他们会用六层板什么的,后来才发现他们用的是四层板。在官方的PCB图纸上给出了明确的解释,请看。

如果你看原理图还会发现在电源层还根据电源的不同做出了一些分割。我觉得那些想学习绘制板子的,可以从这张图开始。
图纸给的是用Altium Designer绘制的,这也是许多朋友最初学习绘制板子时用的软件。PCB板子或者说PCB工程做的非常专业,必须多大学老师用的正规的多。这套图的原理图分成了三张,第一张是总图用于将两块原理图连接成一张大的原理图。同时也让接口关系更加明显。
电源的设计也很专业,朋友们注意一下官方对于电源的划分和规则,在上一篇文章中我做了梳理,希望能帮到你。
另外BOM表原件也很全,官方实际上提供给大家一个设计参考的示例。
这里提供官方资料的下载,为了下到最新的资料,其实建议大家到官方搜索下载,这样可以download一些自己需要的。
nucleo-32pins_bom.zip (33.55 KB, 下载次数: 13) nucleo-32pins_sch.zip (2.92 MB, 下载次数: 13)

1.3 芯片架构的变化(相对于自己熟悉的F401)
STM32L031K6是Cotex-M0+的架构,而F401是Cotex-M4F架构。两者有区别是正常的。但是抛开内核不说外围的变化还是很显著的。下面提供两两张来自官方文档上的架构图,你会看出一些明显的区别。在下面给给出自己看到的区别,朋友们还可以给点指点,让我们找出一些其它的变化。
F401框图

F103框图



L031框图


仔细观察三幅框图会发现GPIOA/B...等几个接口在三种架构上的位置不同。
F401在AHB1总线上,F103在APB2上,L031在内核上直接相连。这三种连接方式有何区别,请高手给一个解释。
我猜测直接将L系列单独将GPIO摘出来是低功耗的考虑。我私下里看了一下L476和L162的框图,发现这两者的GPIO端口都很独特。请高手给指教一下架构设计的要点和作用。

1.3 ADC变化说明在后面的实验中我会用到ADC来做两个实验,所以先要了解一下ADC的架构。忽然发现这里ADC的架构还是有些变化的。
[1> 双时钟架构]
在L031中ADC可以配置两个时钟,一个来自PCLK,被称作同步模式,另一个时钟源来自HSI,称为异步模式。两者的时钟源都可以分频,见下图方便理解。

这两个时钟源的作用在参考手册中有介绍,大致的意思是:
1> 同步模式下ADC模块的时钟是有APB驱动的,在定时器timer触发时可以保证时钟的同步。
2> 异步模式下,不能保证于触发源时钟的同步,但是可以获得更高的时钟频率。

1.4 低功耗部分
在外围接口中有两个比较明显的低功耗接口,那就是LPUART和LPTIM接口。此外M0+的多种工作模式也保证了低功耗。
这里列举一下L031为了保证低功耗采取的策略。
1、采用动态的电压定标策略:
                                    1> VDD在 [1.71-3.6V] 范围,CPU运行频率高达32MHZ
                                    2> VDD在 [full range] 范围,高达16MHZ频率
                                    3> VDD在 [full range] 范围,高达4.2MHZ频率
2、支持七种低功耗模式:
                                    1> sleep mode :CPU停止,外围可以继续工作,也可以唤醒CPU。
                                    2> Low-Power run mode:
                                    3> Low-Power sleep mode:
                                    4> Stop mode with RTC
                                    5> Stop mode without RTC
                                    6> Standby mode with RTC: standby mode是功耗最低的模式
                                    7> Standby mode without RTC
这几种模式的介绍可以看STML031手册的第16页。

再来谈一谈LPUART和LPTIM吧。首先看上面的框图可以了解,两者都挂在APB1上。在这个时钟源下还挂有RTC和IWDG。
LPUART可以在stop模式下唤醒CPU,在32.768khz时仍然能够提供高达9600的波特率,这种模式在低功耗通讯时尤其重要。
LPTIM也可以在stop模式下唤醒设备。
其余的不同需要再细细研究一下。
因为本篇篇幅太长,后面还有一篇评测从软件和实验上做一些评测。


二、软件实验
2.1 ADC读取实验
[1   ADC介绍]
[1.1> 读取的三种模式]
ADC读取的方式有三种:一种是所谓的连续模式,另一种是不连续模式,还有一种是单次模式。只看上面的名字似乎并不能搞清楚每种都是什么意思。假定我们要使用CH0,3,7这三个通道读取ADC的数据。在采集过程中采集方向不发生改变,假定是升序采集。我通过软件触发或者硬件触发来启动ADC转换,在下面我直接称这个过程叫做“触发采集”。
连续模式的意思是,在触发采集一次之后,ADC模块自动按照0-3-7-0-3-7的顺序循环采集者三个通道的数据。在每个通道采集完触发EOC事件,每一遍完成之后触发EOSEQ事件。
单次模式是,触发采集一次之后,ADC模块自动按照0-3-7的顺序采集三个通道的数据。采集完成之后停止运行,直到才一次触发采集来引起对ADC的采集。相对于上面的区别是,新的一轮采集需要新的触发采集事件。
不连续模式下,每次触发采集动作执行一个通道的触发。
因此你可以看出ADC的每个通道事实上不能单独操作的。如果你这段时间使用通道0和1,下一段时间只是用通道2和3.那么你最好是在发生改变的时候重新配置ADC。在这种情况下cubemx就无能为力了,你只能先按照前者配置,在程序中在编写这部分改变的代码。
对了每次的EOC和EOSEQ都需要软件来复位,否则不能执行下一次采集。详情见参考手册RM0377中ADC部分.
[1.2> 数据处理的模式]
每一次转换的结果都存储在ADC_DR这个16位寄存器里面,因为ADC的分辨率和对齐方向可以配置,所以具体的数据含义可以参考自己的设置。
下图很形象的给出数据的排列含义:

因为所有通道的数据采集是按照顺序执行的,而且数据采集的结果如果不读取可能会被overwrite或者触发overrun信号。如果及时的从ADC_DR中读出数据并放到正确的位置是很重要的。采用DMA是一种方法,当然另一种是不采用DMA。在转换速度很慢切没有其他任务需要紧急执行时可以不适用DMA,而是用软件轮训的方式来检测EOC,不过这种方式还是有潜在的overrun的危险。还有一种不用DMA的方式是将OVERMOD设置成1,然后每次读取ADC_DR里面的数据时只获取最新的数据,数据的通道可能是转换序列中的任何一个,这种方式在一些特殊场景中有用。最好用的方式当然是使用DMA了。但是采用DMA的方法技术也稍微复杂,可使用one-shot和circular模式。前者每完成DMA transfer之后就停止ADC的扫描序列等动作,后者则更适合完成一系列的ADC转换。
[1.3> 时钟的配置]
在上个帖子中简单介绍了一下ADC时钟来源的问题。除了哪里介绍的同步和异步模式外,还需要注意的是:对于STM32L0 ADC模块的最高时钟频率是16MHZ,因此在配置时钟时无论同步异步在分频后的频率一定不能超过这个频率。那异步模式来说,频率是由HSI提供的而L031K6的HSI频率是16MHZ。这个数据时刚好的。当然你还可以2/4/8分频,至于同步模式就一定要注意分频的数目。
  1.     /* Blocking mode: Polling */
  2.     HAL_StatusTypeDef    HAL_ADC_Start(ADC_HandleTypeDef* hadc);
  3.     HAL_StatusTypeDef    HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
  4.     HAL_StatusTypeDef    HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);                 
  5.     HAL_StatusTypeDef    HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);
  6.                         
  7.     /* Non-blocking mode: Interruption */
  8.     HAL_StatusTypeDef    HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
  9.     HAL_StatusTypeDef    HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
  10.                         
  11.     /* Non-blocking mode: DMA */
  12.     HAL_StatusTypeDef    HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
  13.     HAL_StatusTypeDef    HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
复制代码
上面是stm32Ll0xx_hal_adc.h中的一部分代码。上面介绍了三种读取方式。一种是堵塞式的,另外两种是非堵塞式的。堵塞式的顾名思义是ADC读取完之后返回读取的数据。非堵塞式的就是发送读取命令之后,等待读取完成将数据返回给你。非堵塞式的也分为两类。一种是中断式的,另一种是DMA方式。这就涉及到处理完成之后如何得到数据。

[2   实验介绍]
我比较喜欢使用HAL变成,因为ST的新硬件都是以HAL作为主要的驱动平台。ADC的使用除了按照我上面的介绍来设置外,还需要对API做一些简单的了解。稍后可以看我在cube里面的配置,但是程序对其配置有些修改。在实验时遇到了一些问题。在下面的介绍中做了详细介绍。
首先,我在PA1、PA3上接上摇杆的XY轴电位器,另外打开了温度采集通道。当然其它硬件连接也就绪了。通过UART2输出信息,但是因为SB3没有接上0欧姆电阻所以通过STlink的USB并不能输出直接输出信息。所以如果需要开通ST-Link的VCP通道需要焊接SB3上的电阻。具体可以看原理图。
下面是连接的硬件,硬件原理图可以看下一个实验的文档,因为硬件连接差别不大。
实验内容就是通过串口将ADC的数据输出,ADC采样通过DMA循环采样,但是UART输出和LD3闪动同步,大约200毫秒输出一次。下面是实验场景图



这里说明一下实验过程中遇到的几个问题。第一个问题是温度的ADC数据采集之后如何处理成温度。第二个是DMA的数据如何接受,还有就是实验结束的标志是什么。本实验没有用到,按道理应该是我需要的数据转换结束后,通过中断来调用ADC显示任务。第三个问题是ADC影响HAL_Delay()。第四个是ADC的串扰问题。前两个问题不涉及具体实验现象问题,可以通过搜索RM文档找相关关键字找到解决办法。这里具体讲后两个问题。
第三个问题起初的原因是这样的我的配置打开了ADC的continuous模式,就是说我的ADC是采集完一轮之后再去转换。DMA的优先级我设置的比systick中断高.ADC的一直运行,ADC转换的结果一直调用DMA处理新数据。所以Systick一直来不及处理Systick的中断处理函数。所以最终的现象是我的LED一直处于亮起的状态,而不闪动。在检查代码是我发现程序一直回调Delay的函数。解决办法就是我在闪动一次LED时采集一次,然后显示。当然这样做只是为了测试ADC,后期我上RTOS的时候再设计一种更好的调用方式。
第三个问题是第二路ADC对温度采集有串扰。具体表现是第一路摇杆左右移动时,不影响第二路输出,本身正常。但是第二路在前后移动时,影响温度传感器的输出值,而且变化很大。我之前在用Arduino时遇到过这种问题,但是没有遇到过只是其中一路对下一路影响的。但是还是决定是串扰问题,我自己也尝试修改采样时间,但改动不大,温度的输出值变化还是有。直到我找到官方的一篇文章介绍之后,才发现自己的设置还是太小。
我将文档上传,请看: 扫描模式下 ADC 发生通道间串扰.pdf (148.99 KB, 下载次数: 5)
除了修改采样时间还可以修改时钟,我最早是DIV1的现在改成DIV8,采样时间不用太大也可以。具体看代码。
然后我怀疑STM32内部的温度传感器内阻太大,而我外部的摇杆采样内阻很小,所以就产生了这种现象。

对了这是代码: ADC_DMA_T1.7z (1.03 MB, 下载次数: 8)

2.2 freeRTOS实验
[1    freeRTOS实验]
[1.1> 实验描述]下面是用CAD绘制的硬件连接图,分图层。为了方便没有CAD的朋友,我转成了PDF格式,用adobe reader可以关闭和打开图层。
先上两张样图,然后附上PDF和CAD 的附件。这两张样图分别提供了mbed接口和引脚连接信号图。在提供的PDF和CAD中都有图层的概念,你可以通过选择开关图层。
      
PDF文件
L032KG-Model.pdf (116.81 KB, 下载次数: 5)
CAD文件,2013版本的。因为格式问题,故封装成压缩包格式。
L032KG.rar (43.11 KB, 下载次数: 5)


[1.2> 线程及通讯描述]
这个上系统的变成重点是安排线程中断和各种数据结构,思想是重要的。平台有时候没有那么具有特定性,毕竟当前的RTOS系统说到底性能也许有差别,但是通常支持的技术是一致的。对于编程者来讲,思想是更重要的。所以我们才会看到ARM设法用CMSIS-RTOS来统一化各个操作系统的接口。从长期来看,我是看好这种变化的,但是目前选定一种RTOS是很有必要的,毕竟工作有时是需要熟练应用所学的技术的。好了废话不多说,看看我的线程调度和安排吧。
-

[2    RTX实验对比] (保留篇幅,之后再添加)

[3    freeRTOS不用CMSIS-RTOS会不会更合理] (保留篇幅,之后再添加)

2.2 低功耗模式实验(保留篇幅,之后再添加)


其实这篇几天前就也开始写了,但是因为白天要去面试,所以断断续续。中途还去ST深圳参加了蓝牙的培训。和一起培训的小伙伴聊天。他说之前的培训都是ST自己办的,干货较多没有板子送。可是这次是聚码的小哥讲的,送了块板子,干货很少,因为他不愿意讲怎么用st的blueNRG,只是简单讲了自己的API怎么用。
不过感谢ST了,学习还要靠自己

评分

参与人数 1黑币 +5 收起 理由
luy3728000 + 5 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表