好久没进博客,似乎原来的博客文章没有了。
手头上一个自己私人的产品,原来用的是AVR单片机,现在AVR的价格是水涨船高,于是想替换掉它。在多个主流单片机中比较,发现STM32F030在工作电压、封装、性能和价格方面都比较合适,于是决定选用这个。作为一名硬件工程师,自认编程水平一般,或者说是比较懒,不怎么喜欢去看寄存器,刚好发现ST有个代码生成工具STM32CubeMX,可以点几下鼠标直接配置好寄存器生成keil工程,试用了一下感觉非常适合我这种懒人。
然后开始改板,写程序。把原来AVR单片机的程序搬到STM32CubeMX生成的keil工程下,一路比较顺利,没怎么看寄存器。在调SPI的时候发现不能跟以前一样直接操作寄存器发送,据说是STM32F030的SPI有FIFO的缘故,然后调用HAL库的发送函数解决了。接着调试AD转换,用STM32CubeMX配置好的ADC可以采集大信号,采集了Vrefint和电源电压,都是正常的,但是采集小电压就不准了。困扰了好几天,网上好多例子又是库函数版本的,不太想去看。后来决定自己配寄存器,仿着正点原子同学的例程把寄存器配了一遍,ADC校准那位编译的时候警告不能用(1<<31)这种方式,然后自己也没想太多直接把校准屏蔽了。用配置好的参数去采样,发现结果跟STM32CubeMX配置出来的工程差不多,自己去摸索误差的规律,发现总是差在一个固定的值。直接加个数字是能够把误差消除,但是小数值怎么办,于是看别人的一些例子,后来还是觉得应该做一下校准。不能用(1<<31)这种方式,那写0x80000000总没错吧,编译无警告,烧写后AD采样值正常。
STM32CubeMX是个好东西,时钟外设都能很方便的配置出来,一般也能满足需求。只是有些配置不全的寄存器还是要自己去看一下,或者在配置好的函数里面修改,或者自己给外设单独写配置程序。