freescale
来自「Freescale 系列单片机常用模块与综合系统设计」· 代码 · 共 321 行
TXT
321 行
/** ###################################################################
** THIS COMPONENT MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT.
** Filename : PWM_5mS.C
** Project : line_following_car
** Processor : MC9S08JM60CLHE
** Component : PWM
** Version : Component 02.211, Driver 01.24, CPU db: 3.00.046
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2010-1-19, 19:33
** Abstract :
** This bean implements a pulse-width modulation generator
** that generates signal with variable duty and fixed cycle.
** Settings :
** Used output pin :
** ----------------------------------------------------
** Number (on package) | Name
** ----------------------------------------------------
** 15 | PTE2_TPM1CH0
** ----------------------------------------------------
**
** Timer name : TPM1 [16-bit]
** Counter : TPM1CNT [$0021]
** Mode register : TPM1SC [$0020]
** Run register : TPM1SC [$0020]
** Prescaler : TPM1SC [$0020]
** Compare register : TPM1C0V [$0026]
** Flip-flop register : TPM1C0SC [$0025]
**
** User handling procedure : not specified
**
** Port name : PTE
** Bit number (in port) : 2
** Bit mask of the port : $0004
** Port data register : PTED [$0008]
** Port control register : PTEDD [$0009]
**
** Initialization:
** Output level : low
** Timer : Enabled
** Event : Enabled
** High speed mode
** Prescaler : divide-by-4
** Clock : 12000000 Hz
** Initial value of period pulse width
** Xtal ticks : 60000 6000
** microseconds : 5000 500
** milliseconds : 5 0
** seconds (real) : 0.005 0.0005
**
** Contents :
** Enable - byte PWM_5mS_Enable(void);
** Disable - byte PWM_5mS_Disable(void);
** SetRatio16 - byte PWM_5mS_SetRatio16(word Ratio);
** SetDutyUS - byte PWM_5mS_SetDutyUS(word Time);
** SetDutyMS - byte PWM_5mS_SetDutyMS(word Time);
**
** Copyright : 1997 - 2009 Freescale Semiconductor, Inc. All Rights Reserved.
**
** http : www.freescale.com
** mail : support@freescale.com
** ###################################################################*/
/* MODULE PWM_5mS. */
#include "PE_Error.h"
#include "PWM_5mS.h"
#pragma MESSAGE DISABLE C5703 /* WARNING C5703: Parameter _ declared in function _ but not referenced */
#pragma MESSAGE DISABLE C2705 /* WARNING C2705: Possible loss of data */
#pragma MESSAGE DISABLE C5919 /* WARNING C5919: Conversion of floating to unsigned integral */
static word RatioStore; /* Ratio of L-level to H-level */
/* Internal method prototypes */
/*
** ===================================================================
** Method : SetRatio (component PWM)
**
** Description :
** The method stores duty value to compare register(s) and sets
** necessary bits or (in List mode) call SetReg method for duty
** value storing.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetRatio(void);
/* End of Internal methods declarations */
#define ratio_get_hi(A) ((*(TRatioValue *)(&A)).BB.Hi)
#define ratio_get_lo(A) ((*(TRatioValue *)(&A)).BB.Frac)
typedef union {
uint16_t Value;
struct {
uint8_t Hi;
uint8_t Frac;
} BB;
} TRatioValue;
/*
** ===================================================================
** Method : SetRatio (component PWM)
**
** Description :
** The method stores duty value to compare register(s) and sets
** necessary bits or (in List mode) call SetReg method for duty
** value storing.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetRatio(void)
{
if (RatioStore == 0xFFFFU) { /* Duty = 100%? */
TPM1C0V = 0xFFFFU; /* Store new value to the compare reg. */
} else {
TRatioValue Tmp1, Tmp2;
uint16_t Result;
Result = (uint16_t)(ratio_get_hi(RatioStore) * 0xEA); /* HI * HI */
Tmp1.Value = (uint16_t)(ratio_get_hi(RatioStore) * 0x60); /* HI * LO */
Result += Tmp1.BB.Hi;
Tmp2.Value = (uint16_t)(ratio_get_lo(RatioStore) * 0xEA); /* LO * HI */
Result += Tmp2.BB.Hi;
if ((Tmp2.BB.Frac += Tmp1.BB.Frac) < Tmp1.BB.Frac) {
++Result; /* carry to result */
}
Tmp1.Value = (uint16_t)(ratio_get_lo(RatioStore) * 0x60); /* LO * LO */
if ((Tmp1.BB.Hi += Tmp2.BB.Frac) < Tmp2.BB.Frac) {
++Result; /* carry to result */
}
if (Tmp1.BB.Hi >= 0x80) {
++Result; /* round */
}
TPM1C0V = Result;
}
}
/*
** ===================================================================
** Method : PWM_5mS_Enable (component PWM)
**
** Description :
** This method enables the component - it starts the signal
** generation. Events may be generated (<DisableEvent>
** /<EnableEvent>).
** Parameters : None
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ===================================================================
*/
byte PWM_5mS_Enable(void)
{
/* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=1,PS0=0 */
setReg8(TPM1SC, 0x0A); /* Run the counter (set CLKSB:CLKSA) */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWM_5mS_Disable (component PWM)
**
** Description :
** This method disables the component - it stops the signal
** generation and events calling. When the timer is disabled,
** it is possible to call <ClrValue> and <SetValue> methods.
** Parameters : None
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ===================================================================
*/
byte PWM_5mS_Disable(void)
{
/* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */
setReg8(TPM1SC, 0x00); /* Stop counter (CLKSB:CLKSA = 00) */
/* TPM1CNTH: BIT15=0,BIT14=0,BIT13=0,BIT12=0,BIT11=0,BIT10=0,BIT9=0,BIT8=0 */
setReg8(TPM1CNTH, 0x00); /* Reset HW Counter */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWM_5mS_SetRatio16 (component PWM)
**
** Description :
** This method sets a new duty-cycle ratio.
** Parameters :
** NAME - DESCRIPTION
** Ratio - Ratio is expressed as an 16-bit unsigned integer
** number. 0 - 0xFFFF value is proportional
** to ratio 0 - 100%
** Note: Calculated duty depends on the timer possibilities
** and on the selected period.
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ===================================================================
*/
byte PWM_5mS_SetRatio16(word Ratio)
{
RatioStore = Ratio; /* Store new value of the ratio */
SetRatio(); /* Calculate and set up new appropriate values of the compare and modulo registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWM_5mS_SetDutyUS (component PWM)
**
** Description :
** This method sets the new duty value of the output signal.
** The duty is expressed in microseconds as a 16-bit
** unsigned integer number.
** Parameters :
** NAME - DESCRIPTION
** Time - Duty to set [in microseconds]
** (0 to 5000 us in high speed mode)
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_MATH - Overflow during evaluation
** ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte PWM_5mS_SetDutyUS(word Time)
{
dlong rtval; /* Result of two 32-bit numbers multiplication */
if (Time > 0x1388U) { /* Is the given value out of range? */
return ERR_RANGE; /* If yes then error */
}
PE_Timer_LngMul((dword)Time, 0x0D1B7176LU, &rtval); /* Multiply given value and High speed CPU mode coefficient */
if (PE_Timer_LngHi3(rtval[0], rtval[1], &RatioStore)) { /* Is the result greater or equal than 65536 ? */
RatioStore = 0xFFFFU; /* If yes then use maximal possible value */
}
SetRatio(); /* Calculate and set up new appropriate values of the compare and modulo registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWM_5mS_SetDutyMS (component PWM)
**
** Description :
** This method sets the new duty value of the output signal.
** The duty is expressed in milliseconds as a 16-bit
** unsigned integer number.
** Parameters :
** NAME - DESCRIPTION
** Time - Duty to set [in milliseconds]
** (0 to 5 ms in high speed mode)
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_MATH - Overflow during evaluation
** ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte PWM_5mS_SetDutyMS(word Time)
{
dlong rtval; /* Result of two 32-bit numbers multiplication */
if (Time > 0x05U) { /* Is the given value out of range? */
return ERR_RANGE; /* If yes then error */
}
PE_Timer_LngMul((dword)Time, 0x33333333LU, &rtval); /* Multiply given value and High speed CPU mode coefficient */
if (PE_Timer_LngHi2(rtval[0], rtval[1], &RatioStore)) { /* Is the result greater or equal than 65536 ? */
RatioStore = 0xFFFFU; /* If yes then use maximal possible value */
}
SetRatio(); /* Calculate and set up new appropriate values of the compare and modulo registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWM_5mS_Init (component PWM)
**
** Description :
** Initializes the associated peripheral(s) and the beans
** internal variables. The method is called automatically as a
** part of the application initialization code.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void PWM_5mS_Init(void)
{
/* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */
setReg8(TPM1SC, 0x00); /* Disable device */
/* TPM1C0SC: CH0F=0,CH0IE=0,MS0B=1,MS0A=1,ELS0B=1,ELS0A=1,??=0,??=0 */
setReg8(TPM1C0SC, 0x3C); /* Set up PWM mode with output signal level low */
RatioStore = 0x199AU; /* Store initial value of the ratio */
/* TPM1MOD: BIT15=1,BIT14=1,BIT13=1,BIT12=0,BIT11=1,BIT10=0,BIT9=1,BIT8=0,BIT7=0,BIT6=1,BIT5=0,BIT4=1,BIT3=1,BIT2=1,BIT1=1,BIT0=1 */
setReg16(TPM1MOD, 0xEA5FU); /* Set modulo register */
SetRatio(); /* Calculate and set up new values of the compare according to the selected speed CPU mode */
/* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=1,PS0=0 */
setReg8(TPM1SC, 0x0A); /* Run the counter (set CLKSB:CLKSA) */
}
/* END PWM_5mS. */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.07 [04.34]
** for the Freescale HCS08 series of microcontrollers.
**
** ###################################################################
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?