05.09.2011, 12:28
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
^smbd^
В этом коде похоже что событие для TRGO выбрано не то. Кроме того, из-за криворукости инженеров АЦП запускается от TRGO не по фронту, а по уровню. Обнаружил это на STM8, но там почти такой же АЦП. По этой причине Запутить АЦП от таймера можно только по переполнению, а по compare event - уже нет, потому что он начинает постоянно там запускаться, когда TRGO=1.
Сообщение от pve70
|
А успеет процессор сделать это?
|
Успеет, прерывание срабатывает при более высоком напряжении чем собственно отключение процессора.
|
|
|
|
05.09.2011, 14:39
|
|
Частый гость
Регистрация: 18.01.2011
Сообщений: 21
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от tanq
|
^smbd^
В этом коде похоже что событие для TRGO выбрано не то. Кроме того, из-за криворукости инженеров АЦП запускается от TRGO не по фронту, а по уровню. Обнаружил это на STM8, но там почти такой же АЦП. По этой причине Запутить АЦП от таймера можно только по переполнению, а по compare event - уже нет, потому что он начинает постоянно там запускаться, когда TRGO=1.
Успеет, прерывание срабатывает при более высоком напряжении чем собственно отключение процессора.
|
а я и не по компаре эвент я по TRGO timer 3.
Что значит не то?
А если делаю вот так:
Цитата:
|
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-›CR1 |= ADC_CR1_EOCIE; // вкл. прерывания
ADC1-›SQR1&=~ ADC_SQR1_L;
//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 ADC1_IRQHandler(void)
{
/*Написали на монитор*/
lcd_clear();
set_cursor(0,0);
lcd_print ("ADC:");
set_cursor(0,1);
lcd_print(itoa(ADC1-›DR,10));
ADC1-›SR&=~ADC_SR_EOC;
}
|
Все отлично работает.
Так что дело вряд ли в ТРГО. Внизу кусок референса.
Последний раз редактировалось ^smbd^; 05.09.2011 в 14:42.
|
|
|
|
05.09.2011, 17:55
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
^smbd^
Я не об этом. Я не понял что у таймера используется в качестве выхода TRGO? Для update должно быть 0b010.
В инициализаторе DMA мне не навится следующее: размерность данных надо 16 бит, а не 32; memory increment действительно нужен; надо использовать циклический режим.
Видимо, проблема в том что не использован циклический режим. Без него DMA сам отключится после запонения буфера 256 байтов. А с повторным включением там что-то не так. У меня тоже были странности после того как АЦП пытался слить данные в выключенный канал DMA.
|
|
|
|
05.09.2011, 19:00
|
|
Частый гость
Регистрация: 20.03.2010
Сообщений: 27
Сказал спасибо: 10
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от tanq
|
^smbd^
Я не об этом. Я не понял что у таймера используется в качестве выхода TRGO? Для update должно быть 0b010.
В инициализаторе DMA мне не навится следующее: размерность данных надо 16 бит, а не 32; memory increment действительно нужен; надо использовать циклический режим.
Видимо, проблема в том что не использован циклический режим. Без него DMA сам отключится после запонения буфера 256 байтов. А с повторным включением там что-то не так. У меня тоже были странности после того как АЦП пытался слить данные в выключенный канал DMA.
|
Где должно быть 0b010? В TIM3-›СR2?
Дак он чет ни разу в прерывание не выпадывал...
Спробую завтра с циклическим режимом. О результатах напишу.
Последний раз редактировалось <smbd>; 05.09.2011 в 19:09.
|
|
|
|
05.09.2011, 20:04
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от ‹smbd›
|
Где должно быть 0b010? В TIM3-›СR2?
|
да, но c необходимым сдвигом
Сообщение от ‹smbd›
|
Дак он чет ни разу в прерывание не выпадывал...
|
Это вообще не понятно, хоть один раз должен был вызвать прерывание.
TIM3 тоже неверно настроен. Там надо сначала задать все параметры, потом вручную сделать update, после этого уже включать отсчет. Иначе ARR и проч. пропишутся только после первого переполнения.
Инициализация тоже не так, логичнее сначала DMA включить, потом ADC, а после уж таймер. В текущем варианте DMA настраивается при уже работающем АЦП... Тут необходимо понимать, что в STM много глюков в тех местах, которые на практике не используются и не нужны. Если инициалазаровать переферию задом наперед, то произойдет какое-нибудь нестандартное поведение, которое не описано в документации и вообще лишено смысла.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо tanq за это сообщение:
|
|
|
06.09.2011, 07:59
|
|
Частый гость
Регистрация: 18.01.2011
Сообщений: 21
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Я пишу этот бит
Цитата:
|
#define TIM_CR2_MMS_1 ((uint16_t)0x0020) /*!‹Bit 1 */
|
исходя из
Цитата:
|
010: Update - The update event is selected as trigger output (TRGO). For instance a master
timer can then be used as a prescaler for a slave timer.
|
вручную поставил
Цитата:
|
TIM3-›EGR |=TIM_EGR_UG; // Сгенерировали update
|
Включил циклический режим DMA:
Цитата:
|
DMA1_Channel1-›CCR |=DMA_CCR1_CIRC ; //Включил циклический режимì
|
Изменил размерность на 16 бит.Кстати , там точно не ссылка на память должна быть , как мне вначале сделать хотелось?
Цитата:
|
DMA1_Channel1-›CCR |= DMA_CCR1_MSIZE_0; //размер памяти 16 bit
DMA1_Channel1-›CCR |=DMA_CCR1_PSIZE_0 ; //размер периферии 16 bit
|
Изменил порядок инициализации периферии.
Цитата:
|
RCC_Init();
Port_Init();
DMA_Init();
ADC_Init();
TIM3_Init();
|
Все равно не работает. Теперь почему-то и уходит куда-то в файл инициализации. То есть не заходит в главный цикл. Похоже теперь проблема с прерыванием. Если тормознуть , то в буфере в первой ячейке есть что-то. В прерывание как не падало так и не падает.
Последний раз редактировалось ^smbd^; 06.09.2011 в 12:27.
|
|
|
|
06.09.2011, 12:14
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
TIM, надо настраивать, а потом уже включать...
Примерно так:
Код:
|
TIM3-›PSC = 999;
TIM3-›ARR =10000;
TIM3-›CR1 = TIM_CR1_URS | TIM_CR1_ARPE;
TIM3-›EGR =TIM_EGR_UG;
TIM3-›CR2 |= TIM_CR2_MMS_1;
NVIC_SetPriority(TIM3_IRQn, 13);
TIM3-›CR1 |= TIM_CR1_CEN |
В регистры DMA надо вставлять адрес первого элемента, но вроде так и сделано?
|
|
|
|
06.09.2011, 14:02
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Если не совсем понимаете работу почему бы не воспользоваться либами, а потом уже "выдрать" нужные битики?
__________________
ziblog.ru
|
|
|
|
06.09.2011, 14:28
|
|
Частый гость
Регистрация: 18.01.2011
Сообщений: 21
Сказал спасибо: 5
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от zheleznjakov
|
Если не совсем понимаете работу почему бы не воспользоваться либами, а потом уже "выдрать" нужные битики?
|
Ну вот к чему этот Ваш комментарий? Помощи-ноль, или для бахвальства сугубо?
|
|
|
|
06.09.2011, 17:01
|
|
Прописка
Регистрация: 31.03.2010
Сообщений: 200
Сказал спасибо: 3
Сказали Спасибо 48 раз(а) в 41 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от ^smbd^
|
Ну вот к чему этот Ваш комментарий? Помощи-ноль, или для бахвальства сугубо?
|
Я задал вам вопрос и хотел узнать почему вы не пошли по этому пути?
Без всяких претензий к вам. Когда у меня есть время и возможность я стараюсь всегда помочь. Да и проще помочь с один простым вопросом, чем с большой задачей. Я сам самоучка и то же много чего не понимаю.
__________________
ziblog.ru
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:13.
|
|