Код
unsigned int val;
unsigned int per_update;
//ch0
if( ((pwm[chn_num] & 0xFFFF0000)>>16)!= PWM_period[chn_num] )//смена периода ШИМ
{
PWM_period[chn_num] = ((pwm[chn_num] & 0xFFFF0000)>>16);
*AT91C_PWMC_DIS = (1<<chn_num);//disable chn
if(PWM_period[chn_num]==0)
return;
per_update = PWM_period[chn_num] * 50;// Hz
if(per_update <= 2500)
{
per_update = 48000000 / 16 / per_update;
*AT91C_PWMC_CH0_CMR = 0x04;//MCK/16
}
else
{
per_update = 48000000 / per_update;
*AT91C_PWMC_CH0_CMR = 0;//MCK/1
}
if(per_update > 1)//errata
{
*AT91C_PWMC_CH0_CMR|= (1<<9);//CPOL = 1
*AT91C_PWMC_CH0_CPRDR = per_update;
*AT91C_PWMC_CH0_CDTYR = 2;
*AT91C_PWMC_ENA = (1<<chn_num);//enable chn <- ТУТ БРЕЙКПОИНТ !!!!
}
}
else
if(*AT91C_PWMC_SR & (1<<chn_num))
{
val = pwm[chn_num] & 0xFFFF;
if(val < 2)//errata
val = 2;
while(*AT91C_PWMC_CH0_CCNTR < 2);//errata
*AT91C_PWMC_CH0_CUPDR = val;
}
unsigned int per_update;
//ch0
if( ((pwm[chn_num] & 0xFFFF0000)>>16)!= PWM_period[chn_num] )//смена периода ШИМ
{
PWM_period[chn_num] = ((pwm[chn_num] & 0xFFFF0000)>>16);
*AT91C_PWMC_DIS = (1<<chn_num);//disable chn
if(PWM_period[chn_num]==0)
return;
per_update = PWM_period[chn_num] * 50;// Hz
if(per_update <= 2500)
{
per_update = 48000000 / 16 / per_update;
*AT91C_PWMC_CH0_CMR = 0x04;//MCK/16
}
else
{
per_update = 48000000 / per_update;
*AT91C_PWMC_CH0_CMR = 0;//MCK/1
}
if(per_update > 1)//errata
{
*AT91C_PWMC_CH0_CMR|= (1<<9);//CPOL = 1
*AT91C_PWMC_CH0_CPRDR = per_update;
*AT91C_PWMC_CH0_CDTYR = 2;
*AT91C_PWMC_ENA = (1<<chn_num);//enable chn <- ТУТ БРЕЙКПОИНТ !!!!
}
}
else
if(*AT91C_PWMC_SR & (1<<chn_num))
{
val = pwm[chn_num] & 0xFFFF;
if(val < 2)//errata
val = 2;
while(*AT91C_PWMC_CH0_CCNTR < 2);//errata
*AT91C_PWMC_CH0_CUPDR = val;
}