|
发表于 2023-5-13 19:45:12
|
显示全部楼层
STC15W代码移植到STC16F、STC32G单片机的注意事项总结
一、编译器相关:
1、必须安装keil C251编译器,并且,需要把STC16F/STC32G的型号添加到软件安装目录,并且需要使用STC16F/STC32G系列的头文件
2、项目工程Options for Target 的配置
A、CPU Model 选择:Source (251 native)
B、Memory Model 选择:需要根据程序复杂程度做选择。一般选择Small:data vars far const ptr-4
C、Code Rom Size 选择:Large,64K program。Code Rom Size 模式如果是:Huge,64K functions,16M progr,那么会导致P0口的矩阵键盘工作不正常。
3、keil软件臭名昭著的BUG—0xfD的问题,导致了C251的文件名不能出现以下汉字:
褒饼昌除待谍洱俘庚过糊积箭烬君魁例笼慢谬凝琵讫驱三升数她听妄锡淆旋妖引育札正铸佚冽邶
埤荦蔟摭啐帻猃恺泯潺妪纨琮椠辇挲臊忑睚铨稞瘕颀螨簖酏觚鳊鼾
二、芯片接口相关:
1、除P30 、P31,其余IO口默认都是高祖模式,需要配置IO口模式才能正常使用。
2、LQFP48的第16脚不同:STC15W是P5.5,STC16F/STC32G是电压参考脚ADC_VRef+。
3、和STC8H8K一样,STC16F/STC32G LQFP48 也没有P1.2,用P4.2来控制NRF24L01_CSN
三、C251的语法与STC16F/STC32G的寄存器:
1、xdata 的变量,必须是写成 static u8 xdata count; 而不能写成 static xdata u8 count;
2、C251的函数中定义的 指向code的指针变量,需要填写数据的存储位置code。例如:(u8 Reg,u8 code *pBuf,u8 len),表示查找code 数组。
3、16位全局变量保存到xdata区间后,可能导致乱七八糟的奇怪现象。建议少用 。试试调整Memory Model选择:Large,xdata vars far const ptr-4。也有可能选择Small:data vars far const ptr-4,
4、OLED和万年历里面的,带参函数赋值时,不支持+-*/ 符号,例如 OLED_Write_Reg(0xb0+PAGE); 改成OLED_Write_Reg(0xb0|PAGE); 即可。加号改成 按位或
5、STC16F/STC32G需要在主函数第一句写 WTST=0; 让CPU执行单指令,让CPU速度正常
6、STC16F/STC32G需要把AUXR的 EXTRAM位写1,才能读写xdata存储空间。
四、WQX开发板课程相关
1、WS2812、DS18B20、LCD1602等 需要短暂延迟的代码 需要增加延迟_nop_();的数量
2、ADC的寄存器不一样 需要仔细修改,STC15W是内置参考电压。STC16F/STC32G是ADC_VRef+做参考电压。没有P1.2,ADC脚是P5.4。如果是实时测量ADC,关闭电源会严重影响采集结果。
3、IIC 函数 每次时钟上升沿之前 加一句 IIC_Delay();延迟。
4、STC16F/STC32G单片机的PWM的寄存器,和STC8H8K的PWM寄存器兼容。但是和STC15W的PWM寄存器完全不同。需要全部重新改写。
5、STC16F/STC32G单片机,暂时不支持EEPROM操作 |
|