国芯的论坛:国芯论坛 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
第一,时钟
参考STC8H的数据手册,第6章节系统时钟部分有介绍,系统时钟有3个时钟源可以选择。
涉及到寄存器系统时钟选择寄存器(CLKSEL)和时钟分频寄存器(CLKDIV)。我在项目里也是这么配置的,但是实际发现这个的设置和最终输出的时钟频率好像并无联系,系统时钟是由这里的宏定义所决定的。
所以这里时钟源设置和分频以及最后的系统时钟设置MAIN_Fosc宏定义我是没有搞懂的。
最后得出结论,是我自己得出的,并不一定对哈,前面两个寄存器设置的只是时钟源以及决定最终能否输出这么大的系统时钟频率,最主要的还是上图宏定义所设置的主时钟频率。
第二,定时器
第三,PWM
STC8H1K08只有16位高级PWM,没有高级PWM新增硬件移相功能和高速高级PWM,手册中也有说明。
STC的PWM设计的很高级,PWM分为两组,第一组是PWMA(PWM1P/PWM1N、PWM2P/PWM2N、PWM3P/PWM3N、PWM4P/PWM4N) ,第二组是PWMB(PWM5P/PWM5N、PWM6P/PWM6N、PWM7P/PWM7N、PWM8P/PWM8N)。
看下图,这里说明的PWM2的脉冲输出负极(仅仅举例)和PWM2的脉冲输出正极,这个意思是此端口配置成PWM输出的话只可以是输出低(正)或者输出高(高)。
有的单片机是可以配置这个端口PWM输出高或者低,而不仅仅是只能是输出高或者低。
所以STC这种设计也是很巧妙的,两个端口互补对称PWM输出。
参考PWM的Ddmo,初始化完成之后发现并不能点亮小灯,或者点亮小灯之后给一个信号pwm占空比无法改变。最后发现是需要写入,有一个函数可以把PWM占空比值更新。
// 函数: UpdatePwm
// 描述: PWM占空比更新程序.
// 参数: PWM: PWM通道/组号, PWMx结构参数,请参考PWM.h里的定义.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void UpdatePwm(u8 PWM, PWMx_Duty *PWMx)