你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 756|回复: 1

【我与STM32共成长】一路上有你

[复制链接]

2

主题

2

回帖

0

蝴蝶豆

初级会员

最后登录
2017-6-1
发表于 2017-1-24 16:42:35 | 显示全部楼层 |阅读模式
我用的是STM32F103做了一个小控制项目,无一例外涉及到输入,输出和显示。
从开始就没打算用寄存器操作进行编程,直接选择了Stm32CubeMX配置项目模板,使用HAL库函数编程,F1库已经很完善,也没遇到什么Bug。
但是HAL库一直没有找到一个正式的使用手册,只能翻阅CHM帮助。 如果对寄存器熟悉,使用HAL库函数,能更好理解并使用。
使用STM32F1的硬件IIC,使用HAL函数,读写SD3088时钟芯片,运行几个月,没发现IIC死锁的问题,刚开始时很担心这个问题。
STM32的HAL库,使用起来始终没有arduino那样平易近人,mbed在朝这个方向努力,但没有提出一个明确的移植指南。STM32产品很多,内存和外围设备变化多端,网站上的板子导入后,export后需要修改文件来适应自己的MCU片子,移植没有ST的官方确认。ST可以考虑提供经过验证的移植。
C++编程,对于变量管理很方便,但Stm32CubeMX还只能导出C语言的项目框架。


还是希望ST能把STM32的库进一步封装,隐藏底层硬件信息。

自己做的是壁炉控制系统,使用的是1.3寸的OLED屏,做人机交互时,选择了m2tklib,这个库是为文本LCD开发的,主要是给arduino服务,后来才有了ARM支持。也想使用stemwin,初期移植不明白,过几天再试试。
使用的是IAR编译器,遇到一个典型问题:结构体对齐。 这也算是2016做开发一个体验,关于对齐,网上也有文字提过,但多数是考虑STM32是32位MCU,一次读取32Bit(4字节)效率最高。

Stm32CubeMX支持的RTOS是FreeRTOS,编程时我直接按CMSIS封装的函数格式来写。使用osMessagePut,osMessageGet来进行结构体的发送和接受,使用了定长的内存池。
typedef struct
{

  bool fan_smoke_is_on;  
  bool fan_exchange_is_on;
  //uint8_t dummy_0;
  //uint8_t dummy_1;  

  uint16_t fan_smoke_power;  
  uint16_t fan_exchange_power;

} T;


由于使用memory pool,所以就会有Free操作:osPoolFree。
上面这个结构体没有红色部分时,系统运行时,会随机性死机,然后就开始考虑野指针问题。开始也不知道哪里的指针不对啊,就把怀疑的地方注释,等注释到osPoolFree后,不死机了。

比较昨天的代码,发现这个结构体自己修改了成员,然后就考虑是结构体未对齐4字节,释放指针所指内存时,把其他的数据也给修改了。
我这个对齐问题,编译时没有警告。

加上两个dummy数据,程序就正常了,隐约记得看u8g的源代码里也有dummy成员,应该也是对齐考虑。
开始比较迷信IAR优化代码好,结果被stack和heap折腾一通,还是GCC编译器自动管理方便。

回复

使用道具 举报

0

主题

44

回帖

0

蝴蝶豆

中级会员

最后登录
2018-11-27
发表于 2017-2-13 16:28:50 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版