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

📄 obj_svctempo.c

📁 at91rm9200的一级bootloader
💻 C
字号:
//*----------------------------------------------------------------------------

//*      ATMEL Microcontroller Software Support  -  ROUSSET  -

//*----------------------------------------------------------------------------

//* The software is delivered "AS IS" without warranty or condition of any

//* kind, either express, implied or statutory. This includes without

//* limitation any warranty or condition with respect to merchantability or

//* fitness for any particular purpose, or against the infringements of

//* intellectual property rights of others.

//*----------------------------------------------------------------------------

//* File Name           : obj_svctempo.c

//* Object              : service tempo

//*

//* 1.0 03/10/01 HI	    : Creation

//*----------------------------------------------------------------------------

#include "periph/system_timer/lib_st.h"

#include "services/obj_svctempo.h"



//* ====================================================================================





//* ====================================================================================





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_OpenCtlTempo

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_OpenCtlTempo( AT91PS_CtlTempo pCtlTempo, void const *pTempoTimer )

{

#ifdef DBG_DRV_TIMER

	assert(pCtlTempo);

#endif



//* Check arguments of OpenSvcTempo

	if (pCtlTempo == (AT91PS_CtlTempo)0)

		return AT91C_ERROR_OPEN_CTRLTEMPO;



//* Initialize CtlTempo fields

	pCtlTempo->pFirstTempo = (AT91PS_SvcTempo)0;

	pCtlTempo->pNewTempo =  (AT91PS_SvcTempo)0;



//* default timer = system timer

	pCtlTempo->pTimer  = (void *)pTempoTimer;



	pCtlTempo->CtlTempoStart = AT91F_STStart;

	pCtlTempo->CtlTempoStop  = AT91F_STStop;





	pCtlTempo->CtlTempoSetTime = AT91F_STSetTime;

	pCtlTempo->CtlTempoGetTime = AT91F_STGetTime;

	pCtlTempo->CtlTempoIsStart = AT91F_STIsStart;



	pCtlTempo->SvcTempoStart  = AT91F_SvcTempoStart;

	pCtlTempo->SvcTempoStop   = AT91F_SvcTempoStop;

	pCtlTempo->CtlTempoCreate = AT91F_CtlTempoCreate;

	pCtlTempo->CtlTempoRemove = AT91F_CtlTempoRemove;

	pCtlTempo->CtlTempoTick   = AT91F_CtlTempoTick;



	pCtlTempo->pPrivateData = (void *) pCtlTempo;

	return AT91C_OPEN_CTRLTEMPO_SUCCESS;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_STStart

//* Object              : Start the systimer

//* Input Parameters    : void * pTimer

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_STStart(void * pTimer)

{

	AT91PS_STDesc pSysTimer = (AT91PS_STDesc)pTimer;

	AT91_STinit(pSysTimer, AT91_GetSTperiod(1000));

	return AT91C_START_OK;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_STStop

//* Object              :

//* Input Parameters    : void * pTimer

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_STStop(void * pTimer)

{

	return AT91C_STOP_OK;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_STSetTime

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_STSetTime(AT91PS_CtlTempo pCtrl, unsigned int NewTime)

{

	return 1;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_STGetTime

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_STGetTime(AT91PS_CtlTempo pCtrl)

{

	return 1;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_STIsStart

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_STIsStart(AT91PS_CtlTempo pCtrl)

{

	AT91PS_STDesc pSysTimer = (AT91PS_STDesc )pCtrl->pTimer;

	return(AT91F_StGetState(pSysTimer->st_base));

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_CtlTempoCreate

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_CtlTempoCreate (

					AT91PS_CtlTempo pCtrl,

					AT91PS_SvcTempo pTempo)

{

	AT91PS_CtlTempo pCtlTempo = (AT91PS_CtlTempo)(pCtrl->pPrivateData);

	AT91PS_SvcTempo pTmp;





	//* If no tempo is activated, then insert it

	// * Check that this Tempo is not already in the current list

	pTmp = pCtlTempo->pFirstTempo;

	while (pTmp) {

		if (pTmp == pTempo)

			return 0;

		pTmp = pTmp->pNextTempo;

	}



	//* Check that this Tempo is not already in the new list

	pTmp = pCtlTempo->pNewTempo;

	while (pTmp) {

		if (pTmp == pTempo)

			return 0;

		pTmp = pTmp->pNextTempo;

	}



	//* Initialize Tempo structure

	pTempo->flag = AT91E_SVCTEMPO_DIS;

	pTempo->pPreviousTempo = (AT91PS_SvcTempo) 0;

	pTempo->Start = pCtlTempo->SvcTempoStart;

	pTempo->Stop  = pCtlTempo->SvcTempoStop;

	pTempo->TickTempo   = 0;

	pTempo->ReloadTempo = 0;



	//* Insert Tempo in the list

	if ( !(pCtlTempo->pFirstTempo) ) {

		pTempo->pNextTempo = (AT91PS_SvcTempo) 0;

		pCtlTempo->pFirstTempo = pTempo;

	}

	else {

		if (pCtlTempo->pNewTempo)

			pCtlTempo->pNewTempo->pPreviousTempo = pTempo;

		pTempo->pNextTempo = pCtrl->pNewTempo;

		pCtlTempo->pNewTempo = pTempo;

	}



	return 1;

}







//*----------------------------------------------------------------------------

//* Function Name       : AT91F_CtlTempoRemove

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_CtlTempoRemove (AT91PS_CtlTempo pCtrl, AT91PS_SvcTempo pTempo)

{

	AT91PS_CtlTempo pCtlTempo = (AT91PS_CtlTempo)(pCtrl->pPrivateData);

	AT91PS_SvcTempo pCurrentTempo = pCtlTempo->pFirstTempo;	// to go throught the tempo list



	//* Remove first Tempo entry in the list

	if(pCurrentTempo == pTempo) {

		pCtlTempo->pFirstTempo = pCurrentTempo->pNextTempo;

		pCtlTempo->pFirstTempo->pPreviousTempo = (AT91PS_SvcTempo)0;

		return 1;

	}



	while( (pCurrentTempo->pNextTempo != pTempo) && (pCurrentTempo->pNextTempo != (AT91PS_SvcTempo)0 ) )

			pCurrentTempo = (pCurrentTempo->pNextTempo);



	//* No tempo to remove

	if(	pCurrentTempo->pNextTempo == (AT91PS_SvcTempo)0 )

		return 0;

	//* Remove the selected tempo and rebuild the list

	pCurrentTempo->pNextTempo = pCurrentTempo->pNextTempo->pNextTempo;

	pCurrentTempo->pNextTempo->pPreviousTempo = pCurrentTempo;

	pCtlTempo->pPrivateData = pCtlTempo;

	return 1;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_CtlTempoTick

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_CtlTempoTick (AT91PS_CtlTempo pCtrl)

{

	AT91PS_CtlTempo pCtlTempo = (AT91PS_CtlTempo)(pCtrl->pPrivateData);

	AT91PS_SvcTempo pCurrentTempo;	// to go throught the tempo list



	//* Add NewTempo in FirstTempo list?

	if(pCtrl->pNewTempo != (AT91PS_SvcTempo)0 ) {

		pCurrentTempo = pCtrl->pNewTempo;

		while (pCurrentTempo->pNextTempo)

			pCurrentTempo = pCurrentTempo->pNextTempo;

		pCurrentTempo->pNextTempo = pCtlTempo->pFirstTempo;

		pCtlTempo->pFirstTempo->pPreviousTempo = pCurrentTempo;



		pCtlTempo->pFirstTempo = pCtrl->pNewTempo;

	    //* Remove NewTempo list

		pCtrl->pNewTempo = (AT91PS_SvcTempo)0;

	}



	//* Notify all the Tempo elements and executes callbacks

	pCurrentTempo = pCtlTempo->pFirstTempo;

	while (pCurrentTempo!=(AT91PS_SvcTempo)0) {

		if (pCurrentTempo->flag == AT91E_SVCTEMPO_EN) {

			if(pCurrentTempo->TickTempo > 0)

				pCurrentTempo->TickTempo--;

			if((pCurrentTempo->TickTempo  == 0) && (pCurrentTempo->TempoCallback)) {

				if (pCurrentTempo->ReloadTempo)

					pCurrentTempo->TickTempo = pCurrentTempo->ReloadTempo;

				else

					pCurrentTempo->flag = AT91E_SVCTEMPO_DIS;

				pCurrentTempo->TempoCallback(AT91C_TIMEOUT_REACHED,pCurrentTempo->pPrivateData);

			}

		}

		pCurrentTempo = pCurrentTempo->pNextTempo;

	}



	return 1;

}



//*----------------------------------------------------------------------------

//* Function Name       : AT91F_SvcTempoStart

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_SvcTempoStart (

		AT91PS_SvcTempo pSvc,

		unsigned int timeout,

		unsigned int reload,

		void (*callback) (AT91S_TempoStatus, void *),

		void *pData)

{

	pSvc->TickTempo   = timeout;

	pSvc->ReloadTempo = reload;

	pSvc->TempoCallback = callback;

	pSvc->pPrivateData = pData;

	pSvc->flag = AT91E_SVCTEMPO_EN;

	return 1;

}





//*----------------------------------------------------------------------------

//* Function Name       : AT91F_SvcTempoStop

//* Object              :

//* Input Parameters    :

//* Output Parameters   : none

//*----------------------------------------------------------------------------

AT91S_TempoStatus AT91F_SvcTempoStop (

	AT91PS_SvcTempo pSvc)

{

	pSvc->flag = AT91E_SVCTEMPO_DIS;

	return 1;

}

⌨️ 快捷键说明

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