bleSDK_expansion_board/examples/pwcTest/src/main.c

146 lines
3.4 KiB
C

/**
****************************************************************************************
*
* @file main.c
*
* @brief Main Entry of the application.
*
****************************************************************************************
*/
#include "b6x.h"
#include "drvs.h"
#include "regs.h"
#include "dbg.h"
/*
* DEFINES
****************************************************************************************
*/
#define PA_RET_SEE1 (2)
#define PA_RET_SEE2 (3)
#define PA_SOFT_PWM (4)
#if (CTMR_USED)
#define PWC_TMR (PWM_CTMR)
#define PWC_TMR_CH(n) (PWM_CTMR_CH##n)
#define PWC_IRQc (CTMR_IRQn)
#define PA_PWC_CH1 (15)
#define PA_PWC_CH2 (16)
#else
#define PWC_TMR (PWM_ATMR)
#define PWC_TMR_CH(n) (PWM_ATMR_CH##n##P)
#define PWC_IRQc (ATMR_IRQn)
#define PA_PWC_CH1 (7)
#define PA_PWC_CH2 (8)
#endif
#define TIMER_INT_CH1_BIT (0x02U)
#define TIMER_INT_CH2_BIT (0x04U)
#define TIMER_INT_CH3_BIT (0x08U)
#define TIMER_INT_CH4_BIT (0x10U)
/*
* FUNCTIONS
****************************************************************************************
*/
#if (CTMR_USED)
void CTMR_IRQHandler(void)
{
uint32_t iflg = CTMR->IFM.Word;
if (iflg & TIMER_INT_CH1_BIT) // ch1 interrupt
{
GPIO_DAT_SET(1 << PA_RET_SEE1);
CTMR->ICR.CC1I = 1;
GPIO_DAT_CLR(1 << PA_RET_SEE1 | (1 << PA_SOFT_PWM));
}
if (iflg & TIMER_INT_CH2_BIT) // ch2 interrupt
{
GPIO_DAT_SET(1 << PA_RET_SEE2 | (1 << PA_SOFT_PWM));
CTMR->ICR.CC2I = 1;
GPIO_DAT_CLR(1 << PA_RET_SEE2);
}
}
#else
void ATMR_IRQHandler(void)
{
uint32_t iflg = ATMR->IFM.Word;
if (iflg & TIMER_INT_CH1_BIT) // ch1 interrupt
{
GPIO_DAT_SET(1 << PA_RET_SEE1);
ATMR->ICR.CC1I = 1;
GPIO_DAT_CLR(1 << PA_RET_SEE1 | (1 << PA_SOFT_PWM));
}
if (iflg & TIMER_INT_CH2_BIT) // ch2 interrupt
{
GPIO_DAT_SET(1 << PA_RET_SEE2 | (1 << PA_SOFT_PWM));
ATMR->ICR.CC2I = 1;
GPIO_DAT_CLR(1 << PA_RET_SEE2);
}
}
#endif
static void pwcTest(void)
{
// init PADs
GPIO_DAT_CLR((1 << PA_RET_SEE1) | (1 << PA_RET_SEE2) | (1 << PA_SOFT_PWM) | (1 << PA_PWC_CH1) | (1 << PA_PWC_CH2));
GPIO_DIR_SET((1 << PA_RET_SEE1) | (1 << PA_RET_SEE2) | (1 << PA_SOFT_PWM));
GPIO_DIR_CLR((1 << PA_PWC_CH1) | (1 << PA_PWC_CH2));
iom_ctrl(PA_PWC_CH1, IOM_PULLDOWN | IOM_INPUT | IOM_SEL_TIMER);
iom_ctrl(PA_PWC_CH2, IOM_PULLDOWN | IOM_INPUT | IOM_SEL_TIMER);
// init pwm timer
pwm_init(PWC_TMR, 0, UINT16_MAX);
// pwc_chnl config
pwm_chnl_cfg_t chnl_cfg;
chnl_cfg.duty = 0;
chnl_cfg.ccmr = PWC_CCMR_MODE(1, 3, PWC_PSC0);
chnl_cfg.ccer = PWC_CCER_NEGEDGE;
pwm_chnl_set(PWC_TMR_CH(1), &chnl_cfg);
chnl_cfg.ccer = PWC_CCER_POSEDGE;
pwm_chnl_set(PWC_TMR_CH(2), &chnl_cfg);
// start with SMCR.TS=5(TI1FP1), SMCR.SMS=4(reset mode)
pwm_conf(PWC_TMR, 0x54, TIMER_INT_CH1_BIT | TIMER_INT_CH2_BIT);
pwm_start(PWC_TMR);
// interrupt enable
NVIC_EnableIRQ(PWC_IRQc);
__enable_irq();
}
static void sysInit(void)
{
// Todo config, if need
}
static void devInit(void)
{
iwdt_disable();
dbgInit();
debug("PWC Test...\r\n");
}
int main(void)
{
sysInit();
devInit();
pwcTest();
while (1);
}