occs.h

来自「MC56F802BLDC 可以使用的算法 就是电机启动有点慢」· C头文件 代码 · 共 280 行

H
280
字号
/*******************************************************************************
*
*  Motorola Inc.
*  (c) Copyright 2000 Motorola Inc.
*  ALL RIGHTS RESERVED.
*
********************************************************************************
*
*
*  File Name:   occs.h
*
*  Description: Header file for On-chip Clock Synthesis (OCCS) driver.
*
*
*  Modules Included:
*
*  Notes: 
*
*
*******************************************************************************/
#ifndef __OCCS_H
#define __OCCS_H



/*******************************************************************************
	OCCS base address used as device handle in ioctl()
*******************************************************************************/
#define OCCS					(&ArchIO.Pll)



/*******************************************************************************
	Defines for appconfig.h
********************************************************************************
	#define EXTCLK						8000000UL		oscillator frequency

	void occsISR(void);
	#define INT_VECTOR_ADDR_62				occsISR
	#define ITCN_INT_PRIORITY_62			value 0 to 7 (0 means interrupt is disabled)

	#define OCCS_CONTROL_REG				0x0000
	#define OCCS_DIVIDE_BY_REG				0x0000
	#define OCCS_CLKO_SELECT_REG			0x0000
	#define OCCS_INTERNAL_OSC_REG			0x0000 (only for 801)
*/


/*  Equations for calculating Prescaler, Postscaler, DivBy according to
	needed Fosc and Fzclk:
	1) ZCLK - Postscaler output
		Fvco = Fosc*(DivBy+1)/Prescaler		(VCO frequency)
		Fzclk = Fvco/(2*Postscaler)			(ZCLK frequency, 
											 what is DSP core frequency)
	2) ZCLK - Prescaler output
		Fzclk = Fosc/Prescaler
	Recommended range of Fvco is 80MHz to 240MHz.
	The maximum Fzclk is 80MHz.
	IP Bus clock frequency is Fzclk divided by 2.
*/



/*******************************************************************************
	ioctl() commands
********************************************************************************
		command						parameters and commentary */
#define OCCS_INIT					/* NULL , occsInit function is called (initialization) */
#define OCCS_SET_CORE_CLOCK			/* OCCS_CLOCK_IN_DIVIDE_BY_x | OCCS_CLOCK_OUT_DIVIDE_BY_y | DivBy,
									where x and y are 1,2,4 or 8. Range of DivBy is 0 to 127
									After command is executed the VCO frequency and DSP core frequency is
									Fvco = Fosc*(DivBy+1)/Prescaler
									Fzclk = Fvco/(2*Postscaler)
									(recommended range of Fvco is 80MHz to 240MHz) */
#define OCCS_SET_POSTSCALER			/* OCCS_CLOCK_OUT_DIVIDE_BY_x, where x is 1,2,4 or 8 */
#define OCCS_SET_PRESCALER			/* OCCS_CLOCK_IN_DIVIDE_BY_x, where x is 1,2,4 or 8 
									use this command only when ZCLOCK Source is set to prescaler */
#define OCCS_SET_DIVIDE_BY			/* value  0 to 127, use this command only when ZCLOCK Source is set to prescaler */
#define OCCS_SET_LORTP				/* value  1 to 15 */
#define OCCS_ENABLE_INT				/* (OCCS_INT1_ANY_EDGE / OCCS_INT1_FALLING_EDGE / OCCS_INT1_RISING_EDGE) |
									(OCCS_INT0_ANY_EDGE / OCCS_INT0_FALLING_EDGE / OCCS_INT0_RISING_EDGE) |
									OCCS_LOSS_OF_CLOCK_INT */
#define OCCS_DISABLE_INT			/* OCCS_INT1 |	OCCS_INT0 | OCCS_LOSS_OF_CLOCK_INT */
#define OCCS_LOCK_DETECTOR			/* OCCS_ENABLE / OCCS_DISABLE */
#define OCCS_TURN_OFF_CHARGE_PUMP	/* NULL, use this command only in the event of loss of clock */
#define OCCS_SET_PRESC_CLOCK_SEL	/* OCCS_CRYSTAL_OSC / OCCS_INTERNAL_RELAX_OSC, !this command is available only on DSP56F801, if you want crystal oscillator GPIOB2 and GPIOB3 must be set as peripheral (not GPIO), what is default after reset */
#define OCCS_SET_ZCLOCK_SOURCE		/* OCCS_PRESCALER_OUTPUT / OCCS_POSTSCALER_OUTPUT */
#define OCCS_GET_ZCLOCK_SOURCE		/* NULL, returns OCCS_PRESCALER_OUTPUT or OCCS_POSTSCALER_OUTPUT or 0x0000 or 0x0011,
									value 0x0000 or 0x0011 means synchronizing is in progress */
#define OCCS_SELECT_CLKO			/* OCCS_ZCLK / OCCS_NO_CLK */
#define OCCS_READ_FLAG				/* OCCS_STATUS_LOCK_LOST_INT1 | OCCS_STATUS_LOCK_LOST_INT0 |
									OCCS_STATUS_CLOCK_LOST (| OCCS_STATUS_LOCK_1 | OCCS_STATUS_LOCK_0)
									returns 0 if flag is cleared, non-zero if flag is set */
#define OCCS_CLEAR_FLAG				/* OCCS_STATUS_LOCK_LOST_INT1 | OCCS_STATUS_LOCK_LOST_INT0 |
									OCCS_STATUS_CLOCK_LOST */
#define OCCS_RELAX_OSC				/* OCCS_ENABLE / OCCS_DISABLE, only for 801 */
#define OCCS_ADJUST_RELAX_OSC_FREQ	/* value of 0 to 255, only for 801 */
#define OCCS_GET_IPBUS_FREQ			/* oscillator frequency [Hz](UInt32), returns IPBus Clock frequency [Hz] (UInt32) */


#define OCCS_WRITE_CONTROL_REG		/* 16 bit value */
#define OCCS_WRITE_DIVIDE_BY_REG	/* 16 bit value */
#define OCCS_WRITE_STATUS_REG		/* 16 bit value */
#define OCCS_WRITE_INTERNAL_OSC_REG	/* 16 bit value */

#define OCCS_READ_CONTROL_REG		/* NULL, returns UWord16 */
#define OCCS_READ_DIVIDE_BY_REG		/* NULL, returns UWord16 */
#define OCCS_READ_STATUS_REG		/* NULL, returns UWord16 */
#define OCCS_READ_INTERNAL_OSC_REG	/* NULL, returns UWord16 */





/*******************************************************************************
	Register bits
*******************************************************************************/
/* OCCS CONTROL REGISTER FLAGS */
#define OCCS_INT1_ANY_EDGE				0xC000
#define OCCS_INT1_FALLING_EDGE			0x8000
#define OCCS_INT1_RISING_EDGE			0x4000
#define OCCS_INT0_ANY_EDGE				0x3000
#define OCCS_INT0_FALLING_EDGE			0x2000
#define OCCS_INT0_RISING_EDGE			0x1000
#define OCCS_LOSS_OF_CLOCK_INT			0x0800
#define OCCS_LOCK_DETECTOR_BIT			0x0080
#define OCCS_CHARGE_PUMP_FLAG			0x0040
#define OCCS_POWER_DOWN					0x0010	// this bit is not used in revision B chip
#define OCCS_PRESCALER_CLOCK_SELECT		0x0004	// only for DSP56F801, for 803,805 and 807 it is reserved (value 0)
#define OCCS_ZCLOCK_PRESCALER			0x0001
#define OCCS_ZCLOCK_POSTSCALER			0x0002

/* OCCS DIVIDE-BY REGISTER FLAGS */
#define OCCS_CLOCK_OUT_DIVIDE_BY_1      0x0000
#define OCCS_CLOCK_OUT_DIVIDE_BY_2      0x0400
#define OCCS_CLOCK_OUT_DIVIDE_BY_4      0x0800
#define OCCS_CLOCK_OUT_DIVIDE_BY_8      0x0C00
#define OCCS_CLOCK_IN_DIVIDE_BY_1       0x0000
#define OCCS_CLOCK_IN_DIVIDE_BY_2       0x0100
#define OCCS_CLOCK_IN_DIVIDE_BY_4       0x0200
#define OCCS_CLOCK_IN_DIVIDE_BY_8       0x0300

/* OCCS STATUS REGISTER FLAGS */
#define OCCS_STATUS_LOCK_LOST_INT1      0x8000
#define OCCS_STATUS_LOCK_LOST_INT0      0x4000
#define OCCS_STATUS_CLOCK_LOST          0x2000
#define OCCS_STATUS_LOCK_1              0x0040
#define OCCS_STATUS_LOCK_0              0x0020
#define OCCS_STATUS_POWERED_DOWN        0x0010
#define OCCS_STATUS_ZCLOCK_PRESCALER    0x0001
#define OCCS_STATUS_ZCLOCK_POSTSCALER   0x0002

/* OCCS CLKO SELECT REGISTER FLAGS */
#define OCCS_ZCLK       			    0x0000
#define OCCS_NO_CLK						0x0010

/* OCCS INTERNAL OSCILLATOR CONTROL REGISTER FLAGS (only for 801) */
#define OCCS_RELAX_OSC_POWERDOWN_FLAG	0x8000

/* */
#define OCCS_CRYSTAL_OSC				true
#define OCCS_INTERNAL_RELAX_OSC			false
#define OCCS_INT1						0xC000
#define OCCS_INT0						0x3000
#define OCCS_PRESCALER_OUTPUT			0x0001
#define OCCS_POSTSCALER_OUTPUT			0x0002

/* enable/disable */
#define OCCS_ENABLE						true
#define OCCS_DISABLE					false




/* Function prototypes */
void occsInit(void);
UInt32 occsGetIPBusFreq(UInt32 OscFreq);
/* Function parameters: OscFreq - oscillator frequency [Hz]
   Function returns IP Bus frequency [Hz]. */




/*******************************************************************************
	Implementations of OCCS ioctl() commands
*******************************************************************************/
#define ioctlOCCS_INIT(pOccsBase,param)		occsInit()

#define ioctlOCCS_SET_CORE_CLOCK(pOccsBase,param) \
	{ \
		periphMemWrite(OCCS_LOCK_DETECTOR_BIT | OCCS_ZCLOCK_PRESCALER, \
					   (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg)); \
		periphMemWrite(0x2000 | param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); \
		/* Wait until PLL is locked */ \
		while (!periphBitTest(OCCS_STATUS_LOCK_1, (UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))) \
			; \
		periphMemWrite(OCCS_LOCK_DETECTOR_BIT | OCCS_ZCLOCK_POSTSCALER, \
					   (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg)); \
	}

#define ioctlOCCS_SET_POSTSCALER(pOccsBase, param) \
	{ periphBitSet(param & 0x0C00, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); \
	  periphBitClear((~param) & 0x0C00, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); }

#define ioctlOCCS_SET_PRESCALER(pOccsBase, param) \
	{ periphBitSet(param & 0x0300, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); \
	  periphBitClear((~param) & 0x0300, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); }

#define ioctlOCCS_SET_DIVIDE_BY(pOccsBase, param) \
	{ periphBitSet(param & 0x007F, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); \
	  periphBitClear((~param) & 0x007F, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); }

#define ioctlOCCS_SET_LORTP(pOccsBase, param) \
	{ periphBitSet((param << 12) & 0xF000, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); \
	  periphBitClear((~(param << 12)) & 0xF000, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg)); }

#define ioctlOCCS_SELECT_CLKO(pOccsBase, param) \
	periphMemWrite(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->SelectReg))

#define ioctlOCCS_TURN_OFF_CHARGE_PUMP(pOccsBase, param) \
	periphBitSet(OCCS_CHARGE_PUMP_FLAG, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg))

#define ioctlOCCS_ENABLE_INT(pOccsBase, param) \
	periphBitSet(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg))

#define ioctlOCCS_SET_ZCLOCK_SOURCE(pOccsBase, param) \
	{ periphMemWrite( periphMemRead((UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg)) & 0xFFFC | param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg) ); }

#define ioctlOCCS_GET_ZCLOCK_SOURCE(pOccsBase, param) \
	periphBitTest(0x0003, (UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))

#define ioctlOCCS_DISABLE_INT(pOccsBase, param) \
	periphBitClear(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg))

#define ioctlOCCS_READ_FLAG(pOccsBase, param) \
	periphBitTest(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))

#define ioctlOCCS_CLEAR_FLAG(pOccsBase, param) \
	periphBitSet(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))

#define ioctlOCCS_GET_IPBUS_FREQ(pOccsBase,param)	occsGetIPBusFreq(param)

#define ioctlOCCS_LOCK_DETECTOR(pOccsBase, param) \
	if (param) {periphBitSet(OCCS_LOCK_DETECTOR_BIT, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg));} \
	else		{periphBitClear(OCCS_LOCK_DETECTOR_BIT, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg));}



/* Reading(writing) from(to) registers */
#define ioctlOCCS_WRITE_CONTROL_REG(pOccsBase,param) \
	periphMemWrite(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg))

#define ioctlOCCS_WRITE_DIVIDE_BY_REG(pOccsBase,param) \
	periphMemWrite(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg))

#define ioctlOCCS_WRITE_STATUS_REG(pOccsBase,param) \
	periphMemWrite(param, (UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))



#define ioctlOCCS_READ_CONTROL_REG(pOccsBase,param) \
	periphMemRead((UWord16 *)(&((arch_sPLL*)pOccsBase)->ControlReg))

#define ioctlOCCS_READ_DIVIDE_BY_REG(pOccsBase,param) \
	periphMemRead((UWord16 *)(&((arch_sPLL*)pOccsBase)->DivideReg))

#define ioctlOCCS_READ_STATUS_REG(pOccsBase,param) \
	periphMemRead((UWord16 *)(&((arch_sPLL*)pOccsBase)->StatusReg))





/**********************************************************************
* Include of device specific OCCS commands and defines
***********************************************************************/
#include "occstarget.h"  /* device specific defines */


#endif

⌨️ 快捷键说明

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