一板网电子技术论坛

天南地北客
发表于: 2017-11-26 20:37:10 | 显示全部楼层

意法半导体的STM32L053探索板采用STM32L0超低功耗系列微控制器STM32L053C8 MCU。除此之外,该开发板还包含一个可由MCU读取的电流检测模块,可以监测其自身的电流消耗。不幸的是,由于缺乏关于此功能的文档,所以其很难用于评估的目的。但是,通过ST的示例代码,与模块通信的基本过程已经建立,并可用于开发更简化的示例应用程序。结合STM32L0系列页面低功耗模式的信息,该应用程序允许用户观察STM32L053C8每个低功耗模式如何影响MCU的电流消耗。


背景信息

ST提供三种类型的开发板:Nucleo开发板、Discovery探索板和评估板。 Nucleo开发板最简单,并且最便宜。除了和其他开发板一样内置一个ST-LINK  V2调试器/编程器之外,它们只不过是引出了具体MCU的I / O线,以及提供了一些按钮和指示灯。相反,评估板的成本要高得多,因为它们具有评估板所采用MCU的所有功能所需的全部硬件。探索板是一个这种方式。他们只使用必要的组件来演示特定的器件特性。参考STM32L053探索板关键特性(图1):

•    采用STM32L053C8T6微控制器,具有64 KB闪存,8 KB RAM,采用LQFP48封装。

•    板载ST-LINK / V2-1,带有选择模式开关,可将该套件作为独立的ST-LINK / V2-2(带有用于编程和调试的SWD连接器)

•    支持mbed(mbed.org

•    USB ST-LINK具有重枚举功能和三个不同的接口:

      •    虚拟COM端口

      •    大容量存储器

      •    调试端口

•    电路板电源:通过USB总线或从外部5V电源电压

•    外部应用程序电源:3 V和5 V

•    一个线性触摸传感器或四个触摸键

•    IDD电流测量

•    2.04寸电子纸显示器,172X72像素

•    四个LED:

      •    用于USB通信的LD1(红/绿)

      •    LD2(红色)用于3.3 V电源上电

      •    两个用户LED:LD3(绿色),LD4(红色)

•    两个按钮(用户和复位)

•    用于LQFP48 I / O的扩展接头,用于快速连接原型电路板并轻松测试

•    完全免费的软件,包括STM32CubeL0软件包部分中的各种实例


这款探索板与Nucleo开发板的主要区别在于线性触摸传感器、IDD电流测量和电子纸显示屏。考虑到具体的MCU,即STM32L053C8,是一款具有触摸感测功能的超低功耗微控制器,这变得有意义。在下面的章节中,我们将进一步探讨IDD测量模块,以便有效地评估STM32L0系列MCU的低功耗特性。

The STM32L053 Discovery board.jpg

图1:STM32L053探索板

在STM32L053探索板上开发应用程序时,以下文档非常有用:

•    STM32L053探索板用户手册

•    STM32L053xx数据手册

•    STM32L0x3参考手册


测量电流消耗

STM32L053数据手册的第6.1.8节显示,测量MCU的电流功耗的首选方法是高端采样方案(图2)。也就是说,电流采样装置位于电源和负载(MCU)之间。 STM32L053探索板使用这种方法来实现其电流的测量功能。简而言之,该功能允许用户使用自己的电流测量仪器或使用板载电流测量模块来测量STM32L053C8所消耗的电流。

Current consumption measurement scheme .png

图2:STM32L053数据表建议的电流消耗测量方案

Discovery探索板上的跳线JP4可以启用或禁用IDD测量功能。图3是JP4如何指示电流的高级表示。如果跳线放置在引脚1和2(OFF位置)上,则VCC直接连接到MCU,并且不能测量电流。如果跳线放置在引脚2和3(ON位置)上,则电流将从VCC流过IDD测量模块,然后流向MCU。在此配置中,MCU可以与模块通信并请求瞬时电流消耗。

为了使用外部设备(如电流表)测量电流,跳线应完全移除。然后,仪器的引线应放置在引脚1和2,以实现电路,并仍符合高端采样方案。

High-level representation.png

图3:JP4连接的高级表示


IDD测量模块

一旦JP4处于ON位置,用户需要知道如何读取当前的测量值。 Discovery电路板的数据表不提供有关该主题的信息(除了提及的测量范围是50 mA到100 nA)。通过研究电路板的原理图和演示代码推导出一个简单的操作程序。该模块可以明显分为两部分:电流检测电阻网络和多功能扩展器(MFX)。电阻产生一个与电流流量成比例的电压信号,在被MFX读取之前被放大。 MFX不仅将该电压转换成电流测量值,并将其报告给MCU,而且还用作电阻网络的控制器,将总并联电阻配置为MCU最大消耗电流的最佳值。


电流检测电阻

图4显示了测量MCU消耗电流的电路。该电路中有四个电流检测电阻(1Ω、24Ω、620Ω和10kΩ),已经被紫色框突出显示。其中三个电阻与MOSFET的栅极连接到MFX上的GPIO引脚串联。这样,MFX可以通过打开这些MOSFET的各种组合来改变总分流电阻。这对于确保分流电阻两端的放大电压不超过3.3 V是必要的,而电流的微小变化仍会产生显着的电压变化。请注意,有一个第四个MOSFET连接到用于校准目的的MFX。


图4中显示的四个运算放大器用于放大分流电阻上的电压降。两个带标签的U7B和U7D仅用作电压跟随器,以隔离电流检测电阻和差分放大器。 U7C用于实现所述放大器以及被选择为提供49.9的增益的电阻器。最后,U7A是另一个电压跟随器,用于为差分放大器提供0.14814 V的偏置电压。这改变了输出电压方程,如下:

equation.png

偏移量可能是为了纠正MOSFETS上的电压降。

Circuit diagram.png

图4:电流测量电路的电路图

跳转到指定楼层
天南地北客
发表于: 2017-11-26 22:09:54 | 显示全部楼层

多功能eXpander

MFX只是一个装载固件的STM32L152芯片,允许它充当触摸屏驱动器,I / O扩展器和IDD控制器。为了从主MCU(STM32L053C8)中提取上述电流测量电路,只有最后一个功能被利用在STM32L053探索板上。使用I2C总线,MCU可以通过配置mfxstm32l152.h文件中定义的寄存器来控制MFX(地址0x84)。该文件是STM32CubeL0包的一部分,可以通过导航到en.stm32cubel0 / STM32Cube_FW_L0_V1.6.0 / Drivers / BSP / Components / mfxstm32l152找到。本节末尾提供的名为“MFXSTM32L152_registers.xlsx”的Excel文档是MFX公共寄存器和IDD控制寄存器的寄存器映射。

图5显示了MFX原理图。注意图5和图4之间共享的网络标签,它揭示了MFX如何与电阻网络连接。然而,更重要的是,这些标签是用黄色填充的六边形包围的。这些是用于与发现板上的其他芯片接口的双向端口。具体来说,MFX_I2C_SDA、MFX_I2C_SCL、MFX_IRQ_OUT和MFX_WAKEUP端口实现MFX和MCU之间的通信。这些端口分别连接到STM32L053C8的引脚PB9、PB8、PC13和PA1。

MFX wiring diagram.png

图5:MFX接线图(摘自Discovery板用户手册第37页)


由于没有关于MFX的官方文档可用,因此必须研究STM32L053 Discovery演示板的演示应用程序,以确定正确的初始化过程。此演示应用程序也在STM32CubeL0文件夹中找到,用于当前测量的特定文件可在en.stm32cubel0 / STM32Cube_FW_L0_V1.6.0 / Projects / STM32L053C8-Discovery /演示/模块/ idd测量目录中找到。从这些文件中,清单1中的示例函数是为了演示如何初始化MFX来正确控制分流电阻并向MCU发送中断信号。基本程序概述如下:

1.    在MFX上执行软件重置以将其置于已知状态。在此操作之后立即放置100 ms的延迟,以使MFX寄存器的时间被清除。

2.    IRQ_OUT信号被配置为通知MCU发生了MFX事件。首先,将MFX芯片上的物理引脚配置为推挽式,高电平有效(即事件发生时,MFX_IRQ_OUT引脚状态将由低电平变为高电平)。然后,选择触发IRQ_OUT信号的事件。在这个例子中,选择“IDD”和“ERROR”事件,即,当IDD测量准备就绪或者当MFX内发生任何错误时,IRQ_OUT引脚将被设置。请注意,在Idd_Init()函数开始时,MCU上的引脚PC13配置为在上升沿触发中断。

3.    在MFX上启用IDD测量功能

4.     当前的测量参数被分配给MFX。这些包括电流检测电阻的值和差分放大器的增益。还指定了在发生复位之前可能应用于MFX的最小电压(VDD)。由于包含这些值的寄存器依次位于内存(地址0x82至0x8F)中,因此示例函数将使用要写入的值填充数组,然后将所有14个值一次写入内存块。


清单1:为IDD测量初始化MFX的示例

  1. void Idd_Init( void )
  2. {
  3.     uint8_t params[14];
  4.      
  5.     /* Initialize GPIOs */
  6.     // PC13: recieve MFX_IRQ_OUT signal
  7.     RCC->IOPENR |= RCC_IOPENR_GPIOCEN; // enable clocks
  8.     RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; // ENABLE SYSTEM CONFIGURATION CONTROLLER CLOCK
  9.     GPIOC->MODER &= ~( GPIO_MODER_MODE13 ); // Input mode
  10.     // Configure external interrupt on MFX_IRQ_OUT (PC13)
  11.     SYSCFG->EXTICR[3] |= SYSCFG_EXTICR4_EXTI13_PC; // PC13 is source for EXTI
  12.     EXTI->IMR |= EXTI_IMR_IM13; // interrupt request from line 13 masked
  13.     EXTI->RTSR |= EXTI_RTSR_TR13; // rising trigger enabled for input line 13
  14.      
  15.     // NOTE: I2C pins are configured in I2C_init function
  16.     /* Initialize MFX */
  17.     // reset MFX ( SYS_CTRL = SWRST )
  18.     params[0] = 0x80;
  19.     I2C_Write_Reg( I2C1, 0x84, 0x40, params, 1 );
  20.     delay_ms( 100 );  // Give the registers time to be reset
  21.     // IRQ pin -> push-pull, active high
  22.     // ( IRQ_OUT = OUT_PIN_TYPE_PUSHPULL | OUT_PIN_POLARITY_HIGH )
  23.     params[0] = 0x03;
  24.     I2C_Write_Reg( I2C1, 0x84, 0x41, params, 1 );
  25.     delay_ms( 1 );
  26.     // IRQ source -> error and IDD ( IRQ_SRC_EN = IRQ_ERROR | IRQ_IDD )
  27.     params[0] = 0x06;
  28.     I2C_Write_Reg( I2C1, 0x84, 0x42, params, 1 );
  29.     // Enable IDD function ( SYS_CTRL = IDD_EN )
  30.     params[0] = 0x04;
  31.     I2C_Write_Reg( I2C1, 0x84, 0x40, params, 1 );
  32.     // Assign shunt values, gain value, and min VDD value
  33.     params[0] = 0x03; params[1] = 0xE8;        // SH0 = 1000 mohm
  34.     params[2] = 0x00; params[3] = 0x18;        // SH1 = 24 ohm
  35.     params[4] = 0x02; params[5] = 0x6C;     // SH2 = 620 ohm
  36.     params[6] = 0x00; params[7] = 0x00;        // SH3 = not included
  37.     params[8] = 0x27; params[9] = 0x10;     // SH4 = 10,000 ohm
  38.     params[10] = 0x13; params[11] = 0x7E; // Gain = 49.9 (4990)
  39.     params[12] = 0x0B; params[13] = 0xB8;    // VDD_MIN = 3000 mV
  40.     I2C_Write_Reg( I2C1, 0x84, 0x82, params, 14 );
  41.     /* enable interrupts for external interrupt lines 4 - 15 */
  42.     EXTI->PR |= EXTI_PR_PR13; // clear pending interrupt (if it is pending)
  43.     NVIC_EnableIRQ( EXTI4_15_IRQn );
  44.     NVIC_SetPriority( EXTI4_15_IRQn, IDD_INT_PRIO );
  45. }
复制代码

一旦MFX被初始化,可以要求IDD测量。清单2是如何做到这一点的一个例子。 第一步是指定预延迟(如果需要)。 这是在测量之前所经过的时间量。 设置IDD_PRE_DELAY寄存器中的最高有效位将导致预延迟值以20毫秒为单位进行解释,而将其清除则将单位更改为5毫秒。 然后,通过设置IDD_CTRL寄存器中的IDD_CTRL_REQ位和IDD_CTRL_SHUNT_NB位来请求测量(请参阅Excel文档)。 由于Discovery板上有四个分流电阻,0x04被写入IDD_CTRL_SHUNT_NB字段。

清单2:从MFX请求IDD测量的示例

  1. void Idd_req_meas( uint8_t predelay )
  2. {
  3.     uint8_t param;
  4.      
  5.     predelay |= 0x80; // IDD_PRE_DELAY |= IDD_PREDELAY_20_MS
  6.     I2C_Write_Reg( I2C1, 0x84, 0x81, &predelay, 1 ); //add predelay before Idd measurement
  7.     param = 0x09; // IDD_CTRL = ( ( 4 << 1 ) & IDD_CTRL_SHUNT_NB ) | IDD_CTRL_REQ
  8.     I2C_Write_Reg( I2C1, 0x84, 0x80, ¶m, 1 ); // request Idd measurement
  9. }
复制代码

一旦测量准备就绪,就可以从三个IDD_VALUE寄存器中读取数据,如清单3所示。但是,应首先读取IRQ_PENDING寄存器,以查看是否设置了IRQ_ERROR位。 如果是,尝试读取IDD测量值时,MFX可能不响应。 如果没有错误,可以从内存地址0x14(IDD_VALUE_MSB)到0x16(IDD_VALUE_LSB)读取IDD值。 然后,必须通过设置IRQ_ACK寄存器中的IRQ_IDD位将确认发送到MFX,以便让MFX知道中断已被接收和处理。 请注意,一旦IDD值的所有三个字节合并,结果将以10nA为单位。 为了将该值转换为nA,只需乘以10即可。

清单3:从MFX读取IDD测量的示例

  1. int Idd_get_meas( void )
  2. {
  3.     uint8_t temp[3];
  4.     uint8_t ack;
  5.      
  6.     // check for errors
  7.     I2C_Read_Reg( I2C1, 0x84, 0x08, temp, 1 );
  8.     if ( temp[0] & 0x04 ) // if ( REG_IRQ_PENGDING & IRQ_ERROR )
  9.     {
  10.         Idd_Init();
  11.         CURR_MEAS_POS();  // move cursor to current measurement position
  12.         USART_puts( USART1, "MFX ERROR" );
  13.         return -1;
  14.     }
  15.      
  16.     I2C_Read_Reg( I2C1, 0x84, 0x14, temp, 3 ); // read current measurement
  17.     ack = 0x02;
  18.     I2C_Write_Reg( I2C1, 0x84, 0x44, &ack, 1 ); // acknowledge Idd from MFX
  19.     return (temp[0]<<16) + (temp[1]<<8) + temp[2];
  20. }
复制代码

寄存器映射

如上所述,下面包含了一个Excel电子表格,用于记录与本次讨论相关的寄存器。 编译mfxstm32l152.h文件中的定义以便填写address和bit列。 同样,在comments和permissions列中放了很多有用的备注。 reset value列是通过运行一个在软件复位后立即读取每个寄存器的测试来确定的。 有很多空白单元格,因为一些寄存器没有被很好的注释(或根本没有),有些位域没有被定义。 尽管如此,这个电子表格还是一个有用的参考资料,可以帮助您了解上述示例函数中看似随机的十六进制数字实际表示的内容。

MFXSTM32L152_registers: MFXSTM32L152_registers.xlsx (16.21 KB, 下载次数: 0)

回复

使用道具 举报

天南地北客
发表于: 2017-11-27 10:54:10 | 显示全部楼层

示例应用程序

STM32L053 Discovery探索板中预装了演示程序,用户可以通过触摸传感器在四种操作模式之间进行选择,并且在电子纸显示屏上将显示所消耗的电流。这些模式包括:运行模式(Run)、睡眠模式(Sleep)、低功耗睡眠模式(Low-power Sleep)和停止模式(Stop)。为了进一步展示STM32L053器件的低功耗特性,同时避免ST硬件抽象库的混乱,重新编写了一个新的应用程序,它使用较少的外设和电路板功能。这个新的示例应用程序包含演示应用程序中没有的两种低功耗模式(低功耗运行模式(Low-power Run)和待机模式(Standby)),并以大约每秒一次的速率进行连续测量。


终端仿真器为应用程序提供用户界面。图6是输出的屏幕快照。电流测量显示在窗口顶部,操作模式列在窗口底部。箭头指向当前模式,选择不同模式的说明显示在最下面。任何终端仿真器程序(例如PuTTY、Tera Term、CoolTerm等)都应该能正常工作,只要波特率设置为4800并且在每个换行符(LF)中都有一个隐含的回车符(CR)。如果STM32L053探索板背后的标签标记为“MB1143 B-01”或更高版本,则需要连接焊接桥SB2和SB3,使得USART可以与虚拟COM端口连接(探索板用户手册的第4.14节)。

User interface for example current measurement application.png

图6:电流测量示例应用的用户界面


该应用程序的核心是一个有限状态机(FSM),每个状态对应六种操作模式中的一个。这些状态的进入动作是配置系统时钟、电源控制寄存器和M0 +内核寄存器,使得器件进入所需操作模式的函数。这些函数分别命名为enter_ <Mode>(),其中<Mode>由可以是下面中的一个:Run、LPRun、Sleep、LPSleep、Stop或Standby。有关这些功函数及其相应低功耗模式的更多信息,请参见STM32L0系列的低功耗模式页面。


除了FSM,还有一个处理当前测量功能的后台线程。每当MFX置位IRQ_OUT线时,表示当前的测量已经准备好(MCU上的PC13用于触发外部中断),它就会执行。该线程使用上一节中讨论的过程来获取当前的测量结果、显示结果以及请求一次新的测量。为了验证由IDD测量模块检测的电流测量的正确性,使用数字万用表进行比较。使用两种方法,每种模式进行了三次测量,并在表1中报告平均值。为了使用万用表进行稳定的测量,MFX未被初始化。这可以阻止后台线程运行,并使得MCU每秒暂时进入运行模式。结果显示,IDD模块并不是测量运行模式、睡眠模式和低功耗睡眠模式最准确的方法,但考虑到电路的简单性,结果仍然很接近。

表1:各种工作模式下MCU消耗电流的测量结果比较

模式
IDD模块
万用表读数
Run
3.399 mA
3.451 mA
LPRun
44.052 µA
44.063 µA
Sleep
1.331 mA
1.474 mA
LPSleep
14.179 µA
15.233 µA
Stop
451 nA
443 nA
Standby
297 nA
288 nA

完整的示例代码

因为这是一个相对简单的应用程序,而且没有使用ST的硬件抽象库HAL,所有的代码都放在main.c文件中(在下面提供)。使用Keil的μVision5 IDE编写,它非常合理地进行注释和组织。对于那些刚接触Keil开发工具的新手,从头开始创建这个应用程序的过程如下。

1.   打开μVision5,然后转到Project > Manage > Pack Installer...

2.   在左侧窗口中选择器件(STMicroelectronics > STM32L0 Series > STM32L053 > STM32L053C8 > STM32L053C8Tx)

3.   在右侧窗口中,单击“Keil :: STM32L0xx_DFP”和“ARM :: CMSIS”旁边的Install按钮

4.   关闭Pack Installer窗口并转到Project> NewμVisionProject ...

5.   导航到将包含项目的文件夹,输入项目的名称(例如STM32L035-DISCO_current_meas),然后单击“Save”

6.   选择器件(在左下角的框中,导航到STMicroelectronics> STM32L0 Series > STM32L053> STM32L053C8> STM32L053C8Tx),然后单击OK

7.   展开“CMSIS”软件组件并选中“Core”对话框

8.   展开“设备”软件组件并从“启动”中勾选对话框,然后单击确定

9.   在项目菜单中,展开“目标1”,右键单击“源组1”,并选择添加现有文件到组“源组1”...

10.  浏览到main.c存储的位置,选择它,单击“添加”,然后单击“关闭”

11.  转到Project> Target for Target'Target 1'...(注意:您可能必须打开和关闭Group'Source Group 1'的选项...才能显示此选项)

12.  在调试选项卡下,从右上角的下拉菜单中选择ST-Link调试器

13.  在该下拉菜单旁边,单击设置,转到Flash下载选项卡,单击编程算法(STM32L0 64KB Flash)的唯一选项,然后单击确定

14.  再次单击确定,然后转到项目>构建目标

15.  最后,进入Flash>下载(一旦下载完成,可能不得不按下重置按钮来使用应用程序)


如果一切顺利,电路板应该被编程并准备好使用。只需打开终端仿真器,将波特率设置为4800,然后打开正确的COM端口。请注意,某些终端仿真程序在收到换行时不会自动打印回车,因此如有必要,必须更改设置。

示例代码: main.c (42.85 KB, 下载次数: 0)

回复

使用道具 举报

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

本版积分规则

主题 42 | 回复: 68

小黑屋|手机版|

GMT+8, 2018-1-19 02:07 , Processed in 0.086009 second(s), 9 queries , Gzip On, File On. Powered by Discuz! X3.4

YiBoard一板网 © 2001-2013 Comsenz Inc. ( 京ICP备16014155号 )

QQ

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