Здравствуйте, уважаемые коллеги, если кто работал с STR912FA44, подскажите почему таймером 0 не активизирует линию DMA? У меня такая задача, чтобы обновлять содержимое регистра OCR1 по истечении периода OCR2 с помощью DMA. Таймер 0 работает в PWM режиме. Это мне нужно для реализации простейшего WAV-плейера. Код инициализации провожу. Сам DMA проинициализирован и поддерживает все другие устройства (SSP, UART), кроме таймера 0. Заранее благодарен.
CODE
void DMA_Wav_Player_Init (INT8U *pWAV_Start)
{TIM_TypeDef* tim = TIM0; // Initialize the Timer 0
INT32U Len_WAV;
Len_WAV = Init_WAV_Content (pWAV_Start); // Инициализация указателя на WAV-массив и его длины
Open_DMA_Channel_TIM (0, pWAV_Start, Len_WAV); // Initialize the Timer 0
tim->OC1R = 0x80; // Счетчик сравнения 1 /* Set the Duty Cycle value */
tim->OC2R = 0xFC;
tim->CR1 = (TIM_CR1_EN + TIM_CR1_PWM + TIM_CR1_OLVL2 + TIM_CR1_OC1E + TIM_CR1_DMAS_OC2);
// PWM configuration, Set CR 1
tim->CR2 = TIM_CR2_DMAE + 0x16; // TIM0 IRQ enable, TIM_Prescaler Internal clock, 16 KHz generation
Volume_ON;
} //DMA_Wav_Player_Init ()
static DMA_Channel_TypeDef *DMA_CHS[8] = {DMA_Channel0,DMA_Channel1,DMA_Channel2,DMA_Channel3,DMA_Channel4,DMA_Channel5,D
MA_Channel6,DMA_Channel7};
/*-------------------------------------------------------------------------------------------------------------
Функция Open_DMA_Channel_TIM () создания канала обновления содержимого таймера через DMA
Открывается канал DMA 6 для передачи данных в регистр OCR1 таймера, для режима PWM
-------------------------------------------------------------------------------------------------------------*/
void Open_DMA_Channel_TIM (INT8U* val, INT32U n)
{
TIM_TypeDef *tim = TIM0;
DMA_Channel_TypeDef *dmach;
dmach = DMA_CHS [6];
dmach->CCNF = 0;
dmach->CC = BIT(31) // Terminal Count interrupt enabled
// Bits 20:18 = 000 - Source width = Byte (8-bit)
// Bits 17:15 = 000 - Destination Burst size = single transfer
// Bits 14:12 = 000 - Source Burst size = single transfer
+ (n & 0xFFF);
dmach->DES = (INT32U)(&tim->OC1R);
dmach->SRC = (INT32U) val;
dmach->LLI = 0;
dmach->CCNF = BIT(15) // 1: Terminal Count interrupt enabled on channel x
+ BIT(14) // 1: Error interrupt enabled on channel x
+ LSHIFT(1,11) // 001: Memory-to-peripheral DMA, flow controller - DMA
+ LSHIFT(2,6) // Destination peripheral selection DMA request signal mapping from TIM0
+ BIT(0); // 1: Channel enabled
} // Open_DMA_Channel_TIM ()
Сообщение отредактировал IgorKossak - Dec 10 2011, 17:45
Причина редактирования: [codebox]