[an error occurred while processing this directive]
|
inline uint16 Set_rate_in_Hz(const uint16 rate)
{
//f=F_PCLK_HZ/(CPSDVSR*(SCR+1))
//CPSDVSR*[SCR+1] = F_PCLK_HZ/f
//Получаем множетели...
uint8 mux1 = Get_greatest_divisor(F_PCLK_HZ/rate);
uint16 mux2 = ((F_PCLK_HZ/rate)/mux1);
if(mux2 > 0xFF)
{return 0;};
// Ищем четный...
if(!(mux1 & 0x01))
{// mux1 - четный
CPSR.CPSDVSR = mux1;
CR0.SCR = mux2-1;
}
else
{
if(!(mux2 & 0x01))
{// mux2 - четный
CPSR.CPSDVSR = mux2;
CR0.SCR = mux1-1;
}
else
{// нет четных
return 0;
}
}
// Проверка...
if(CR1.MS)
{// Master...
if(CPSR.CPSDVSR < 12)
{return 0;} // Недопустимое значение CPSDVSR
}
else
{// Slave...
if(CPSR.CPSDVSR < 2)
{return 0;} // Недопустимое значение CPSDVSR
}
uint16 temp1 = (CR0.SCR+1);
temp1 *= CPSR.CPSDVSR;
return F_PCLK_HZ/temp1;
}