⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 嵌入式系统
💻 C
字号:
/*-----------------------------------------------------------------------------
@@
@@ Copyright (c) 2001 Sharp Corporation All rights reserved.
@@
@@ (Summary)    : PWM driver source file
@@
@@ (Comment)    :
@@
@@ (Author)     : Kazuko FUKUDA
@@
@@ (History)    : 2001/1/15
@@                2001/1/17     K.FUKUDA    reflect result of code review version
@@                2001/2/13     K.FUKUDA    Modified calculation of address
@@                2001/06/05    Tan WK      Version 2.0 with LH79532 support
@@                2001/08/31    Teo LL      Version 3.0 with LH79533 support
@@
@@ (RCS ID) :
@@
-----------------------------------------------------------------------------*/

#define APD_PWM_C

/*+include files*************************************************************/
/*                                                                          */
/*                                                                          */
/****************************************************************************/
#include "pwm.h"

/******************************************************************************
@@
@@ [Name]       : apd_PWMInit
@@
@@ [Summary]    : Initialize PWM
@@
@@ [Argument]   : pwminit:  The structure of PWM's setup value
@@
@@ [Return]     : None
@@
@@ [Desc]       : Initialize PWM according to the argument, pwminit.
@@                It will set the PWM's clock divider, terminal count, duty cycle,
@@                output inversion and synchronous mode of the specified channel.
@@                If and only if speicfy channel is 0, set the clock select.
@@
@@ [History]    : 2001/1/17     Kazuko FUKUDA
@@                2001/2/13     Kazuko FUKUDA
@@                2001/06/05    Tan WK
@@                2001/08/31    Teo LL          Version 3.0 No change
@@
@@ [END]
@@
******************************************************************************/

APD_VOID apd_PWMInit(APD_PWMINIT *pwminit)
{
    APD_ULONG   base;

    base = APD_PWMBASE + pwminit->ch * APD_PWM_CH_OFST;

    *((volatile APD_USHORT *)(base + APD_PWM_DIV_OFST)) = (APD_USHORT)pwminit->div;

    *((volatile APD_USHORT *)(base + APD_PWM_TC_OFST)) = (APD_USHORT)pwminit->tc;

    *((volatile APD_USHORT *)(base + APD_PWM_DC_OFST)) = (APD_USHORT)pwminit->dc;

    *((volatile APD_USHORT *)(base + APD_PWM_INV_OFST)) = (APD_USHORT)pwminit->inv;

    if (!(pwminit->ch))
        *((volatile APD_USHORT *)(base + APD_PWM_SYNC_OFST)) = (APD_USHORT)(pwminit->mode | pwminit->sel);
    else
        *((volatile APD_USHORT *)(base + APD_PWM_SYNC_OFST)) = (APD_USHORT)pwminit->mode;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMEnable
@@
@@ [Summary]    : Start the selected PWM channel.
@@
@@ [Argument]   : ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Start the corresponding PWM channel
@@
@@ [History]    :

@@ [END]
******************************************************************************/
APD_VOID apd_PWMEnable(APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_ENB_OFST))
    = (APD_USHORT)APD_PWM_ENABLE;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMDisable
@@
@@ [Summary]    : Stop the selected PWM channel.
@@
@@ [Argument]   : ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Stop the corresponding PWM channel.
@@
@@ [History]    :Date       Modifier            Comment
@@               2001/1/17  Kazuko FUKUDA
@@               2001/2/13  Kazuko FUKUDA   Modified calculation address
@@               2001/6/05  Tan WK          Version 2.0 No change
@@               2001/08/31 Teo LL          Version 3.0 No change
@@
@@ [END]
******************************************************************************/
APD_VOID apd_PWMDisable(APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_ENB_OFST))
    = (APD_USHORT)APD_PWM_DISABLE;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMSetTc
@@
@@ [Summary]    : Set the selected PWM's TC.
@@
@@ [Argument]   : tc:   Clock periods of 1 pulse.
@@                (tc = f(SYSCLK)/[div*f(PWM)]-1)
@@
@@                ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Set the selected PWM's TC.
@@
@@ [History]    :Date       Modifier            Comment
@@               2001/1/17  Kazuko FUKUDA
@@               2001/2/13  Kazuko FUKUDA   Modified calculation address
@@               2001/6/05  Tan WK          Version 2.0 No change
@@               2001/08/31 Teo LL          Version 3.0 No change
@@
@@ [END]
******************************************************************************/
APD_VOID apd_PWMSetTc(APD_USHORT tc, APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_TC_OFST))
    = (APD_USHORT)tc;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMSetDc
@@
@@ [Summary]    : Set the selected PWM's DC.
@@
@@ [Argument]   : dc:   Clock periods of duty.
@@                (dc=DutyCycle*(tc+1))
@@
@@                ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Set the selected PWM's DC.
@@
@@ [History]    :Date       Modifier            Comment
@@               2001/1/17  Kazuko FUKUDA
@@               2001/2/13  Kazuko FUKUDA   Modified calculation address
@@               2001/6/05  Tan WK          Version 2.0 No change
@@               2001/08/31 Teo LL          Version 3.0 No change
@@
@@ [END]
******************************************************************************/
APD_VOID apd_PWMSetDc(APD_USHORT dc, APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_DC_OFST))
    = (APD_USHORT)dc;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMSetDiv
@@
@@ [Summary]    : Set the selected PWM's DIV
@@
@@ [Argument]   : div:  Divider of SYSCLOCK (<= 62)
@@
@@                ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Set the selected PWM's DIV
@@
@@ [History]    :Date       Modifier            Comment
@@               2001/1/17  Kazuko FUKUDA
@@               2001/2/13  Kazuko FUKUDA   Modified calculation address
@@               2001/6/05  Tan WK          Version 2.0 No change
@@               2001/08/31 Teo LL          Version 3.0 No change
@@
@@ [END]
******************************************************************************/
APD_VOID apd_PWMSetDiv(APD_UCHAR div, APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_DIV_OFST))
    = (APD_USHORT)div;
}

/******************************************************************************
@@
@@ [Name]       : apd_PWMSetInv
@@
@@ [Summary]    : Set the selected PWM's output signal
@@
@@ [Argument]   : inv:  specify the type of PWM's output signal.
@@                APD_PWM_NORMAL_OUTPUT for normal ouput signal
@@                APD_PWM_INVERT_OUTPUT for inverted output signal
@@
@@                ch:   specify which PWM channel
@@                APD_PWM_CH0 for PWM channel 0
@@                APD_PWM_CH1 for PWM channel 1
@@                APD_PWM_CH2 for PWM channel 2
@@                APD_PWM_CH3 for PWM channel 3
@@
@@ [Return]     : None
@@
@@ [Desc]       : Set the selected PWMxINV.
@@
@@ [History]    :Date       Modifier            Comment
@@               2001/1/17  Kazuko FUKUDA
@@               2001/2/13  Kazuko FUKUDA   Modified calculation address
@@               2001/6/05  Tan WK          Version 2.0 No change
@@               2001/08/31 Teo LL          Version 3.0 No change
@@
@@ [END]
******************************************************************************/
APD_VOID apd_PWMSetInv(APD_PWM_OUTPUT inv, APD_PWM_CHANNEL ch)
{
    *((volatile APD_USHORT *)(APD_PWMBASE + ch * APD_PWM_CH_OFST + APD_PWM_INV_OFST))
    = (APD_USHORT)inv;
}


/* ---------- end of file 'apd_pwm.c' ---------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -