📄 pwm.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 + -