由于我刚刚从51转过来STM8,遇到很多问题,同时也得到了群里的前辈帮助,所以分享些经验让后面的人碰到类似问题时可以有个参考。
我现在用的低功耗的STM8L151F2,20PIN、Flash只有4k,对于这种资源缺乏的芯片,对很多基本的东西心里面要有底(有低功耗要求当然要用最低功耗的芯片):
首先,我也是从“标准外设库”开始的。请大家注意标准库版本,我用的开发环境是IAR官网下载的7.3版(限制编译代码大小的许可证),在安装目录下面查找“STM8L15x_StdPeriph_Driver”这个目录就是上面说的“标准外设库”。注意这个库里面最基本的文件“stm8l15x.h”(日期是2015年11月26日)里面提到:
#if !defined (STM8L15X_MD) && !defined (STM8L15X_MDP) && !defined (STM8L15X_HD)
#error "Please select first the target STM8L device used in your application (in stm8l15x.h file)"
#endif
也就是说这个库只支持“中密度”、“中密度+”、“高密度”三种芯片,简单来说就是“只支持flash >=16K的芯片”。如果要支持芯片末尾数字是2或3(flash<16k)的芯片,必须要支持“低密度”的标准外设库。后来我找到2011年6月的库就可以支持低密度设备,头文件里有“LD”的标志。
然后,我就基于这个2011年的库写了一个最简单的循环从串口发出字符串的小程序,结果编译不出来提示说“超过编译器的代码限制”只能先解决许可证的问题,再编译出来的.hex有5k大小当然写不进F2的芯片,然后各种优化,各种剪裁终于编译出4K的.hex文件,烧进芯片里果然能收到串口定时发出的字符串。
但问题来了:这个只实现基本功能的应用已经占去了所有的Flash空间,根本没空间再容纳其他功能的代码。幸好根据我在51上面的经验,只需要直接操作,就能节省大量的代码空间,比如初始化系统时钟只需要这样:
CLK_ICKCR=0x01; //打开内部高速时钟HSI(16MHz);
CLK_SWR =0x01; //系统时钟源使用内部高速时钟HSI;0x01=HSI,0x02=LSI,0x04=HSE,0x08=LSE其余保留
CLK_CKDIVR=0x03; //系统8分频,使之工作在2MHz的频率下(0=1,1=2,2=4,3=8,4=16)
最后如果有低功耗的要求,参考手册中的一段话应该留意:
Unused I/O pins must not be left floating to avoid extra current consumption. They must be put into one of the following configurations:
• connected to VDD or VSS by external pull-up or pull-down resistor and kept as input
floating (reset state),
• configured as input with internal pull-up/down resistor,
• configured as output push-pull low.
如果要省电,没有使用的管脚要设置为下面三种模式之一:
*外部接上拉或下拉,内部保持在输入模式;
*设为输入模式,内部设为上拉或下拉
*设为上拉输出,并置为低。
|