dengziming 发表于 2024-4-28 17:22:55

求一份STC8H2K17U高速HSPWM测试代码

求一份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.0N:P1.1
#define PWM1_2      0x01    //P:P0.0N:P0.1
#define PWM1_3      0x02    //P:P2.0N:P2.1

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

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

#define PWM4_1      0x00    //P:P1.6N:P1.7
#define PWM4_2      0x40    //P:P0.6N:P0.7
#define PWM4_3      0x80    //P:P2.6N: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_PERIOD1200    //设置周期值

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

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;
    }
}


dengziming 发表于 2024-4-28 17:24:41

HSPWMA_CFG寄存器赋值0x03和0x07都无法运行,且手册上为操作PWMA_PS寄存器,不是很理解。

乘风飞扬 发表于 2024-4-28 18:44:02

STC8H系列高速HSPWM测试代码,参考附件

梁工 发表于 2024-4-29 10:46:33


页: [1]
查看完整版本: 求一份STC8H2K17U高速HSPWM测试代码