开箱体验 1、试用背景 上次使用STM32,还是读书的时候,那会儿刚刚推出来F1系列不久,得到一块F107的板子,叫“神舟IV号”,玩遍了外设资源,也用F1系列的片子设计了几个小玩意。那会儿就觉得,驱动库好用,直接拿来就跑,省去很多麻烦。工作后,一直使用其它MCU,ST的也有,是STM8系列,STM32确实有挺多年没有碰过了。 虽然没有用过,但是对ST的产品一直都是挺关注,STM32的开发的确相对简单很多,生态链也更加全面,特别是推出 CubeMX 之后,基本的工程搭建和配置非常方便。后续因工作需要,使用的平台仍是NXP的K6x系列,但综合评估,一是价位略高;二是用于开发的库不统一,有自己写的库、有官方库、还有直接面向寄存器的;三是获取支持的途径也有欠缺,线上可参考的有效资源非常有限。借G4板卡试用活动,申请到一块NUCLEO-G474RE,在此分享自己的试用体验。 2、开箱检验 这次活动,虽然申请的是G474,但意外地先收到了一块G431的板子,G431 128kB Flash、32kB sRAM,项目对Flash要求较高(需要保存外部片子的固件和配置文件),不能满足需求。后续又收到了G474的板子,对512kB Flash,满足项目需求绰绰有余。两块板子如下图。 # d: r1 p c% m使用过程 1、框图架构 系统框架图如下图示。STM32G474RE通过UART与外部通讯基带板联系,根据基带板提供的API函数,给基带板下载固件和配置文件,监控基带板的运行状态。 2、用到的MCU资源 本设计中用到的MCU资源包括UART4、UART5、PA5、PC1、TIM3,其用于如下表: 3、Flash布局与文件下载 STM32G474RE共有512kBFlash,512KB的Flash区域(0x0800 0000 – 0x0808 0000),保存着自身程序、基带板固件、基带板配置文件,Flash布局如下: * x9 s% j/ k1 z% I/ }" X配置文件和基带板固件通过STM32CubeProgrammer烧录到上表指定的起始位置,烧录过程较J-Flash工具简单,烧录成功后,仿真时可以通过Memory查看数据。 STM32CubeProgrammer软件截图如下,需要注意修改地址。 + V# W" [2 G4 ~8 c, W6 O, p: k$ T4、Flash读取 本设计中,没有用到Flash写功能。Flash读取较简单,流程如下,直接拷贝数据。 Flash读取函数,直接调用memcpy()函数将数据从Flash拷贝到RAM中。为防止数据读取出错,读取数据时连续取了两次,比较两次数据是否相同,如不相同,将会重复执行5次,直到相同或者次数达到,软件退出。 5、UART、定时器和GPIO 系统时钟配置和UART、定时器、GPIO初始化相关代码由STM32CubeMX生成,这个软件大家都会用,我用过后的感觉是,简单、实用,不需要像使用K6x一样,看手册、了解时钟门、看寄存器配置等等。不过使用这个软件不是说不需要了解寄存器配置,而是能简化我们的开发。 CubeMX的配置界面如下图: 6、执行效果 有了前面的准备工作,加之原来基于K6x的工程就是模块化设计的,软件很快就正常工作了,下图展示了NUCLEO板与通讯基带板的连接、调试界面获取到的调试信息等。软件运行效果与K6x的效果完全相同。 # w( Z0 t8 P: P问题和试用体会 ! O/ ]7 b& X+ N' s/ C1 q 多年没用STM32系列的MCU,软件架构确实发生了非常大的变化,谈以下几点感受: 2 G6 H$ F; [$ d$ v ① SDK和CubeMX使用:配合CubeMX的SDK,确实功能强大,但相对NXP的SDK来说,ST的SDK里的例程,没有NXP的例程通俗易懂。当然配合CubeMX后,效果和体验确实不一样。 * ?8 `9 i! l0 k) u$ F) j ② 定时器配置问题:CubeMX生成的代码,只是初始化了定时器,使能了中断,需要用户启动定时器和中断,代码如下: HAL_TIM_Base_Start_IT(htim_base); HAL_TIM_Base_Start(htim_base); 之前没有用过CubeMX生成的代码,在这里还是卡壳了一下,不过查看了寄存器配置,发现定时器没有起来,配置一下,也还方便。 再提一点,由于之前一直用IAR7,这次用IAR8发现,它的寄存器查看器,打开后只看到了CPU寄存器,没有外设寄存器,需要右键单击选择寄存器组才行。 : Q( `3 h+ @2 P& p/ `) Y+ x ③ UART配置问题:与定时器一样,CubeMX生成的串口,进不了中断。同样调用HAL_UART_Receive_IT()函数,问题解决。 ④ 栈分配:调试过程中出了个问题,UART5串口接收数据不正常。 我用TTL转USB接电脑调试,运行正常;用开发板接通讯基带板,单步跑也正常,全速跑时就会报错,软件跑飞。CubeMX生成工程时的栈大小为0x400,与原来K6x的一样,本想着没有什么问题的,但根据之前项目的经验,怀疑是栈空间不够,将栈大小改为0x800,问题解决了。可能是SDK不一样,STM32的SDK函数调用深度更深,需要的栈资源也更大吧。 % f7 ~# } ^! o0 `) n2 j |
签到 |