liuyuhe 发表于 2024-7-6 23:48:39

STC-ISP例程中复制代码和直接下载效果不一致

使用STC8H2K08U在STCAI-ISP(V6.94E)软件里《STC8H系列-带死区控制的PWM互补对称输出-C》例程中使用“直接下载HEX”后效果如图(直接下载),更改代码后效果如(更改后),频率为24MHZ,测量引脚为P10(黄),P11(红)。移相引脚好像没有配置为什么也有输出呢?PS5(黄),PS6(红)
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Demo --------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/
/* If you want to use the program or the program referenced in the*/
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/


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

#include        "STC8Hxxx.h"

/*************        功能说明        **************

先别修改程序, 直接下载"pwm.hex"测试, 下载时选择主频24MHz.
如果启动外部晶振, 请接24MHz的晶振. 如果接12MHz晶振, PWM配置函数要相应修改USBCLK设置.

使用高速PWM(HSPWM)方式操作PWMAPS5、PWMAPS6.
PWM时钟选择PLL时钟144MHz, PWM周期为2400个时钟,PWM频率为60KHz.

例子输出IO:
PWMAPS6PWMAPS5
P1.5   P1.3


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


void PWMA_config(void);
void GPIO_config(void);


/******************** 主函数 **************************/
void main(void)
{
        P_SW2 |= 0x80;                //SFR enable
       
        GPIO_config();
        PWMA_config();

        while (1)
        {
                NOP(8);
        }
}


void delay()
{
        u16        i;
        for        (i=0; i<100; i++);
}
void GPIO_config(void)
{
        P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x2b; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;

}


void PWMA_ISR() interrupt 26
{
    if( PWMA_SR1 & 0X02)
    {
//       P03 = ~P03;
         PWMA_SR1 &=~0X02;
    }
}

//========================================================================
// 函数: void PWMA_config(void)
// 描述: PWM配置函数。
// 参数: noe.
// 返回: none.
// 版本: V1.0, 2022-3-15
// 备注:
//========================================================================
void PWMA_config(void)
{
        P_SW2 |= 0x80;                //SFR enable

        PWMA_ENO = 0x01 + 0x02;                                                //输出使能寄存器,P10,P11
        PWMA_ENO = 0XFF;
    PWMA_PS = 0x00;                           //引脚切换

/**********************************************************
PWMx_duty = *100
***********************************************************/
        PWMA_PSCRH = 0x00;                                                                //预分频器高
        PWMA_PSCRL = 0x00;                                                                //预分频器低
        PWMA_DTR = 0x00;                                                                //死区时间配置                        1195页

        PWMA_CCMR1 = 0X68;                                                               //通道模式配置
        PWMA_CCMR2 = 0X68;
        PWMA_CCMR3 = 0X68;
        PWMA_CCMR4 = 0X68;

        PWMA_ARRH = 0X80;                                                        //自动重装载寄存器,计数器overflow点
        PWMA_ARRL = 0X00;

        PWMA_CCR1H = 0X04;                                                        //计数器比较值
        PWMA_CCR1L = 0X00;
        PWMA_CCR2H = 0X02;
        PWMA_CCR2L = 0X00;
        PWMA_CCR3H = 0X01;
        PWMA_CCR3L = 0X00;
        PWMA_CCR4H = 0X01;
        PWMA_CCR4L = 0X00;

        PWMA_CCER1 = 0X55;                                                        //配置通道输出使能和极性
        PWMA_CCER2 = 0X55;

        PWMA_BKR = 0X80;                                                        //主输出使能 相当于总开关
        PWMA_IER = 0X02;                                                        //使能中断
        PWMA_CR1 = 0X01;                                                        //使能计数器

    EA = 1;
    while (1);
}


乘风飞扬 发表于 2024-7-8 09:29:40

能提供完整的测试项目吗?

liuyuhe 发表于 2024-7-8 21:22:43

乘风飞扬 发表于 2024-7-8 09:29
能提供完整的测试项目吗?

附件是我改的#include "reg51.h"
#include "intrins.h"

typedef struct TIM1_struct
{
    volatile unsigned char CR1;   /*!< control register 1 */
    volatile unsigned char CR2;   /*!< control register 2 */
    volatile unsigned char SMCR;    /*!< Synchro mode control register */
    volatile unsigned char ETR;   /*!< external trigger register */
    volatile unsigned char IER;   /*!< interrupt enable register*/
    volatile unsigned char SR1;   /*!< status register 1 */
    volatile unsigned char SR2;   /*!< status register 2 */
    volatile unsigned char EGR;   /*!< event generation register */
    volatile unsigned char CCMR1;   /*!< CC mode register 1 */
    volatile unsigned char CCMR2;   /*!< CC mode register 2 */
    volatile unsigned char CCMR3;   /*!< CC mode register 3 */
    volatile unsigned char CCMR4;   /*!< CC mode register 4 */
    volatile unsigned char CCER1;   /*!< CC enable register 1 */
    volatile unsigned char CCER2;   /*!< CC enable register 2 */
    volatile unsigned char CNTRH;   /*!< counter high */
    volatile unsigned char CNTRL;   /*!< counter low */
    volatile unsigned char PSCRH;   /*!< prescaler high */
    volatile unsigned char PSCRL;   /*!< prescaler low */
    volatile unsigned char ARRH;    /*!< auto-reload register high */
    volatile unsigned char ARRL;    /*!< auto-reload register low */
    volatile unsigned char RCR;   /*!< Repetition Counter register */
    volatile unsigned char CCR1H;   /*!< capture/compare register 1 high */
    volatile unsigned char CCR1L;   /*!< capture/compare register 1 low */
    volatile unsigned char CCR2H;   /*!< capture/compare register 2 high */
    volatile unsigned char CCR2L;   /*!< capture/compare register 2 low */
    volatile unsigned char CCR3H;   /*!< capture/compare register 3 high */
    volatile unsigned char CCR3L;   /*!< capture/compare register 3 low */
    volatile unsigned char CCR4H;   /*!< capture/compare register 3 high */
    volatile unsigned char CCR4L;   /*!< capture/compare register 3 low */
    volatile unsigned char BKR;   /*!< Break Register */
    volatile unsigned char DTR;   /*!< dead-time register */
    volatile unsigned char OISR;    /*!< Output idle register */
}TIM1_TypeDef;

#define TIM1_BaseAddress    0xFEC0

#define TIM1      ((TIM1_TypeDef xdata*)TIM1_BaseAddress)
#define PWMA_ENO    (*(unsigned char volatile xdata *)0xFEB1)
#define PWMA_PS   (*(unsigned char volatile xdata *)0xFEB2)

sfr   P0M0    =   0x94;
sfr   P0M1    =   0x93;
sfr   P1M0    =   0x92;
sfr   P1M1    =   0x91;
sfr   P3M0    =   0xb2;
sfr   P3M1    =   0xb1;
sfr   P_SW2   =   0xba;

sbit    P03   =   P0^3;

void main(void)
{
    P_SW2 = 0x80;

    P0M1 = 0x00;
    P0M0 = 0xFF;
    P1M1 = 0x00;
    P1M0 = 0xFF;

    PWMA_ENO = 0xFF;                            //IO输出PWM
    PWMA_PS = 0x00;                           //00:PWM at P1

/**********************************************************
PWMx_duty = *100
***********************************************************/
    TIM1-> PSCRH = 0x00;                        //预分频寄存器
    TIM1-> PSCRL = 0x00;
    TIM1-> DTR = 0x00;                        //死区时间配置

    TIM1-> CCMR1 = 0x68;                        //通道模式配置
    TIM1-> CCMR2 = 0x68;
    TIM1-> CCMR3 = 0x68;
    TIM1-> CCMR4 = 0x68;

    TIM1-> ARRH = 0x08;                         //自动重装载寄存器,计数器overflow点
    TIM1-> ARRL = 0x00;

    TIM1-> CCR1H = 0x04;                        //计数器比较值
    TIM1-> CCR1L = 0x00;
    TIM1-> CCR2H = 0x02;
    TIM1-> CCR2L = 0x00;
    TIM1-> CCR3H = 0x01;
    TIM1-> CCR3L = 0x00;
    TIM1-> CCR4H = 0x01;
    TIM1-> CCR4L = 0x00;

    TIM1-> CCER1 = 0x55;                        //配置通道输出使能和极性
    TIM1-> CCER2 = 0x55;                        //配置通道输出使能和极性

    TIM1-> BKR = 0x80;                        //主输出使能 相当于总开关
    TIM1-> IER = 0x02;                        //使能中断
    TIM1-> CR1 = 0x01;                        //使能计数器

    EA = 1;
    while (1);
}

void PWMA_ISR() interrupt 26
{
    if(TIM1->SR1 & 0X02)
    {
      P03 = ~P03;
      TIM1->SR1 &=~0X02;
    }
}

这是从isp复制的,复制后没有下载测试,直接改了,使用图片的方式下下载的,改完之后的效果和图片中下载的效果不一样

乘风飞扬 发表于 2024-7-9 09:24:28

可能是你的编译器有问题,直接烧录你例子里的hex文件,是P1.5,P1.3输出脉冲信号。
不过我使用keil c51编译器重新编译后,生成的hex文件再烧录到芯片里就正常了,从P1.0,P1.1输出PWM信号。
附件是我用keil重新编译过的,你可以烧录里面的hex文件试试。
页: [1]
查看完整版本: STC-ISP例程中复制代码和直接下载效果不一致