在STVD中开发STM8的程序,对16位的寄存器访问不能直接对其赋值,必须分H和L两个8位寄存器单独操作,否则无效!
这几天用到了了Time1的PWM功能,其中TIM1_PSCR是定义分频系数的寄存器,使用的时钟源是内部16MHz,分屏系数为1,重载寄存器TIM1_ARR为8000,所以PWM的频率为16M/8000=2000,用示波器测试,发现确实为2000.
调试过程中用于电路限制,想把PWM改为100,所以TIM1_PSCR应该修改为(20-1)=19,于是直接将:
TIM1_PSCR=0;
改为
TIM1_PSCR=19;
结果用示波器测试发现PWM频率还是2000,奇怪??反复检所有寄存器,均没有发现问题,最后查了官方的“STM8S105C_S.h”文件,发现对于这个寄存器的定义是这样的:
/* TIM1 Prescaler register /
DEF_16BIT_REG_AT(TIM1_PSCR,0x5260);
/ Data bits High /
DEF_8BIT_REG_AT(TIM1_PSCRH,0x5260);
/ Data bits Low */
DEF_8BIT_REG_AT(TIM1_PSCRL,0x5261);
也没发现什么问题,但是它确实即定义了16位,也定义了两个8位。按理说是等效的。本着死马当活马医的精神,将:
TIM1_PSCR=19;
改为
TIM1_PSCRL=19;
测试发现PWM的频