/*
* @brief Simple calulate square number.
* @param1 Base number
* @param2 Exponent number
* @retval Number of base^number
* @author: icerol
*/
unsigned long pow(uint base , uint exponent)
{
uint temp = 1;
for(uint i=0; i< exponent; i++)
{
temp *= base;
}
return temp;
}
/*
* @brief Initial timer4 for base timer.
* @param1 Timeout of microsecond
* @retval None
* @author: icerol
*/
void timer4_Init(unsigned int microSecond)
{
unsigned char pscr;
double arr;
double f_tim;
for(pscr=0;pscr<0x08;pscr++)
{
f_tim = F_MASTER/pow(2,pscr);
arr = microSecond/(1000000/f_tim);
if(arr<0xff)
break;
}
TIM4_PSCR_PSC = pscr; //2^1 分频为1M
TIM4_ARR = (unsigned char)arr; //每255us中断一次
TIM4_IER = 0x01; //允许更新中断
TIM4_CR1 = 0x01; //计数器使能,开始计数
}
#define TIM4_OVR_UIF_vector 0x19
#pragma vector = TIM4_OVR_UIF_vector
__interrupt void TIM4_OVR_UIF(void)
{
TIM4_SR_UIF = 0;
PD_ODR_ODR3 = !PD_ODR_ODR3;
}