社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 2842|回复: 5

[原创] 【Nucleo-L432】STM32L432KC 测评

[复制链接]

4151

TA的帖子

8

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2016-7-31 20:45:40 | 显示全部楼层 |阅读模式
本帖最后由 huaiqiao 于 2016-7-31 20:45 编辑

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


一、外观

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

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


QQ截图20160729225933.png QQ截图20160729225900.png

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


2016-07-30_214327.png

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

2016-07-30_215542.png

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


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


可编程运放.png


二、将程序放在SRAM中执行


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


1.png

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


4.png


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

3.png

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

5.png

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

修改.sct文件,并保存

9.png

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

8.png


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

11.png

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

方法二:

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. }
复制代码

14.png

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

13.png

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



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


引脚.png

打开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.png


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

CoreMark 软件下载.png
如何将coremark程序移植到STM32上.pdf (1.12 MB, 下载次数: 19)

评分

2

查看全部评分



回复

使用道具 举报

171

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-21 17:29:05 | 显示全部楼层
看完了。多谢分享。为何不用无水酒精洗板了

点评

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


回复

使用道具 举报

4151

TA的帖子

8

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

 楼主| 发表于 2017-12-21 18:27:03 | 显示全部楼层
lovelee 发表于 2017-12-21 17:29
看完了。多谢分享。为何不用无水酒精洗板了

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

现在用的是无水乙醇

点评

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


回复

使用道具 举报

171

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-22 12:49:43 | 显示全部楼层
huaiqiao 发表于 2017-12-21 18:27
哥哥看清楚啦,不是不用无水乙醇。  是不用洗板水,这两个在成分上是有区别的呀。。。。。。

现在用的 ...

我知道。我们洗板用哪个无水乙醇。

点评

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


回复

使用道具 举报

171

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-22 12:50:42 | 显示全部楼层
楼主:节日快乐!祝福大家双旦快乐!万事如意!


回复

使用道具 举报

4151

TA的帖子

8

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

 楼主| 发表于 2017-12-22 14:39:33 | 显示全部楼层
lovelee 发表于 2017-12-22 12:49
我知道。我们洗板用哪个无水乙醇。

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

不像某宝的洗板水。、、、、、


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-5-27 01:36 , Processed in 6.678376 second(s), 20 queries , Gzip On, Redis On.

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