我用的是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编译器自动管理方便。 |
感谢分享 |