9196|6

4177

帖子

9

TA的资源

五彩晶圆(高级)

楼主
 

【Nucleo-L432】STM32L432KC 测评 [复制链接]

本帖最后由 huaiqiao 于 2016-7-31 20:45 编辑

       又一次的拿到ST的评估板了。不太喜欢每次的测评都写的千篇一律,那样没什么意思。我觉得写东西也好,生活也好。太过于重复的东西往往让人会变得麻木。拿到Nucleo-L432KC,就该想想改从什么地方入手,说实话,我觉得仅仅靠一篇或者几篇帖子难以对一个微控制器(MCU)做非常全面的剖析。至少我觉得应该从自己熟悉以及感兴趣的方面入手,做一些操作,表达一下看法吧。这样在这么炎热的天气,才有动力测评下去。唉~~~,说起来,真的好热啊。。。。。


一、外观

       在这里我拿Nucleo-F042K6与其做外观对比。至于Nucleo-l432kc的性能说明,官网都有。我就不搬砖过来啦。
STM32L432KC  官网介绍


  从以上两个不同型号的Nucleo-32板外观的对比,我们可以发现两个不同之处:
a、那就是Nucleo-L432K多了X1;从原理图看就是如下红色方框中的X1.




从datasheet,L4用户手册看这个地方就是比起其他Nucleo的板子在OSC32_IN/OUT的引脚多了个X1的晶振 。




b、MCU的封装由LPQFP变成了UFQFN。至于外面的那个焊盘是干什么用的,我请教过dcexpert
       这个焊盘是预留的QFP的封装,这样同一个板子就可以兼容两种不同封装的芯片了。
另一方面:NUCLEO-L432KC开发板是首个集成一款QFN32微型封装微控制器的Nucleo-32开发板,板载一颗STM32L432KCU6微控制器(UFQFPN32)。



另外,Nucleo-L432的引脚分布看起来也和别的Nucleo-32的板子没什么区别。



当然,别看这个L432“小个子”,但是它的内部的模块一点也不比F4的有些型号少。特别是它还增加了可编程的运放单元。





二、将程序放在SRAM中执行


方法一:
a、这里以LED电平翻转的程序为例。首先用CubeMX配置LED电平翻转的程序。
b、打开MDK工程,打开Options for Target 选项。打开Linker选项,可以看到
Flash 起始地址:0x08000000
RAM 起始地址: 0x20000000




编译工程后,可以看到Memory map文件GPIO_IOToggle.map文件在该工程的目录下:





用Notepad打开该文件,可以看到如下两个函数的地址在FLASH中
HAL_GPIO_TogglePin();
  HAL_Delay();



通过#pragma arm section code = "RAMCODE" 和#pragma arm section
具体的方法如下:
1、找到,并打开.sct文件(我使用Notepad打开)



2、修改.sct文件。自定义一个RAMCODE的section,放在RW_IARM执行区域,地址范围为:
0x20000000~0x20000800(这里我放2KB的空间)
因为从map文件来看。Total ROM Size 就占用的Flash大小,Total RW Size是占用的SRAM大小
led电平翻转这个程序,所占SRAM大小为1kb左右


修改.sct文件,并保存



3、在工程中,Options for Target 的Linker选项中,使用刚才修改过的.SCT文件。




4、以#pragma arm section code = "RAMCODE"为开头。将所有需要放到RAMCODE section的函数包含进来。
这个时候编译器会自动将这些函数放到RAMCODE所在的0x200000000开始的区域。



所以,重新编译后,打开map文件,就可以看到这几个函数的地址在SRAM中了。


方法二:

1、同样需要修改.SCT文件(修改的方法同方法一的1、2);(我修改成64KB的RAM(因为L432只有64kb的Sram))

2、将需要在RAM中执行的函数前面添加__attribute__((section("RAMCODE")))声明该函数放在RAMCODE section中。这里需要注意的是:如果将这个声明放在函数前面,那么这个函数调用的所有函数也会放到RAMCODE的section中。

不过还是需要像方法一一样,使用修改过的.sct文件(详见方法一的3)

  1. //   #pragma arm section code = "RAMCODE"
  2. __attribute__((section("RAMCODE")))
  3. void Toggle_LED(void)
  4. {
  5.     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
  6.     HAL_Delay(300);      
  7. }
复制代码



打开map文件,看到这几个函数的地址在ram中



由此可见,我觉得这个方法二比起方法一,要更加的灵活一些。因为方法二只需要添加声明就可以了。方法一太过于死板了。



三、L432 的特色:OPAMP(可编程运放单元)
   如英文版的用户手册描述:它的正向输入端可连接到内部DAC;输出端可连接到内部的ADC
   如下为引脚连接功能:




打开en.stm32cubel4\STM32Cube_FW_L4_V1.5.0\Projects\STM32L432KC\Nucleo\Examples\OPAMP\OPAMP_PGA
这个工程:
/* set to 1 after PA.12 (Arduino D2) interrupt  */
__IO uint32_t UserButtonStatus = 0;

PA12作为按键中断,来改变opamp的放大增益。所以将杜邦线的一头接在PA12,另一头接GND或者不接GND来实现PA12的这个按键功能。
  1. /*----------------------------------------------------------------------------*/
  2. /* Step 0:                                                                    */
  3. /*          DAC:     normal power mode                                              */
  4. /*          OPAMP:   normal power mode - gain = 2                                   */
  5. /*          DMA:     circular mode - DMA half transfer IT handled by Cortex         */
  6. /*          Cortex:  run mode                                                       */
  7. /*----------------------------------------------------------------------------*/
  8.   while (UserButtonStatus == 0)
  9.   {
  10.   }
  11.   UserButtonStatus = 0;  
  12.   
  13.   /* Gain change on the fly to 4 */
  14.   OpampHandle.Init.PgaGain = OPAMP_PGA_GAIN_4;
  15.   
  16.   if(HAL_OK != HAL_OPAMP_Init(&OpampHandle))
  17.   {
  18.     Error_Handler();
  19.   }

  20. /*----------------------------------------------------------------------------*/
  21. /* Step 1: (1 push on Key button)                                             */
  22. /*          DAC:     normal power mode                                              */
  23. /*          OPAMP:   normal power mode - gain = 4                                   */
  24. /*          DMA:     circular mode - DMA half transfer IT handled by Cortex         */
  25. /*          Cortex:  run mode                                                       */
  26. /*----------------------------------------------------------------------------*/

  27.   while (UserButtonStatus == 0)
  28.   {
  29.   }
  30.   UserButtonStatus = 0;  
  31.   
  32.   /* Test will be done in low power mode without - no DMA IT running in */
  33.   /* circular mode */
  34.   powerstatus =  1;
  35.   
  36.   /* DAC is in low power mode */
  37.   DAC_Config_lowPower();

  38. /*----------------------------------------------------------------------------*/
  39. /* Step 2: (2 pushes on Key button)                                           */
  40. /*    DAC:     Low power mode                                                 */
  41. /*          OPAMP:   normal power mode - gain = 4                                   */
  42. /*    DMA:     circular mode - DMA half transfer - no IT handled by Cortex    */
  43. /*    Cortex:  run mode                                                       */
  44. /*----------------------------------------------------------------------------*/
  45.   
  46.   while (UserButtonStatus == 0)
  47.   {
  48.   }
  49.   UserButtonStatus = 0;  
  50.   
  51.   /* OPAMP set in low power mode */
  52.   OPAMP_Config_Power(OPAMP_POWERMODE_LOWPOWER);  

  53.   /* DAC    in low power mode       */
  54.   /* OPAMP  in low power mode       */

  55.   
  56.   /*Suspend Tick increment to prevent wakeup by Systick interrupt.
  57.   Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base)*/
  58.   HAL_SuspendTick();

  59.   /* Infinite loop */
  60.   /* Push on key button wakes CORTEX up */
  61.   /* than changes gain to 2 or 4 */
  62.   /* then sleep again until next push */

  63. #ifdef CHANGE_GAIN_IN_SLEEP_IN_MAIN  /* switch gain in low power mode using main */  

  64.   while (1)
  65.   {   
  66.       if (OpampHandle.Init.PgaGain == OPAMP_PGA_GAIN_2)
  67.       {
  68. /*----------------------------------------------------------------------------*/
  69. /* Step 3: (another push on Key button)                                       */
  70. /*    DAC:     Low power mode                                                 */
  71. /*          OPAMP:   Low power mode - gain = 4                                      */
  72. /*    DMA:     circular mode - DMA half transfer - no IT handled by Cortex    */
  73. /*    Cortex:  sleep mode                                                     */
  74. /*----------------------------------------------------------------------------*/
  75.         /* Gain change on the fly to 4 */
  76.         OpampHandle.Init.PgaGain = OPAMP_PGA_GAIN_4;
  77.       }
  78.       else
  79.       {
  80. /*----------------------------------------------------------------------------*/
  81. /* Step 4: (another push on Key button)                                       */
  82. /*    DAC:     Low power mode                                                 */
  83. /*          OPAMP:   Low power mode - gain = 2                                      */
  84. /*    DMA:     circular mode - DMA half transfer - no IT handled by Cortex    */
  85. /*    Cortex:  sleep mode                                                     */
  86. /*----------------------------------------------------------------------------*/
  87.         /* Gain change on the fly to 2 */
  88.         OpampHandle.Init.PgaGain = OPAMP_PGA_GAIN_2;
  89.       }
  90.       
  91.       if(HAL_OK != HAL_OPAMP_Init(&OpampHandle))
  92.       {
  93.         Error_Handler();
  94.       }
  95.       
  96.       /* Enter SLEEP Mode, wake up is done once Key push button is pressed */  
  97.       HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  98.   }  

  99. #else /* switch gain in low power mode using IT */

  100. /*----------------------------------------------------------------------------*/
  101. /* Step3 <-> Step4 handled by EXTI15_10_IRQHandler                            */
  102. /* Cortex goes to sleep upon exit of EXTI15_10_IRQHandler                     */
  103. /*----------------------------------------------------------------------------*/
  104.   HAL_PWR_EnableSleepOnExit();

  105.   /* Enter SLEEP Mode, wake up is done once Key push button is pressed */  
  106.   HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  107.   
  108.   /* Code shall not reach this point as only IT are processed */  
  109.   while (1)
  110.   {
  111.   }
复制代码

量测PA4(DAC1_OUT1),PA3(OPAMP_OUT1),通过将PA12接地或者不接地的次数得到如下波形,可以看出,这个时候的放大倍数约为4倍。
但就这个例子来看,运算放大后的波形还是有些失真的。





总结:
1、对于同样的cortex-M4内核的这个“小个子”MCU来说,它的功能并没有随着它的小体积而减少;
2、本来还想玩玩CoreMark的,但是移植成功后,使用串口1来打印,就是不成功。我折腾了下,工程编译没有错误,但是就是不显示打印信息我就不拿这个程序出来献丑了。这个花的时间挺多的,加上天气热,弄得我很恼火我自己。
这里我放出,CoreMark软件下载链接:CoreMark下载链接(需注册)


如何将coremark程序移植到STM32上.pdf (1.12 MB, 下载次数: 23)

有兴趣的网友玩玩,我后面有空下来再研究下,就是想看看我们测出来跟官方测试出来差异有多大。


3、最近有个项目中,新打样回来一批板子(5pcs)。其中有3pcs都是刚开始没什么问题,用段时间(几天吧),就发现CPU(STM32F405RGT6)发烫。用数显的Power Supply看电流最小的有200~300mA,最大的2A左右了。所以就怀疑CPU问题。解焊其中一块CPU,量测本体3.3V 对 GND阻抗,发现阻抗为0




a、购买新的CPU回来后,重新焊接后,量测3.3v对地不短路。重新上电后,过段时间CPU依然发烫(焊接好CPU后,用洗板水擦洗过);
b、拿打样剩余的空板,只焊接CPU外围电路,重新上电,过段时间CPU依然发烫(焊接好CPU后,用洗板水擦洗过);
同样的,我同事负责的另一个项目中,也是有颗CPU有问题。焊接好CPU后,用洗板水擦洗过板子。发现上电后,CPU部位冒烟了。。。。所以我们一致认为洗板水有问题(是从某宝购买的)。


下周,抽个时间再浪费1pcs(30多块RMB)验证下,这次不用洗板水,看看效果。。。。

4、好了言归正传的说下这个Nucleo-L432KC的板子,这个板子首款有QFN32的Nucleo-32的板子。所以有点盖头换面的意思。当然,虽然没有太深入的去理解它自带的OPAMP的功能。但是从介绍中可以看得出,这个是与ADC,和DAC有关系的。最近我同事有个传感器上就是需要运放,因为如果将那个传感器的输出接在ADC上,显示只有0.8v的信号,这样用adc采样的数值就不是很准确了,所以他们最近在使用放大器在设计电路来放大信号。所以如果MCU自带AMP的话,想必这个外围电路会相对小一些。


以上,就是我的测评内容,欢迎指正,大牛勿喷。谢谢。












此帖出自stm32/stm8论坛

最新回复

您好,我想请问一下PGA的偏置电压是怎么加的呢。。。   详情 回复 发表于 2019-6-7 03:53

赞赏

2

查看全部赞赏

点赞 关注
 

回复
举报

183

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
看完了。多谢分享。为何不用无水酒精洗板了
此帖出自stm32/stm8论坛

点评

哥哥看清楚啦,不是不用无水乙醇。 是不用洗板水,这两个在成分上是有区别的呀。。。。。。 现在用的是无水乙醇  详情 回复 发表于 2017-12-21 18:27
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
lovelee 发表于 2017-12-21 17:29
看完了。多谢分享。为何不用无水酒精洗板了

哥哥看清楚啦,不是不用无水乙醇。  是不用洗板水,这两个在成分上是有区别的呀。。。。。。

现在用的是无水乙醇
此帖出自stm32/stm8论坛

点评

我知道。我们洗板用哪个无水乙醇。  详情 回复 发表于 2017-12-22 12:49
 
 

回复

183

帖子

0

TA的资源

一粒金砂(中级)

4
 
huaiqiao 发表于 2017-12-21 18:27
哥哥看清楚啦,不是不用无水乙醇。  是不用洗板水,这两个在成分上是有区别的呀。。。。。。

现在用的 ...

我知道。我们洗板用哪个无水乙醇。
此帖出自stm32/stm8论坛

点评

额嗯,是的额,无水乙醇比较好用。 不像某宝的洗板水。、、、、、  详情 回复 发表于 2017-12-22 14:39
 
 
 

回复

183

帖子

0

TA的资源

一粒金砂(中级)

5
 
楼主:节日快乐!祝福大家双旦快乐!万事如意!
此帖出自stm32/stm8论坛
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
lovelee 发表于 2017-12-22 12:49
我知道。我们洗板用哪个无水乙醇。

额嗯,是的额,无水乙醇比较好用。

不像某宝的洗板水。、、、、、
此帖出自stm32/stm8论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 

您好,我想请问一下PGA的偏置电压是怎么加的呢。。。

此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表