#include "Main.h"

#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         ENO5P                                   0x01
#define         ENO6P                                   0x04
#define         ENO7P                                   0x10
#define         ENO8P                                   0x40

void Test_InitPWMA()
{
    PWMA_CR1    = 0;
    PWMA_CR2    = 0;
        
	PWMA_CCER1  = 0;
	PWMA_CCER2  = 0;
	PWMA_SR1    = 0;
	PWMA_SR2    = 0;
	PWMA_CCMR1  = 0;
	PWMA_CCMR2  = 0;
	PWMA_CCMR3  = 0;
	PWMA_CCMR4  = 0;
	PWMA_ENO    = 0;
	PWMA_PS     = 0;
	PWMA_IER    = 0;

    PWMA_DTR    = 0;                  //死区时间配置
    PWMA_PSCR   = 2;                  //预分频寄存器, PWM时钟频率为14.7456MHz
    PWMA_ARR    = 0xFFFF;			// 自动重装载寄存器,  控制PWM周期

	PWMA_CCMR1  = (3 << 4);	
	PWMA_CCER1 |= 0x01;			// 开启比较输出, 高电平有效
	PWMA_PS    |= 0x00;			
	PWMA_ENO   |= ENO1P;			

	PWMA_CCMR2  = (3 << 4);			// 通道1模式配置, 禁止预装载. 0: 无输出, 1:匹配时输出高, 2:匹配时输出低, 3:匹配时输出翻转.
	PWMA_CCER1 |= 0x10;			// 开启比较输出, 高电平有效
	PWMA_PS    |= 0x00;			
	PWMA_ENO   |= ENO2P;			


	PWMA_CCMR3  = (3 << 4);		// 通道1模式配置, 禁止预装载. 0: 无输出, 1:匹配时输出高, 2:匹配时输出低, 3:匹配时输出翻转.
	PWMA_CCER2 |= 0x01;			// 开启比较输出, 高电平有效
	PWMA_PS    |= 0x00;	
	PWMA_ENO   |= ENO3P;			

	PWMA_EGR    = 0x01;		//产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
	PWMA_BKR    = 0x80;		//主输出使能 相当于总开关

    // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
	// 不产生计数器更新事件
	PWMA_CR1    = b0 + b1;		// PWMA_ISR_En = PWMA_IER;	//设置标志允许通道1~4中断处理

    IP2 |= b2;
    IP2H |= b2; //PWMA 优先级最高    

    PWMA_IER |= (b1 + b2 + b3);
}

//[A1]轴 当前点位脉冲输出的下一次的CCR装载值
extern uint A1__PPO_wNextCCR__;

//[A2]轴 当前点位脉冲输出的下一次的CCR装载值
extern uint A2__PPO_wNextCCR__;

//[A3]轴 当前点位脉冲输出的下一次的CCR装载值
extern uint A3__PPO_wNextCCR__;

void PWMA_ISR(void) interrupt PWMA_VECTOR using 1 
{
    uchar sr1;
_push_(DPS);
    DPS = 0;
    sr1 = PWM1_SR1;
    PWM1_SR1 = 0;
    PWM1_SR2 = 0;
    if (sr1 & b1) {
        A1__PPO_wNextCCR__ += 922;
        PWMA_CCR1 = A1__PPO_wNextCCR__; 
    }
    if (sr1 & b2) {
        A2__PPO_wNextCCR__ += 7373;
        PWMA_CCR2 = A2__PPO_wNextCCR__; 
    }
    if (sr1 & b3) {
        A3__PPO_wNextCCR__ += 2458;
        PWMA_CCR3 = A3__PPO_wNextCCR__; 
    }
_pop_(DPS);    
}    