/*******************************************************
*Copyright(C),2020,Shanghai Eastsoft Microelectronics Co.,Ltd.
*文件名：compare_onepulse_output.c
*作  者：AE Team
*版  本：v1.0，编译于iDesigner(v4.2.3.166) + 工具链HRCC(v1.2.0.106)
*日  期：2020/12/18
*描  述：多功能定时器单脉冲输出模式，在T31_CH2(PB6)的上升沿时刻延时1ms后，T31_CH1(PB5)产生一个持续0.5ms的宽脉冲
*备  注：本软件仅供学习和演示使用，对用户直接引用代码所带来的风险或后果不承担任何法律责任。
*******************************************************/
#include <hic.h>

#define CLRWDT()   {__Asm CWDT;}        //宏定义清狗指令

/******************************************************
函数名：void RAMclear(void)
描  述：RAM区数据清零，RAM区地址0x0000~0x03FF
输入值：无
输出值：无
返回值：无
*******************************************************/
void RAMclear(void)
{
    for (IAAH = 0; IAAH <= 0x03; IAAH++)
    {
        for (IAAL = 0; IAAL < 0xFF; IAAL++)
            IAD = 0x00;

        IAD = 0x00;
    }
}

/******************************************************
函数名：void GPIOInit(void)
描  述：首先初始化所有未用到的IO口为输出低电平
输入值：无
输出值：无
返回值：无
*******************************************************/
void GPIOInit(void)
{
    ANSH = 0xFF;        //选择对应端口为数字IO功能
    ANSL = 0xFF;        //选择对应端口为数字IO功能
    PAT = 0x00;         //所有IO设为输出低电平
    PBT = 0x00;
    PCT = 0x00;
    PA = 0x00;
    PB = 0x00;
    PC = 0x00;

    PBT6 = 1;                  //T31_CH2设为输入
    PBPD6 = 1;                 //使能下拉
}

/*******************************************************
函数名：void main(void)
描  述：主函数，单脉冲模式，在T31_CH2(PB6)的上升沿时刻延时1ms后，T31_CH1(PB5)产生一个持续0.5ms的宽脉冲
输入值：无
输出值：无
返回值：无
*******************************************************/
void main(void)
{
    RAMclear();
    GPIOInit();
    //T31C0H = 0x00;
    T31C0L = 0x88;         //选择单脉冲模式，向上计数，使能T31CNTLD缓冲功能
    T31CH2C = 0x01;        //T31_CH2作为通道2的捕捉管脚，无滤波，无预分频
    T31CH1C = 0x78;        //pwm模式2，通道1配置为输出，使能T31CH1R缓冲功能
    //T31PINCH = 0x00;      //通道3、通道4捕捉使能寄存器
    T31PINCL = 0x01;      //通道2上升沿有效。通道1高电平有效，使能输出
    T31C2L = 0x66;        //通道2作为触发输入(TRGI)，TRGI上升沿启动计数器
    T31PRSH = 0x00;       //预分频系数1:16
    T31PRSL = 0x0F;
    T31CNTLDH = 0x05;     //重装载值，脉冲宽度=(T31CNTLD-T31CH1R) * 预分频后的时钟周期
    T31CNTLDL = 0xDC;
    T31CH1RH = 0x03;      //比较寄存器1值，触发时至脉冲产生的延时时间=T31CNTLD * 预分频后的时钟周期
    T31CH1RL = 0xE8;
    UPT = 1;        //立即更新所有缓冲寄存器
    CHOE = 1;       //输出使能

    //T31EN = 1;      //单脉冲模式，硬件自动设置T31EN = 1
    while (1)
    {
        CLRWDT();
    }
}