|
求一份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;
}
}
|
|