找回密码
 立即注册
查看: 37|回复: 3

求一份STC8H2K17U高速HSPWM测试代码

[复制链接]

该用户从未签到

2

主题

1

回帖

20

积分

新手上路

积分
20
发表于 2024-4-28 17:22:55 | 显示全部楼层 |阅读模式
求一份STC8H2K17U高速HSPWM测试代码。根据STC8H手册提供的HSPWM测试代码无法运行。
#include "STC8H.h"
#include "stdio.h"

typedef     unsigned char    u8;
typedef     unsigned int    u16;
typedef     unsigned long    u32;

/****************************** 用户定义宏 ***********************************/

#define MAIN_Fosc     24000000L   //定义主时钟

#define PWM1_1      0x00    //P:P1.0  N:P1.1
#define PWM1_2      0x01    //P:P0.0  N:P0.1
#define PWM1_3      0x02    //P:P2.0  N:P2.1

#define PWM2_1      0x00    //P:P1.2/P5.4  N:P1.3
#define PWM2_2      0x04    //P:P0.2  N:P0.3
#define PWM2_3      0x08    //P:P2.2  N:P2.3

#define PWM3_1      0x00    //P:P1.4  N:P1.5
#define PWM3_2      0x10    //P:P0.4  N:P0.5
#define PWM3_3      0x20    //P:P2.4  N:P2.5

#define PWM4_1      0x00    //P:P1.6  N:P1.7
#define PWM4_2      0x40    //P:P0.6  N:P0.7
#define PWM4_3      0x80    //P:P2.6  N:P2.7

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80

/*****************************************************************************/


/*************  本地常量声明    **************/

#define PWM_PERIOD  1200    //设置周期值

/*************  本地变量声明    **************/

u16 PWM1_Duty;

void PWM_Config(void);
u8 ReadPWMA(u8 addr)
{
    u8 dat;
    while(HSPWMA_ADR & 0x80);
    HSPWMA_ADR =addr|0x80;
    while(HSPWMA_ADR & 0x80);
    dat=HSPWMA_DAT;
    return dat;
}
void WritePWMA(u8 addr, u8 dat)
{
    while(HSPWMA_ADR & 0x80);
    HSPWMA_DAT= dat;
    HSPWMA_ADR =addr & 0x7f;
}

/********************* 主函数 *************************/
void main(void)
{
    P_SW2 = 0x80;   //扩展寄存器访问使能
        HSPWMA_CFG=0x07;
    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

    PWM1_Duty = 600;
    PWM_Config();
    EA = 1;     //打开总中断
   
    while (1)
    {
    }
}

//========================================================================
// 函数: void PWM_Config(void)
// 描述: PWM 功能配置.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2023-9-6
//========================================================================
void PWM_Config(void)
{
//    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
//    PWMA_CCMR1X = 0x00;//通道1:PWM2模式
//    PWMA_CCMR1 = 0x70;
//    PWMA_CCER1 = 0x55; //配置通道输出使能和极性
        WritePWMA((u8)&PWMA_CCER1,0X00);
        WritePWMA((u8)&PWMA_CCMR1X,0X00);
        WritePWMA((u8)&PWMA_CCMR1,0X70);
        WritePWMA((u8)&PWMA_CCER1,0X55);
   
//    PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间
//    PWMA_ARRL = (u8)PWM_PERIOD;
        WritePWMA((u8)&PWMA_ARRH,PWM_PERIOD>>8);
        WritePWMA((u8)&PWMA_ARRL,PWM_PERIOD);   
   
//    PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
//    PWMA_CCR1L = (u8)(PWM1_Duty);
        WritePWMA((u8)&PWMA_CCR1H,PWM1_Duty>>8);
        WritePWMA((u8)&PWMA_CCR1L,PWM1_Duty);        

//    PWMA_ENO = 0x00;
//    PWMA_ENO |= ENO1P; //使能输出
//    PWMA_ENO |= ENO1N; //使能输出
        WritePWMA((u8)&PWMA_ENO,0x00);
        WritePWMA((u8)&PWMA_ENO,0x00|ENO1P);
        WritePWMA((u8)&PWMA_ENO,0x00|ENO1P);        

//    PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
//    PWMA_PS |= PWM1_1; //选择 PWM1_1 通道
        WritePWMA((u8)&PWMA_PS,0x00);
        WritePWMA((u8)&PWMA_PS,0x00|PWM1_1);            
   
//    PWMA_PSCRH = 0x00;  //预分频器
//    PWMA_PSCRL = 0x00;
        WritePWMA((u8)&PWMA_PSCRH,0x00);
        WritePWMA((u8)&PWMA_PSCRL,0x00);        
//   
//    PWMA_RCR = 0x01;    //重复计数寄存器
//    PWMA_SR1 = 0x00;
//    PWMA_IER = 0x01;
//    PWMA_BKR = 0x80;  //使能主输出
//    PWMA_CR1 |= 0x21; //中心对齐模式1,开始计时
        WritePWMA((u8)&PWMA_RCR,0x01);   
        WritePWMA((u8)&PWMA_SR1,0x00);        
        WritePWMA((u8)&PWMA_IER,0x01);        
        WritePWMA((u8)&PWMA_BKR,0x08);        
        WritePWMA((u8)&PWMA_CR1,0x00|0x21);               
}

/******************* PWM中断函数 ********************/
void PWMA_ISR() interrupt 26
{
    if(PWMA_SR1 & 0X01)
    {
        PWMA_SR1 &=~0X01;       //清标志位

        P32 = !P32;
    }
}


回复 送花

使用道具 举报

该用户从未签到

2

主题

1

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2024-4-28 17:24:41 | 显示全部楼层
HSPWMA_CFG寄存器赋值0x03和0x07都无法运行,且手册上为操作PWMA_PS寄存器,不是很理解。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    前天 08:55
  • 签到天数: 138 天

    [LV.7]常住居民III

    26

    主题

    1325

    回帖

    4127

    积分

    论坛元老

    积分
    4127
    发表于 2024-4-28 18:44:02 | 显示全部楼层
    STC8H系列高速HSPWM测试代码,参考附件

    高速HSPWM1-HSPWM2-HSPWM3-HSPWM4,驱动P1口呼吸灯实验程序.zip

    16.06 KB, 下载次数: 3

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2997

    回帖

    6757

    积分

    超级版主

    积分
    6757
    发表于 2024-4-29 10:46:33 | 显示全部楼层
    01B-STC8H-HSPWMA-4对互补PWM输出P1口.rar (56.88 KB, 下载次数: 2)
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-13 01:41 , Processed in 0.058112 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表