Allregia 9 22 июля, 2012 Опубликовано 22 июля, 2012 · Жалоба Помогите пожалуйста. Хочу запустить АЦД непрерывно на оцифровку последовательно 12 каналов, чтобы складывало с массив. Вот код. Не могу понять - после инициализации DMA, в его регисторах все нули. Пробовал заускать программу - в массиве тоже все нули. //volatile u16 ADCConvertedValue[12]; <- the results are here void adc_init(void){ ADC_InitTypeDef ADC_InitStruct; ADC_CommonInitTypeDef ADC_CommonInitStruct; DMA_InitTypeDef DMA_InitStructure; // ports are already configured RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); // enable clocking of ADC1 RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2 //==Configure DMA2 - Channel0 Stream 4== DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) &ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = 12; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream4, &DMA_InitStructure); DMA_Cmd( DMA2_Stream4, ENABLE); // ADC: ADC_DeInit(); // turn ADC off ADC_CommonInitStruct.ADC_Mode =ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler =ADC_Prescaler_Div4; ADC_CommonInitStruct.ADC_DMAAccessMode =ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ADC_StructInit(&ADC_InitStruct); ADC_InitStruct.ADC_Resolution =ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode =ENABLE; ADC_InitStruct.ADC_ContinuousConvMode =ENABLE; ADC_InitStruct.ADC_DataAlign =ADC_DataAlign_Right;//Left; ADC_InitStruct.ADC_NbrOfConversion =12; ADC_Init(ADC1,&ADC_InitStruct); //----channels order ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1,ADC_SampleTime_480Cycles);// PC0 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2,ADC_SampleTime_480Cycles);// PC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3,ADC_SampleTime_480Cycles);// PC2 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4,ADC_SampleTime_480Cycles);// PC3 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 5,ADC_SampleTime_480Cycles);// PA0 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 6,ADC_SampleTime_480Cycles);// PA1 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7,ADC_SampleTime_480Cycles);// PA2 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 8,ADC_SampleTime_480Cycles);// PA3 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 9,ADC_SampleTime_480Cycles);// PA6 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 10,ADC_SampleTime_480Cycles);// PA7 ADC_RegularChannelConfig(ADC1, ADC_Channel_14,11,ADC_SampleTime_480Cycles);// PC4 ADC_RegularChannelConfig(ADC1, ADC_Channel_15,12,ADC_SampleTime_480Cycles);// PC5 // enable ADC and DMA: ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); //Enable ADC1 DMA ADC_Cmd(ADC1, ENABLE); //Enable ADC1 ADC_SoftwareStartConv(ADC1); // start ADC conversions } //----------------------------- Проц stm32f407, J-Link, Keil 4.23 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Ошибка была чисто механическая: RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2 вместо RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); // enable clocking of DMA2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Ошибка была чисто механическая: А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба А не надо библиотеками пользоваться. Уж сколько раз говорено. Сам прошел через это. Вы прошли через то, что путали слова clock и reset? и когда перестали пользоваться библиотеками, то вам помогло? :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Вы прошли через то, что путали слова clock и reset? и когда перестали пользоваться библиотеками, то вам помогло? :laughing: Нет, до этого не доходило. Но как же трудно было искать в html-документации эти функции, состав структур. Куда логичнее посмотреть содержимое регистров в руководстве на микроконтроллер, и использовать только описание этих битов из stm32f10x.h (в моем случае). И места занимает намного меньше во флэшь-памяти. А, главное, чувствуешь себя хозяином микроконтроллера, а не приемышем каким-то. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба А не надо библиотеками пользоваться. С чего вдруг?! Но как же трудно было искать в html-документации эти функции, А зачем их там искать? Честно говоря, я даже не подозревал о существовании "html-документации", поэтому смотрю просто в .с и .h файлах самих библиотк, там зачастую более чем остаточно информации - смотрю в .с функцию, перед ней расписаны ее аргументы, все варианты. В .h смотрю структуру и ее варанты ее параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Allregia, абсолютно правильный подход. Еще добавлю, что все библиотеки построены по одному сценарию с добавлением специфических функций соответствующих данной периферии. Весь функционал функций закодирован в имени этих функций (простите). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Allregia, абсолютно правильный подход Так-таки "абсолютно"? Я инициализирую, например, порты следующим образом (с помощью своих макроопределений): ;;;192 void GPIO_init(void) 000076 4849 LDR r0,|L1.412| ;;;193 { ;;;194 /* Разрешить тактирование портов A, B, C */ ;;;195 RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_GPIOCEN; 000078 301c ADDS r0,r0,#0x1c 00007a 6801 LDR r1,[r0,#0] 00007c f0410107 ORR r1,r1,#7 000080 6001 STR r1,[r0,#0] ;;;196 ;;;197 /* Инициализировать GPIOA */ ;;;198 GPIO_INIT(A, 000082 494b LDR r1,|L1.432| 000084 4849 LDR r0,|L1.428| 000086 6008 STR r0,[r1,#0] 000088 2000 MOVS r0,#0 00008a 8088 STRH r0,[r1,#4] 00008c 4a49 LDR r2,|L1.436| 00008e 608a STR r2,[r1,#8] 000090 2214 MOVS r2,#0x14 000092 60ca STR r2,[r1,#0xc] 000094 f44f72b8 MOV r2,#0x170 000098 620a STR r2,[r1,#0x20] 00009a 4a47 LDR r2,|L1.440| 00009c 624a STR r2,[r1,#0x24] ;;;199 MD_GPO, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA0 ;;;200 MD_AF, OT_PP, SP_400K, PL_PU, AF_USART2, // PA1 ;;;201 MD_AF, OT_PP, SP_400K, PL_PU, AF_TIM2, // PA2 ;;;202 // MD_GPO, OT_PP, SP_10M, PL_PD, AF_SYSTEM, // PA3 - Test ;;;203 MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA3 - ADC3 LQFP48 ;;;204 MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA4 - ADC4 ;;;205 MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA5 - ADC5 ;;;206 MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA6 - ADC6 = VAC1 ;;;207 MD_AN, OT_PP, SP_400K, PL_NP, AF_SYSTEM, // PA7 - ADC7 = VAC2 ;;;208 MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA8 - MSO (USART1) ;;;209 MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA9 - USART1_TX ;;;210 MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA10 - USART1_RX ;;;211 MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA11 ;;;212 MD_AF, OT_PP, SP_10M, PL_NP, AF_USART1, // PA12 ;;;213 MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA13 - JTMS-SWDAT ;;;214 MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM, // PA14 - JTCK-SWCLK ;;;215 MD_AF, OT_PP, SP_10M, PL_NP, AF_SYSTEM); // PA15 - JTDI ;;;216 ;;;217 /* Инициализировать GPIOB */ и т.д. Взгляните, во что выливается код инициализации при использовании библиотечных функций. Потом посмеемся и поплачем... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Не преувеличивайте. Инициализация периферии занимает исчезающе малую долю реального кода. Велика ли будет экономия? Позволит ли она вам взять более дешевый камень? врядли... код будет быстрее? - ну может быть при очень определенных условиях... так за что же борьба? за идею наверное :bb-offtopic: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба за идею наверное За нее. За "абсолютно правильный подход". Еще пример. Сравните с кодом из сообщения топикстартера. Не убеждает? void ADC_init(void) { /* Разрешить тактирование ADC1 */ RCC->CR |= RCC_CR_HSION; // Такты на преобразователь RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // Такты на интерфейс // ADON == 0 // /* 12-bit , Power Down during Idle phase, Scan Mode */ ADC1->CR1 = ADC_CR1_PDI | ADC_CR1_SCAN; /* Sample Time 16 cycles (1 us) for all channels */ ADC1->SMPR1 = ADC1->SMPR2 = ADC1->SMPR3 = 0x2<<27 | 0x2<<24 | 0x2<<21 | 0x2<<18 | 0x2<<15 | 0x2<<12 | 0x2<<9 | 0x2<<6 | 0x2<<3 | 0x2<<0; /* Right alignment, DMA mode disabled, No delay, ADC On */ ADC1->CR2 = ADC_CR2_ADON; /* Wait while !ADONS */ while (!(ADC1->SR & ADC_SR_ADONS)); // ADONS == 1 // /* External Trigger on the rising edge for injected channels, TIM7_TRGO event */ // ADC1->CR2 = ADC_CR2_JEXTEN_0 | ADC_CR2_JEXTSEL_3 | ADC_CR2_JEXTSEL_1; ADC1->CR2 |= ADC_CR2_JEXTEN_0 | ADC_CR2_JEXTSEL_0; // TIM9_TRGO /* Injected channels data offset = 0 */ /* LQFP64 - 4 injected conversions, 15, 14, 7, 6 channels */ // ADC1->JSQR = 0x3<<20 | 15<<15 | 14<<10 | 7<<5 | 6<<0; /* LQFP48 - 4 injected conversions, 8, 3, 7, 6 channels */ ADC1->JSQR = 0x3<<20 | 3<<15 | 8<<10 | 7<<5 | 6<<0; /* Читать регистры ADC_JDRx, когда установится бит JEOC */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Так-таки "абсолютно"? Я инициализирую, например, порты следующим образом (с помощью своих макроопределений): Может еще предложите (не дай бог, конечно) на ассемблере писать? :) Взгляните, во что выливается код инициализации при использовании библиотечных функций. Потом посмеемся и поплачем... А кого это .. волнует? Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? :) Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Может еще предложите (не дай бог, конечно) на ассемблере писать? :) На это отвечу словами kan35: Не преувеличивайте! :) Сколько занимает обьем инициализации, по отношению к остальной програме? 0.01% ? :) Я лично не хочу вообще думать от всяких иициализациях процессора и тому пдобной ерунде, важнее сама задача. А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру. Думаю, что и под 10% можно отхватить, для микроконтроллеров с малым объемом. Если устраивает - пользуйтесь. Меня - не устраивает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба За нее. За "абсолютно правильный подход". Еще пример. Сравните с кодом из сообщения топикстартера. Не убеждает? Сравнил. По сравнеиню с моим - Жуть и Кошмар :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба Сравнил. По сравнеиню с моим - Жуть и Кошмар :) "Цифру, сестра! Цифру!" (с) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 23 июля, 2012 Опубликовано 23 июля, 2012 · Жалоба А на это отвечу - Не преуменьшайте. Подумайте хотя бы раз. Посмотрите, сколько флэш-памяти съедает инициализация, сообщите конкретную цифру. Конкретно указанная выше функция занимет 70 байт. Я наверное просто лопнул бы от счастья сьекономить на ней 10-20 байт.... И даже если бы таких инициализаций было бы полсотня (что в 5 раз болше чем в реале) - подумать только целый килобайт бы сьекономил! Ну был бы это PIC12 или 16 я бы еще подумал.... (справедливости ради - 70 это сама функция, вызываемые ею библиотечные - еще 200, тоже офигенная экономия). Думаю, что и под 10% можно отхватить, для микроконтроллеров с малым объемом. Если Вы не заметили, у используемого мною МК меньше чем с 512кБ в этой серии и не бывает. Конкретная задача у меня сейчас заняла около 70кб. "Цифру, сестра! Цифру!" (с) Какую "цифру"? Там Ваш текст а не цифры. Вот и текст этот - "Жуть и Кошмар" :) P.S. Но примечательно другое - я написал сообщение вчера днем. :1111493779: И за весь вечер и все утро не нашлось ни одного человека. который бы чем-то помог. Зато когда я сам написал что разобрался - тут сразу советчиков стало намного больше :laughing: Короче, давайте на этом закончим. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться