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
能提供完整的测试项目吗?
附件是我改的#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复制的,复制后没有下载测试,直接改了,使用图片的方式下下载的,改完之后的效果和图片中下载的效果不一样
可能是你的编译器有问题,直接烧录你例子里的hex文件,是P1.5,P1.3输出脉冲信号。
不过我使用keil c51编译器重新编译后,生成的hex文件再烧录到芯片里就正常了,从P1.0,P1.1输出PWM信号。
附件是我用keil重新编译过的,你可以烧录里面的hex文件试试。
页:
[1]