Witam,
Pierwszy raz ustawiam PWM na SAM7S64. Całość działa na FreeRTOS. Chcę ustawić PWM na kanale 0 (pinA0) o okresie 1sek.
Czy jeszcze zapomniałem o jakimś rejestrze?
Pierwszy raz ustawiam PWM na SAM7S64. Całość działa na FreeRTOS. Chcę ustawić PWM na kanale 0 (pinA0) o okresie 1sek.
void
audio_hw_conf(void)
{
// Confiugre PIO (Parallel Input/Output Controller).
AT91C_BASE_PIOA->PIO_PDR = AT91C_PWMC_CHID0; // Enable peripheral function.
AT91C_BASE_PIOA->PIO_ASR = AT91C_PWMC_CHID0; // Peripheral function A.
// Configure PMC (Power Management Controller).
AT91C_BASE_PMC->PMC_PCER = AT91C_ID_PWMC; // Power up PWM Controller.
// Configure AIC (Advanced Interrupt Controller).
AT91F_AIC_ConfigureIt(7, AT91C_AIC_PRIOR_1, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
&audio_pwm0_isr_wrapper);
AT91C_BASE_AIC->AIC_IECR = 0x1 << 7;
// Configure PWMC (Pulse Width Modulation Controller).
AT91C_BASE_PWMC->PWMC_MR = 0; // Clear mode register.
AT91C_BASE_PWMC->PWMC_CH[AT91C_PWMC_CHID0].PWMC_CMR =
AT91C_PWMC_CPRE_MCK_1024 | AT91C_PWMC_CPOL; // MCK/1024 and polarity 1.
AT91C_BASE_PWMC->PWMC_CH[AT91C_PWMC_CHID0].PWMC_CPRDR = 0x00004650; // Period set to 1sec.
AT91C_BASE_PWMC->PWMC_CH[AT91C_PWMC_CHID0].PWMC_CDTYR = 0x00002328; // 50% duty cycle.
AT91C_BASE_PWMC->PWMC_IER = AT91C_PWMC_CHID0; // Enable interrupt from chn0.
AT91C_BASE_PWMC->PWMC_ENA = AT91C_PWMC_CHID0; // Enable channel 0.
}
// Audio PWM channel 0 interrupt handler.
void
audio_pwm0_isr_handler (void)
{
//AT91C_BASE_PWMC->PWMC_CH[AT91C_PWMC_CHID0].CUPDR = newvalue
AT91C_BASE_AIC->AIC_EOICR = 0;
}
// Audio PWM channel 0 wrapper.
void
audio_pwm0_isr_wrapper (void)
{
portSAVE_CONTEXT();
audio_pwm0_isr_handler();
portRESTORE_CONTEXT();
}Czy jeszcze zapomniałem o jakimś rejestrze?