STC8H1K08 pwm功能正常,程序烧写到STC8H1K17T ,pwm不工作,其他外设工作
本帖最后由 lonnychen 于 2024-1-3 11:37 编辑STC8H1K08 pwm功能正常,程序烧写到STC8H1K17T,pwm不工作,其他外设能够正常工作。
不知道什么原因了,然后看手册,带T的有高速高级pwm,是不是这里要配置什么寄存器才行
我是使用内部24MHZ,然后分频24,相当于是单片机运行在1Mhz频率下。 不知道是不是带T的高速pwm主频不能太低还是咋的
STC8H1K08-36I-SOP16 和
STC8H1K08T-33I-SOP16 的管脚肯定是不完全兼容的
STC8H1K08-36I-SOP16 的管脚图
STC8H1K08T-33I-SOP16 的管脚图
STC8H1K08-36I-TSSOP20 和
STC8H1K08T-33I-TSSOP20 的管脚肯定是不完全兼容的
STC8H1K08-36I-TSSOP20 管脚图
STC8H1K08T-33I-TSSOP20 管脚图
普通 PWM的用法 是一样的,要初始化 I/O的工作模式,否则是 高阻输入,无输出 void STC8H1K16_pwm2_init(unsigned char PWM_CH,unsigned long int freq)
// unsigned long int duty)
{
unsigned int match_temp = 0;
unsigned int period_temp = 0;
unsigned int freq_div = 0;
P_SW2 |= 0x80;
freq_div = (sys_clk / freq) >> 15; //分频
period_temp = sys_clk / freq / (freq_div + 1);
PWM2_ENO |= (1 << ((2 * ((PWM_CH >> 4) - 4)))); //使能输出
PWM2_PS |= ((PWM_CH & 0x03) << ((2 * ((PWM_CH >> 4) - 4)))); //输出脚选择
// 配置通道输出使能和极性
(*(unsigned char volatile xdata*)(PWM2_CCER1_ADDR + (((PWM_CH >> 4) - 4) >> 1))) |= (1 << (((PWM_CH >> 4) & 0x01) * 4));
//通道模式配置
(*(unsigned char volatile xdata*)(PWM2_CCMR1_ADDR + ((PWM_CH >> 4) - 4))) |= 0x06 << 4; //
(*(unsigned char volatile xdata*)(PWM2_CCMR1_ADDR + ((PWM_CH >> 4) - 4))) |= 1 << 3; //PWM模式2
//设置周期时间(高字节先写入)
//PWM2_ARR = (uint16)period_temp;
PWM2_ARRH = period_temp >> 8;
PWM2_ARRL = period_temp;
//PWM2_ARR=2000;
//PWM预分频(高字节先写入)
PWM2_PSCRH = freq_div >> 8;
PWM2_PSCRL = freq_div;
//设置占空比(高字节先写入)
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4))) = match_temp >> 8;
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4) + 1)) = match_temp;
PWM2_BKR = 0x80; //使能主输出
PWM2_CR1 = 0x01; //PWM开始计时
}
void STC8H1K16_pwm2_set_duty(unsigned char PWM_CH,
unsigned int duty)
{
unsigned int match_temp;
match_temp = PWM2_ARRH;
match_temp = match_temp << 8;
match_temp = match_temp + PWM2_ARRL;
match_temp = match_temp * ((float)duty / PWM_DUTY_MAX); //占空比
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4))) = match_temp >> 8;
(*(unsigned char volatile xdata*)(PWM2_CCR1_ADDR + 2 * ((PWM_CH >> 4) - 4) + 1)) = match_temp;
} 神农鼎 发表于 2024-1-3 11:37
普通 PWM 是一样的
现在就不知道啥原因了 pwm在1k08上能工作 在1k17T上不工作,按照你们的经验,是不需要改什么配置吗 神农鼎 发表于 2024-1-3 11:37
普通 PWM 是一样的
如果1k17T是使用普通pwm,需要单独配置什么寄存器吗 不需要 所有STC8H的高级PWM操作都是一样的,兼容的,小差别是有P1.2口的从P1.2口输出,没有P1.2的从P5.4输出。
重新下载测试了STC8H1K08T的PWM,没有任何问题。
请下载下面的附件,解压缩后,直接下载“01A-PWMA-4对互补PWM输出P1口”里的HEX文件测试,4路PWM从P1.0 P1.1 P5.4 P1.3 P1.4 P1.5 P1.6 P1.7输出,示波器可以观察到波形。
神农鼎 发表于 2024-1-3 12:59
不需要
那是什么原因呢 程序一样硬件一样 只换了个单片机型号1K17T有很多版本吗 梁工 发表于 2024-1-3 13:36
所有STC8H的高级PWM操作都是一样的,兼容的,小差别是有P1.2口的从P1.2口输出,没有P1.2的从P5.4输出。
重 ...
烧写进去也测不到波形 PWM口,对外输出,先设置成 推挽输出