社区导航

 
查看: 4716|回复: 12

[设计过程分享] 【sensorTile】使用Mbed进行程序开发的问题及解决

[复制链接]

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2017-1-2 22:38:54 | 显示全部楼层 |阅读模式
这段时间研究了使用Mbed开发SensorTile,结果一开始的闪灯程序就遇到问题,程序没有变化。经过一段时间的研究,终于发现并解决了问题。我把解决问题的大致步骤写出来,给大家参考一下。




SensorTile使用了STM32L476JG,它不在Mbed直接支持的芯片中(Mbed支持STM32L476VG和STM32L476RG,没有直接支持STM32L476JG)。

因为STM32L476JG和STM32L476VG/STM32L476RG差别很小,除了封装不同,在就是GPIO有少量不同,STM32L476JG多出了PORTG。按照以前的经验,STM32L476VG/STM32L476RG的程序应该是可以直接运行在STM32L476JG上。于是用NUCLEO_L476RG模板,写了一个LED的闪灯程序,结果编译出错,提示PG_12没有定义。

  1. #include "mbed.h"

  2. DigitalOut LED(PG_12);

  3. int main()
  4. {   
  5.     while(1)
  6.     {
  7.         LED = 0;
  8.         wait(0.1);
  9.         LED = 1;
  10.         wait(0.1);
  11.     }
  12. }
复制代码

检查了源码,发现PinNames.h和PortNames.h中没有PORTG的定义。于是手工添加了PORTG的定义到PinNames.h和PortNames.h中,这次可以编译通过了。但是程序下载后没有任何反应,于是就想把程序导出来进行仿真。程序导出很方便,但是发现NUCLEO_L476RG导出的程序不完整,在online IDE中编译很正常,在KEIL中提示缺少objects.h,从github的mbed源码中找到这个文件并加入,还是不行,缺少更多的文件,经过多次尝试都是这样,看来是NUCLEO_L476RG的程序库有问题。后来发现使用STM32L476_DISCO模板建立的程序,导出后是完整的,可以在Keil中仿真,这次发现PORTG相关的寄存器被被设置,所以LED不亮。

进一步仿真就需要查看程序源码了,而STM32L476_DISCO模块提供了很多文件是obj格式的,带来不便。先是在online IDE中将mbed库删除,导入mbed-dev,结果这样就无法导出程序了,这好像是online IDE有限制。最后回到开始的STM32L476_DISCO模板程序,将obj文件删除,然后从mbed源码中找到对应文件的C/CPP文件,并加入到项目文件。因为这段时间出了一些意外,时间有些少,所以花费N天才完成这一工作,终于可以深入源码查找问题了。

最后发现,在pinmap.c中,函数uint32_t Set_GPIO_Clock(uint32_t port_idx)中缺少了PORTG的代码,于是仿照上下相关部分代码,添加了PORTG的部分。

  1. #if defined(GPIOG_BASE)
  2.         case PortG:
  3.             gpio_add = GPIOG_BASE;
  4.             __HAL_RCC_GPIOG_CLK_ENABLE();
  5.             break;
  6. #endif
复制代码

回到前面的blinky闪灯程序,发现LED还是没有变化。进入仿真模式,并参考了CubuMX产生的代码,发现还需要设置PWR_CR2。再次修改uint32_t Set_GPIO_Clock(uint32_t port_idx)函数:

  1. #if defined(GPIOG_BASE)
  2.         case PortG:
  3.             gpio_add = GPIOG_BASE;
  4.             __HAL_RCC_SYSCFG_CLK_ENABLE();
  5.             __HAL_RCC_PWR_CLK_ENABLE();
  6.             __HAL_RCC_GPIOG_CLK_ENABLE();
  7.             HAL_PWREx_EnableVddIO2();
  8.             break;
  9. #endif
复制代码

修改后,LED终于开始闪了。

修改后的SensorTile Mbed程序,目前只修改了GPIO部分,GPIOG对应的外设部分还没有修改,等进行到下一步后在说了。
SensorTileTest.zip (2.31 MB, 下载次数: 42)


回复

使用道具 举报

5363

TA的帖子

174

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-2 22:46:58 | 显示全部楼层
楼主高人,学习了!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵


回复

使用道具 举报

5141

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-1-3 00:20:43 | 显示全部楼层
D大神
Mbed未来会支持SensorTile的传感器吗

点评

这个不知道,不知道ST是否有这个计划。估计自己实现也不难。就是它的SPI使用三线方式,mbed目前只支持4线方式。  详情 回复 发表于 2017-1-3 22:56
虾扯蛋


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-1-3 00:27:51 | 显示全部楼层
这个号啊


回复

使用道具 举报

1309

TA的帖子

1

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2017-1-3 20:42:51 | 显示全部楼层
mbed好,就是天朝用起来太慢了

点评

的确,特别是CLI方式,需要通过github,速度实在太慢了。  详情 回复 发表于 2017-1-3 22:57


回复

使用道具 举报

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2017-1-3 22:56:07 | 显示全部楼层
littleshrimp 发表于 2017-1-3 00:20
D大神
Mbed未来会支持SensorTile的传感器吗

这个不知道,不知道ST是否有这个计划。估计自己实现也不难。就是它的SPI使用三线方式,mbed目前只支持4线方式。


回复

使用道具 举报

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2017-1-3 22:57:07 | 显示全部楼层
shihuntaotie 发表于 2017-1-3 20:42
mbed好,就是天朝用起来太慢了

的确,特别是CLI方式,需要通过github,速度实在太慢了。


回复

使用道具 举报

802

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2017-2-3 17:11:49 | 显示全部楼层
楼主,新年好,这个灯是蓝牙核心板上的灯吗?
原理图有两个灯,一个是sd卡灯引脚PG12,一个是调试引脚swdclk灯。谢谢。

点评

这个LED是PG12,在核心板上。  详情 回复 发表于 2017-2-3 20:43
大秦正声电子之家 http://yang96381.blog.163.com
提供蓝牙、zigbee芯片批量生产烧录服务:1带3脱机烧录工具,支持cc2540/cc2541,cc2530/2531,也支持nrf51822


回复

使用道具 举报

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2017-2-3 20:43:12 | 显示全部楼层
大秦正声 发表于 2017-2-3 17:11
楼主,新年好,这个灯是蓝牙核心板上的灯吗?
原理图有两个灯,一个是sd卡灯引脚PG12,一个是调试引脚swdc ...

这个LED是PG12,在核心板上。


回复

使用道具 举报

802

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2017-2-5 11:27:51 | 显示全部楼层
仔细查看官方例程和手册,我用寄存器操作点灯成功。
低功耗的型号和传统m3,m4核有点区别的。

点评

=的确有不少区别,但功能更强了。特别是L4的自动频率校正功能很方便,用32K晶体就可以满足USB时钟的要求。  详情 回复 发表于 2017-2-5 15:54
大秦正声电子之家 http://yang96381.blog.163.com
提供蓝牙、zigbee芯片批量生产烧录服务:1带3脱机烧录工具,支持cc2540/cc2541,cc2530/2531,也支持nrf51822


回复

使用道具 举报

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2017-2-5 15:54:18 | 显示全部楼层
大秦正声 发表于 2017-2-5 11:27
仔细查看官方例程和手册,我用寄存器操作点灯成功。
低功耗的型号和传统m3,m4核有点区别的。

=的确有不少区别,但功能更强了。特别是L4的自动频率校正功能很方便,用32K晶体就可以满足USB时钟的要求。


回复

使用道具 举报

453

TA的帖子

9

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-2-8 11:32:58 | 显示全部楼层
原计划也用mbed。不过以后不会支持L476YG的,这个板子和nucleo的L476RG是不同的,YG的GPIO更多,但是mbedOS是不开源的,所以用起来没有想象中那么快捷。不如直接找到寄存器去读写。
需要指出的是L476比F4系列其实是更强的,主频降了但是性能降低有限,低功耗增强了。但是代码和手册都是同一份。

点评

mbed是开源的吧,代码都在github上  详情 回复 发表于 2017-2-8 14:55


回复

使用道具 举报

6913

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

 楼主| 发表于 2017-2-8 14:55:45 | 显示全部楼层
fyaocn 发表于 2017-2-8 11:32
原计划也用mbed。不过以后不会支持L476YG的,这个板子和nucleo的L476RG是不同的,YG的GPIO更多,但是mbedOS ...

mbed是开源的吧,代码都在github上


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2018-8-18 20:16 , Processed in 0.346346 second(s), 18 queries , Gzip On, Redis On.

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