示例#1
0
void  OS_CPU_SysTickInit (CPU_INT32U  cnts)
{
    CPU_INT32U  prio;


    CPU_REG_NVIC_ST_RELOAD = cnts - 1u;

                                                            /* Set SysTick handler prio.                              */
    prio  = CPU_REG_NVIC_SHPRI3;
    prio &= DEF_BIT_FIELD(24, 0);
    prio |= DEF_BIT_MASK(OS_CPU_CFG_SYSTICK_PRIO, 24);

    CPU_REG_NVIC_SHPRI3 = prio;

                                                            /* Enable timer.                                          */
    CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_CLKSOURCE |
                            CPU_REG_NVIC_ST_CTRL_ENABLE;
                                                            /* Enable timer interrupt.                                */
    CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_TICKINT;
}
示例#2
0
void  OS_CPU_SysTickInit (INT32U  cnts)
{
    INT32U  prio;


    OS_CPU_CM4_NVIC_ST_RELOAD = cnts - 1u;

                                                                /* Set SysTick handler prio.                            */
    prio  = OS_CPU_CM4_NVIC_SHPRI3;
    prio &= DEF_BIT_FIELD(24, 0);
    prio |= DEF_BIT_MASK(OS_CPU_CFG_SYSTICK_PRIO, 24);

    OS_CPU_CM4_NVIC_SHPRI3 = prio;

                                                                /* Enable timer.                                        */
    OS_CPU_CM4_NVIC_ST_CTRL |= OS_CPU_CM4_NVIC_ST_CTRL_CLK_SRC |
                               OS_CPU_CM4_NVIC_ST_CTRL_ENABLE;
                                                                /* Enable timer interrupt.                              */
    OS_CPU_CM4_NVIC_ST_CTRL |= OS_CPU_CM4_NVIC_ST_CTRL_INTEN;
}
示例#3
0
CPU_BOOLEAN CSP_TmrOutCmpCfg  (CSP_DEV_NBR    tmr_nbr,
                               CSP_DEV_NBR    pin,
                               CSP_OPT        pin_action,
                               CPU_INT32U     freq)

{
    CSP_TMR_REG  *p_tmr_reg;
    CPU_INT08U    match_nbr;
    CPU_INT32U    match_val;
    CPU_INT32U    per_freq;
    CSP_DEV_NBR   per_nbr;
    CPU_SR_ALLOC();
    
                                                                /* ---------------- ARGUMENTS CHECKING -------------- */
#if (CSP_CFG_ARG_CHK_EN == DEF_ENABLED)
    if (tmr_nbr > CSP_TMR_NBR_01) {
        return (DEF_FAIL);
    }
    
    if (pin > CSP_TMR_PIN_OUT_NBR_03) {
        return (DEF_FAIL);
    }

    if (freq == 0u) {
        return (DEF_FAIL);
    }
#endif
    
    p_tmr_reg = (CSP_TMR_REG *)CSP_TmrAddrTbl[tmr_nbr];
    per_nbr   = (CSP_DEV_NBR  )CSP_TmrPerTbl[tmr_nbr];    
    
    match_nbr = pin,
    per_freq  = CSP_PM_PerClkFreqGet(per_nbr);                  /* Get the peripheral clock.                           */

    if (freq > per_freq) {
        return (DEF_FAIL);
    }

    match_val = ((2u * per_freq / freq) + 1u) / 2u;
    if (match_val == 0u) {
        return (DEF_FAIL);
    }
    
    
    CSP_PM_PerClkEn(per_nbr);                                   /* Enable Peripherical clock.                          */                                                               
    CPU_CRITICAL_ENTER();

    DEF_BIT_CLR(p_tmr_reg->EMR, DEF_BIT_MASK(3u, (2u * match_nbr) + 4u));
        
    switch (pin_action) {
        case CSP_TMR_OPT_PIN_OUT_NONE:
             break;
                              
        case CSP_TMR_OPT_PIN_OUT_CLR:
             DEF_BIT_SET(p_tmr_reg->EMR, DEF_BIT_MASK(1u, (2u * match_nbr) + 4u));
             break;
                         
        case CSP_TMR_OPT_PIN_OUT_SET:
             DEF_BIT_SET(p_tmr_reg->EMR, DEF_BIT_MASK(2u, (2u * match_nbr) + 4u));
             break;
        
        case CSP_TMR_OPT_PIN_OUT_TOGGLE:
             DEF_BIT_SET(p_tmr_reg->EMR, DEF_BIT_MASK(3u, (2u * match_nbr) + 4u));
             break;
             
        default:
             CPU_CRITICAL_EXIT();
             return (DEF_FAIL);            
    }
                                                            /* Disable the Interrupt, Reset and Stop features on   */        
                                                            /* ... Match channel 0, 1, 2 or 3.                     */
    DEF_BIT_CLR(p_tmr_reg->MCR, CSP_TMR_MASK_MCR_MRx(match_nbr));
                                
    DEF_BIT_CLR(p_tmr_reg->TCR, CSP_TMR_MASK_TCR_MODE);     /* Clear the Mode                                      */
    DEF_BIT_SET(p_tmr_reg->TCR, CSP_TMR_BIT_TCR_TMR_MODE);  /* Set the Timer Mode                                  */

    p_tmr_reg->PR             = 0u;                         /* Set the prescaler to 0                              */
    p_tmr_reg->MRx[match_nbr] = match_val;
    p_tmr_reg->TCR            = CSP_TMR_BIT_CR_RST;         /* Reset the timer                                     */
                                                            /* Enable Interrupt and Reset when TC matches MR0, ... */
                                                            /* MR1, MR2, etc                                       */
    DEF_BIT_SET(p_tmr_reg->MCR, CSP_TMR_BIT_MCR_MRIx(match_nbr) | 
                                CSP_TMR_BIT_MCR_MRRx(match_nbr));
    CPU_CRITICAL_EXIT();

    return (DEF_OK);
}
示例#4
0
CPU_BOOLEAN  CSP_TmrCfg (CSP_DEV_NBR   tmr_nbr,
                         CPU_INT32U    freq)
{
    CSP_TMR_REG  *p_tmr_reg;
    CPU_INT32U    match_val;
    CPU_INT32U    per_freq;
    CSP_DEV_NBR   per_nbr;    
    CPU_SR_ALLOC();
    
#if (CSP_CFG_ARG_CHK_EN == DEF_ENABLED)     
    if (tmr_nbr > CSP_TMR_NBR_03) {
        return (DEF_FAIL);
    }
#endif

    
    p_tmr_reg = (CSP_TMR_REG *)CSP_TmrAddrTbl[tmr_nbr];
    per_nbr   = (CSP_DEV_NBR  )CSP_TmrPerTbl[tmr_nbr];    
    
    if (freq == 0u) {                                           /* -------- FREE RUNNING TIMER CONFIGURATION --------- */
        CSP_PM_PerClkEn(per_nbr);                               /* Enable peripheral clock                             */                                                               
        
        CPU_CRITICAL_ENTER();        
        p_tmr_reg->MCR = DEF_BIT_NONE;                          /* Disable theInterrupt, Reset and Stop feauture on    */
                                                                /* ... Match channels.                                 */
        
        DEF_BIT_CLR(p_tmr_reg->TCR, CSP_TMR_MASK_TCR_MODE);     /* Clear the Mode.                                     */
        DEF_BIT_SET(p_tmr_reg->TCR, CSP_TMR_BIT_TCR_TMR_MODE);  /* Set the Timer Mode.                                 */
        
        p_tmr_reg->PR  = 0u;                                    /* Set the prescaler to 0.                             */
        p_tmr_reg->TCR = CSP_TMR_BIT_CR_RST;                    /* Reset the timer.                                    */
        CPU_CRITICAL_EXIT();

    } else {                                                    /* ---------- PERIODIC TIMER CONFIGURATION ----------- */
        per_freq = CSP_PM_PerClkFreqGet(per_nbr);               /* Get the peripheral clock.                           */

        if (freq > per_freq) {
            return (DEF_FAIL);
        }

        match_val = ((2u * per_freq / freq) + 1u) / 2u;
        if (match_val == 0u) {
            return (DEF_FAIL);
        }
        
        
        CSP_PM_PerClkEn(per_nbr);                               /* Enable peripheral clock.                           */                                                               
        CPU_CRITICAL_ENTER();
        DEF_BIT_CLR(p_tmr_reg->EMR, DEF_BIT_MASK(3u, (2u * 0u) + 4u));
        CPU_CRITICAL_EXIT();

                                                                /* Disable the Interrupt, Reset and Stop features on   */        
                                                                /* ... Match channel 0, 1, 2 or 3.                     */
        DEF_BIT_CLR(p_tmr_reg->MCR, CSP_TMR_MASK_MCR_MRx(0u));
                                    
        DEF_BIT_CLR(p_tmr_reg->TCR, CSP_TMR_MASK_TCR_MODE);     /* Clear the Mode                                      */
        DEF_BIT_SET(p_tmr_reg->TCR, CSP_TMR_BIT_TCR_TMR_MODE);  /* Set the Timer Mode                                  */

        p_tmr_reg->PR     = 0u;                                 /* Set the prescaler to 0                              */
        p_tmr_reg->MRx[0] = match_val;
        p_tmr_reg->TCR    = CSP_TMR_BIT_CR_RST;                 /* Reset the timer                                     */
                                                                /* Enable Interrupt and Reset when TC matches MR0, ... */
                                                                /* MR1, MR2, etc                                       */        
        DEF_BIT_SET(p_tmr_reg->MCR, CSP_TMR_BIT_MCR_MRIx(0u) | 
                                    CSP_TMR_BIT_MCR_MRRx(0u));
        CPU_CRITICAL_EXIT();
    }

    return (DEF_OK);
}
示例#5
0
void   BSP_GPIO_Cfg (CPU_INT08U   gpio_port,
                     CPU_INT32U   gpio_pins,     
                     CPU_INT16U   gpio_opt)
{
    BSP_GPIO_FAST_REG  *p_gpio_fast_reg;    
    CPU_REG32          *p_gpio_pinsel;
    CPU_REG32          *p_gpio_pinmode;  
    CPU_REG32          *p_gpio_pinmode_od;  
    
    CPU_INT32U          pinsel_opt;
    CPU_INT32U          pinmode_opt;
    CPU_INT32U          pin_nbr;
    
    
    switch (gpio_port) {
        case BSP_GPIO_PORT0_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT0_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x00);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x00);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD0_BASE_ADDR);
             break;

        case BSP_GPIO_PORT1_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT1_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x08);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x08);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD1_BASE_ADDR);
             break;

        case BSP_GPIO_PORT2_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT2_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x10);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x10);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD2_BASE_ADDR);
             
             break;

        case BSP_GPIO_PORT3_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT3_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x18);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x18);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD3_BASE_ADDR);
             
             break;

        case BSP_GPIO_PORT4_FAST:
             p_gpio_fast_reg   = (BSP_GPIO_FAST_REG *)(BSP_GPIO_REG_PORT4_FAST_BASE_ADDR); 
             p_gpio_pinsel     = (CPU_REG32         *)(BSP_GPIO_REG_PINSEL_BASE_ADDR  + 0x20);
             p_gpio_pinmode    = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_BASE_ADDR + 0x20);
             p_gpio_pinmode_od = (CPU_REG32         *)(BSP_GPIO_REG_PINMODE_OD4_BASE_ADDR);
             break;

        case BSP_GPIO_PORT0:
        case BSP_GPIO_PORT1:             
        default:
             return;
    }

                                                                /* ------------ I/O DIRECTION CONFIGURATION ----------- */
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_OUT_EN)) {
        DEF_BIT_SET(p_gpio_fast_reg->FIODIR, gpio_pins);
    }
    
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_IN_EN)) {
        DEF_BIT_CLR(p_gpio_fast_reg->FIODIR, gpio_pins);
    }            
        
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_RD_WR_EN)) {
        DEF_BIT_CLR(p_gpio_fast_reg->FIOMASK, gpio_pins);
    }            
    
    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_RD_WR_DIS)) {
        DEF_BIT_SET(p_gpio_fast_reg->FIOMASK, gpio_pins);
    }            

                
                                                                /* ---- I/O MODE/PERIPHERAL FUNCTION CONFIGURATION ---- */
    pinsel_opt  = BSP_GPIO_OPT_FNCT_INVALID;                   
    pinmode_opt = BSP_GPIO_OPT_MODE_INVALID;
                                                                /* Set PINSELxx based on BSP_GPIO_OPT_FNCT_xxx          */
    if (DEF_BIT_IS_SET_ANY(gpio_opt, BSP_GPIO_OPT_FNCT_ANY)) {
        if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_1)) {
            pinsel_opt = 0x00;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_2)) {
            pinsel_opt = 0x01;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_3)) {
            pinsel_opt = 0x02;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_FNCT_4)) {
            pinsel_opt = 0x03;
        } else {
            return;
        }
    }

                                                                /* Set PMODExx based on BSP_GPIO_OPT_MDOE_xxx         */
    if (DEF_BIT_IS_SET_ANY(gpio_opt, BSP_GPIO_OPT_MODE_ANY)) {
        if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_PULLUP)) {
            pinmode_opt = 0x00;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_REPEATER)) {
            pinmode_opt = 0x01;            
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_NONE)) {
            pinmode_opt = 0x02;
        } else if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_PULLDOWN)) {
            pinmode_opt = 0x03;
        }
    }
    
    if ((pinsel_opt != BSP_GPIO_OPT_FNCT_INVALID) ||
        (pinmode_opt  != BSP_GPIO_OPT_MODE_INVALID)) {
        for (pin_nbr = 0; pin_nbr < 32; pin_nbr++) {
            if (DEF_BIT_IS_SET(gpio_pins, DEF_BIT(pin_nbr))) {
                
                if (pinsel_opt != BSP_GPIO_OPT_FNCT_INVALID) {
                    if (pin_nbr < 16) {
                        DEF_BIT_CLR(*p_gpio_pinsel, DEF_BIT_FIELD(2, pin_nbr * 2));
                        DEF_BIT_SET(*p_gpio_pinsel, DEF_BIT_MASK(pinsel_opt, pin_nbr * 2));
                    } else {
                        DEF_BIT_CLR(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinsel + 0x04)), DEF_BIT_FIELD(2, (pin_nbr - 16) * 2));
                        DEF_BIT_SET(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinsel + 0x04)), DEF_BIT_MASK(pinsel_opt, (pin_nbr - 16) * 2));
                    }
                }
        
                if (DEF_BIT_IS_SET(gpio_pins, DEF_BIT(pin_nbr))) {
                    if (pinmode_opt != BSP_GPIO_OPT_MODE_INVALID) {
                        if (pin_nbr < 16) {                        
                            DEF_BIT_CLR(*p_gpio_pinmode, DEF_BIT_FIELD(2, pin_nbr * 2));
                            DEF_BIT_SET(*p_gpio_pinmode, DEF_BIT_MASK(pinmode_opt, pin_nbr * 2));
                        } else {
                            DEF_BIT_CLR(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinmode + 0x04)), DEF_BIT_FIELD(2, (pin_nbr - 16) * 2));
                            DEF_BIT_SET(*((CPU_REG32 *)((CPU_INT32U)p_gpio_pinmode + 0x04)), DEF_BIT_MASK(pinmode_opt, (pin_nbr - 16) * 2));
                        }
                    }
                }
            }
        }
    }

    if (DEF_BIT_IS_SET(gpio_opt, BSP_GPIO_OPT_MODE_OPEN_DRAIN)) {
        *p_gpio_pinmode_od = gpio_pins;
    }
}