План такой. ADC работает в непрерывном режиме тоесть в регистре данных ADC постоянно обновляется значение. Таймер (tim19 compare1) пинает DMA (dma1 канал1) а DMA перекладывает значение ADC в массив.
Код:
|
void TIM19_init(void) {
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* Enable TIM19 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM19, ENABLE);
/* TIM19 Configuration */
TIM_DeInit(TIM19);
/* Fills each TIM_TimeBaseInitStruct member with its default value */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
/* Time base configuration*/
TIM_TimeBaseStructure.TIM_Period = 50-1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM19, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 (OC1) */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1; // !! // в примере из интернета здесь "1"
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //!! // в примере из интернета этой стоки вообще нет
TIM_OC1Init(TIM19, &TIM_OCInitStructure);
/* TIM1 Update DMA Request enable */
TIM_DMACmd(TIM19, TIM_DMA_CC1, ENABLE);
/* Enable TIM19 counter */
TIM_Cmd(TIM19, ENABLE);
} |
Код:
|
void DMA_init(void) {
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_InitTypeDef DMA_InitStructure;
// DMA1 канал 1 - сигма-дельта АЦП
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDADC1-›JDATAR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ex[0];
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // направление от периферии к памяти
DMA_InitStructure.DMA_BufferSize = 100; // длинна буфера = ARRAY_LENGHT(mas1)
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // инкримент периферии отключен
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // инкремент в памяти - включен
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // размер данных в периферии 32 бита
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // размер данных в памяти 32 бита
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // режим DMA - обычный, не круговой
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // поскольку DMA задействовано одно - его приоритет не имеет смысла
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // Memory-to-memory Disable
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
} |
инициализацию АЦП не привожу, оно точно работает, в регистре SDADC1-›JDATAR правильные данные. DMA массив не заполняет. предполанаю что я неправильно запускаю DMA таймером. связка ADC -› DMA - работает (стартовать ADC каждый раз не надо, оно запускается один раз, при инициализации и непрерывно измеряет), массив заполняется.