16.08.2011, 20:30
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от zheleznjakov
|
Раньше то же так думал, но сейчас с хорошей начинкой мк и постоянной борьбой за потребление стараюсь по больше спать и по меньше считать
|
Согласен. Если устройство мобильное. Паузы - плохой тон, согласен. Но не всегда есть смысл в хорошем тоне. Иногда прозрачность кода куда важнее. Хотя, вы меня убедили, напишу задержки на таймере и режиме сна. Хотя стоит ли спать ради 4-5мс? Да и ради 100мс стоит ли?
|
|
|
|
16.08.2011, 21:15
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от zheleznjakov
|
Раньше то же так думал, но сейчас с хорошей начинкой мк и постоянной борьбой за потребление стараюсь по больше спать и по меньше считать
|
Всё зависит от задачи и от питания... сетевое или батарейное...
|
|
|
|
16.08.2011, 22:16
|
|
Вид на жительство
Регистрация: 05.09.2007
Адрес: Новороссия ЛНР Рубежное -> РФ Калуга
Сообщений: 360
Сказал спасибо: 10
Сказали Спасибо 73 раз(а) в 58 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
Хотя стоит ли спать ради 4-5мс? Да и ради 100мс стоит ли?
|
Ну так помехочувствительность будет лучше.
__________________
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
Не зли меня
|
|
|
|
17.08.2011, 06:51
|
|
Частый гость
Регистрация: 18.01.2011
Сообщений: 21
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от tanq
|
Я так не пробовал, в даташите вроде упоминается что прерывание будет только после последнего преобразования. Может быть, если отключить флаг ADC_CR1_SCAN, тогда прерывание будет выдаваться каждый раз. Но я не пробовал. Я делал зауск преобразования вручную по таймеру, на 1 канал, - работает.
|
Сейчас прочитал , что обработку более одного канала без дма не сделать.
А как обработку из ДМА сделать?
Ну то есть мне нужно например хотя бы два( три и т.д.) канала ацп, значения из которых обрабатываются программно. Как получить?
Последний раз редактировалось ^smbd^; 17.08.2011 в 08:27.
|
|
|
|
17.08.2011, 09:08
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Да, я тоже поддерживаю вопрос ^smbd^ о совместной работе DMA и ADC. Что-то у меня получается совсем не то, что нужно.
Переменный резистор подключен к PC0(ADC IN 10) .
Буфер adc_buf[] на 256 слов, в него складываются результаты преобразований. По окончании работы dma вызывается прерывание(проверено-работает) окончания передачи, в нем отключаются adc и очищается флаг прерывания.
Симптомы: отладчик на дискавери показывает что adc_buf[0]...adc_buf[15], 64...79, 128...143, 192...207 содержат действительные значения данных АЦП. Остальные индексы просто забиты нулями. Что я делаю не так?
Код:
PHP код:
|
#define STM32F10X_MD_VL
#include "stm32f10x.h"
#define DMA_BUF_LEN 256
unsigned int adc_buf[DMA_BUF_LEN];
// Îáðàáîò÷èê ïðåðûâàíèé
void DMAChannel1_IRQHandler(void)
{
ADC1-›CR2 &= (~ADC_CR2_ADON); //power-off ADC
DMA1-›IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CTCIF1;//clear DMA interrupt flags
}
int main(void)
{
unsigned int i;
//Clock config
RCC-›AHBENR = RCC_AHBENR_DMA1EN;
RCC-›APB2ENR = RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_ADC1EN;
GPIOC-›CRL = 0; // analog input
//DMA1 Ch1 config
DMA1_Channel1-›CPAR = (unsigned int) (&ADC1-›DR);//peripheral adress
DMA1_Channel1-›CMAR = (unsigned int) adc_buf;//memory adress
DMA1_Channel1-›CNDTR = (unsigned int) DMA_BUF_LEN;
DMA1_Channel1-›CCR = DMA_CCR1_MSIZE_1 | DMA_CCR1_PSIZE_1 | DMA_CCR1_MINC | DMA_CCR1_TCIE | DMA_CCR1_EN;
//DMA1_Channel1-›CCR = (2‹‹10) | (2‹‹8) | (1‹‹7) | (1‹‹1) | (1‹‹0);
//NVIC config
NVIC-›ISER[0] = (1‹‹11);//enable DMA_ch1 line
//ADC1 config
//ADC1-›CR2 = ADC_CR2_EXTTRIG | (0x07‹‹17) | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON;
ADC1-›CR2 = ADC_CR2_CONT | ADC_CR2_DMA | ADC_CR2_ADON;
ADC1-›SMPR1 = 1;//7.5 cycles for ch10
ADC1-›SMPR2 = 0;
ADC1-›SQR3 = 10;//len=1, ch=10
for(i=0; i‹1000; i++);//delay for ADC Tstab
//ADC1-›CR2 |= ADC_CR2_SWSTART; //start ADC conversion
ADC1-›CR2 |= ADC_CR2_ADON;
while(1);
}
|
Проект uVision4.
|
|
|
|
17.08.2011, 12:58
|
|
Частый гость
Регистрация: 18.01.2011
Сообщений: 21
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от uk8amk
|
Да, я тоже поддерживаю вопрос ^smbd^ о совместной работе DMA и ADC. Что-то у меня получается совсем не то, что нужно.
Переменный резистор подключен к PC0(ADC IN 10) .
Буфер adc_buf[] на 256 слов, в него складываются результаты преобразований. По окончании работы dma вызывается прерывание(проверено-работает) окончания передачи, в нем отключаются adc и очищается флаг прерывания.
Симптомы: отладчик на дискавери показывает что adc_buf[0]...adc_buf[15], 64...79, 128...143, 192...207 содержат действительные значения данных АЦП. Остальные индексы просто забиты нулями. Что я делаю не так?
Код:
Проект uVision4.
|
Это ведь не полный проект?
Я мельком посмотрел и не увидел ни инициализации системы тактирования, ни инициализации портов.
У меня , кстати почему-то и в прерывание твое не убегает.
Вот моя новая настройка АЦП:
Цитата:
|
void ADC_init(void) // Инициализация ацп
{
RCC-›APB2ENR |= RCC_APB2ENR_ADC1EN; // подаем такты на АЦП
ADC1-›CR2 |= ADC_CR2_ADON; // подаем питание на АЦП
ADC1-›CR2 |= ADC_CR2_EXTTRIG; // включаем запуск от внешнего события
ADC1-›CR2 |= ADC_CR2_EXTSEL_2; // Запуск по TRGO Timer 3
ADC1-›CR2 |= ADC_CR2_DMA; // включаю DMA
ADC1-›SQR1|= ADC_SQR1_L_0; // Выставили колличество преобразований равным 2
ADC1-›CR1 |= ADC_CR1_SCAN; // Режим сканирования
ADC1-›SQR3 |= ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_2|ADC_SQR3_SQ1_3;//На 14 канал 1-е преобр
ADC1-›SQR3 |=ADC_SQR3_SQ2_0| ADC_SQR3_SQ2_1 | ADC_SQR3_SQ2_2|ADC_SQR3_SQ2_3; //На 15 канал 2-е преобр
for (i=0; i‹20; i++) __NOP(); //wait 1 us
ADC1-›CR2 |= ADC_CR2_CAL; //start calibration
while(ADC1-›CR2 & ADC_CR2_CAL); //wait
NVIC_SetPriority(ADC1_IRQn, 10);
}
|
Вот так настраиваю ПДП:
Цитата:
|
void DMA_init(void)
{
RCC-›AHBENR |= RCC_AHBENR_DMA1EN; // подаю такты на DMA1
DMA1_Channel1-›CPAR= (uint32_t) &ADC1-›DR; //адрес периферийного устройства
DMA1_Channel1-›CMAR = (unsigned int) adc_buf;//адрес памяти
DMA1_Channel1-›CNDTR |= DMA_CNDTR2_NDT; //колличество регистров2
DMA1_Channel1-›CCR |=DMA_CCR1_CIRC //использовать цикличный режим ( не уверен, что надо)
DMA1_Channel1-›CCR |= DMA_CCR1_MSIZE_1; //размер памяти 32 bit
DMA1_Channel1-›CCR |=DMA_CCR1_PSIZE_1 ; //размер периферии 32 bit
DMA1_Channel1-›CCR |=DMA_CCR1_MINC ; //memory increment mode ( не уверен что надо)
DMA1_Channel1-›CCR |= DMA_CCR1_TCIE ; // прерывание по окончанию передачи
DMA1_Channel1-›CCR |=DMA_CCR1_EN; // разрешаем работу
}
|
в мейне пишу
Цитата:
|
NVIC_EnableIRQ(DMA1_Channel1_IRQn);
|
прерывание
Цитата:
|
void DMAChannel1_IRQHandler(void) // Прерывание от DMA
{
DMA1-›IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CTCIF1;//clear DMA interrupt flags
}
|
Компилирую, запускаю.
В прерывание не сваливается, в буфер ниче не пишет.
Что я делаю не так?
Последний раз редактировалось ^smbd^; 17.08.2011 в 13:42.
|
|
|
|
17.08.2011, 19:13
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Если опыта мало, возьмите пример от либы разберитесь с ним, на его основе попробуйте собрать свое решение, а потом можно уже и отдельные битики переключать.
__________________
ziblog.ru
|
|
|
|
17.08.2011, 19:42
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
У меня DMA нормально работает.
Сообщение от ^smbd^
|
Что я делаю не так?
|
Вроде все правильно, хотя команды на включение АЦП в этом коде нет.
|
|
|
|
17.08.2011, 21:08
|
|
Частый гость
Регистрация: 20.03.2010
Сообщений: 27
Сказал спасибо: 10
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от ^smbd^
|
ADC1-›CR2 |= ADC_CR2_ADON; // подаем питание на АЦП
|
А это?
Хотя наверно по логике его в конец инициализации надо...
|
|
|
|
17.08.2011, 23:22
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Питание - это питание. А для запуска надо еще раз ADON после всех инициализаций.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:32.
|
|