|
STM32F10x, не перестаёт удивлять |
|
|
|
Feb 6 2011, 20:02
|
Частый гость
 
Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233

|
Полдня чесал репу и разлохматил бубен на казалоь бы ровном месте... А именно: имеем некий код в основном цикле, с временем исполнения, определяемым периодом таймера. Таймер запускается перед контролируемым кодом, тот в цикле делает свои дела, а выходит по флагу, к-й устанавливается в обработчике прерывания (Update Event) этого таймера. Таймер запускается перед этим блоком. По так и невыясненным причинам, всё работало после ресета до того момента, пока не происходило некое внешнее прерывание (с приоритетом ниже таймера), делающее быстро другие примитивные дела, не относящиеся к интересующему участку кода. После этого начинались чудеса - на очередном внешнем цикле после запуска таймера код лихо проскакивал проверку while(!bStopDSS), даже не заглянув внутрь, и происходило 2! прерывания от таймера, одно из которых видимо и устанавливало bStopDSS=1 до входа во внутренний цикл. Вылечил проверкой флага прерывания перед включением таймера. Перекорячивается конвейер команд? При включении таймера (строка TIM3->CR1 |= TIM_CR1_CEN) ещё не сброшен бит прерывания? Код volatile uint8_t bStopDSS; while(1) // внешний цикл { bStopDSS = 0; TIM3->CNT = 0; TIM3->SR = ~TIM_IT_Update; while(TIM3->SR & TIM_IT_Update); // без этой проверки - чудеса TIM3->CR1 |= TIM_CR1_CEN;
while(bStopDSS == 0) { // Внутренний цикл, выходим по таймеру. } // ...готовимся к следующему циклу // }
void TIM3_IRQHandler (void) { // Сбрасываем флаг прерывания TIM3->SR = ~TIM_IT_Update; // Останавливаем таймер TIM3->CR1 &= ~TIM_CR1_CEN; // Флаг окончания внутреннего цикла bStopDSS = 1; } Такие дела. В голове смятение.
Сообщение отредактировал pr0m - Feb 6 2011, 20:05
--------------------
Правильно поставленный вопрос - половина ответа...
|
|
|
|
|
 |
Ответов
|
Feb 7 2011, 21:24
|
Участник

Группа: Участник
Сообщений: 72
Регистрация: 7-01-11
Пользователь №: 62 073

|
Цитата В этой ветке переплелись мои вопросы по двум разным проектам. Ах вот оно что, тогда понятно  На счет проверки бита. Вообще-то там не должно быть "чтение-наложение маски-сравнение", наложение маски + сравнение делается хитрее, команд столько же, надо смотреть, что генерит компилятор. Разница в том, что для TIM3->SR может генериться немного другая инструкция чтения, которая длиннее. Можно предварительно положить &TIM3-SR в регистр (присвоить указателю). Сомнения больше на счет детерминированного времени выполнения команд, если оно действительно нужно, то стоило ли выбирать стм32... А что там такого хитрого в цикле, если не секрет?
|
|
|
|
|
Feb 8 2011, 07:03
|
Частый гость
 
Группа: Участник
Сообщений: 183
Регистрация: 22-06-05
Из: Таганрог
Пользователь №: 6 233

|
Цитата(akimych @ Feb 8 2011, 00:24)  На счет проверки бита. Вообще-то там не должно быть "чтение-наложение маски-сравнение", наложение маски + сравнение делается хитрее, команд столько же, надо смотреть, что генерит компилятор. Разница в том, что для TIM3->SR может генериться немного другая инструкция чтения, которая длиннее. Можно предварительно положить &TIM3-SR в регистр (присвоить указателю). Сомнения больше на счет детерминированного времени выполнения команд, если оно действительно нужно, то стоило ли выбирать стм32... А что там такого хитрого в цикле, если не секрет? Вы наверное имеете ввиду доступ к bit-banding региону, вместо чтения регистра целиком+маска нужного бита? За пару недель тяжело стать гуру в армах, и ассемблер ихний тяжеловат, ещё и компилятор просто так не позволяет __asm вставки делать для thumb-кода. Я в процессе  В цикле - подобие вот этого: DDS на AVR. Там должно стать понятным, почему этот код внутри должен исполняться за детерминированное кол-во тактов - им определяется частота дискретизации, и как следствие, частота самого генерируемого сигнала. Основное отличие моего проекта - вместа резистивного делителя для формирования аналогового сигнала используются бортовые ЦАП-ы, причём оба, и формируют прямой и инверсный формы сигнала, чтобы затем завести их на входы компаратора и получить целевые прямоугольные импульсы с малым джиттером (и у программной, и у аппаратной реализаций DDS на предельных частотах проблема явственная - сильно дрожат фронта, если формировать напрямую прямоугольник). По сути, программная замена DDS от Analog devices, AD9854 можно глянуть для примера. Выбран был скажем так, не STM32, а в целом АРМ - по критерию скорости, потому что в моём проекте максимальная генерируемая частота (синус) требуется выше, чем в ссылке (до 450...500кГц). Код DDS получился 20 тактов, при 72МГц тактвовой ядра Fd=72/20=3.6МГц - 5-6 отсчётов за период 500кГц - приемлемо, без усложнения аналогового фильтра на выходе ЦАП-ов. Я всё ещё не определился окончательно с MCU, потому что к задаче подходят и довольно шустрые C8051F12x, к тому же имеющие нужные 2 ЦАП-а на борту.
--------------------
Правильно поставленный вопрос - половина ответа...
|
|
|
|
Сообщений в этой теме
pr0m STM32F10x Feb 6 2011, 20:02 akimych Интересно то, что после while(TIM3->SR & TI... Feb 6 2011, 21:29 AHTOXA Цитата(pr0m @ Feb 7 2011, 01:02) Такие де... Feb 7 2011, 06:06 pr0m Цитата(AHTOXA @ Feb 7 2011, 09:06) Попроб... Feb 7 2011, 08:42  AHTOXA Цитата(pr0m @ Feb 7 2011, 13:42) Флаг UEV... Feb 7 2011, 09:16   pr0m Цитата(AHTOXA @ Feb 7 2011, 12:16) Однако... Feb 7 2011, 12:20 pr0m Победил. Не была задана группировка с вытеснением ... Feb 7 2011, 14:18 sonycman Цитата(pr0m @ Feb 7 2011, 17:18) Задал пр... Feb 7 2011, 15:21  pr0m Цитата(sonycman @ Feb 7 2011, 18:21) Так ... Feb 7 2011, 15:39   sonycman Цитата(pr0m @ Feb 7 2011, 18:39) Высший-т... Feb 7 2011, 16:04    AHTOXA Цитата(sonycman @ Feb 7 2011, 21:04) По у... Feb 7 2011, 16:17     sonycman Цитата(AHTOXA @ Feb 7 2011, 19:17) Ненене... Feb 7 2011, 16:25      pr0m Цитата(sonycman @ Feb 7 2011, 19:25) Так ... Feb 7 2011, 16:57       sonycman Цитата(pr0m @ Feb 7 2011, 19:57) Нет, одн... Feb 7 2011, 17:11        pr0m Цитата(sonycman @ Feb 7 2011, 20:11) Хм, ... Feb 7 2011, 17:17       AHTOXA Цитата(pr0m @ Feb 7 2011, 21:57) Нет, одн... Feb 7 2011, 17:15        sonycman Цитата(AHTOXA @ Feb 7 2011, 20:15) Всё же... Feb 7 2011, 17:22        pr0m Цитата(AHTOXA @ Feb 7 2011, 20:15) Всё же... Feb 7 2011, 17:31         AHTOXA Цитата(pr0m @ Feb 7 2011, 22:22) А моя пр... Feb 7 2011, 17:32         KnightIgor Цитата(pr0m @ Feb 7 2011, 18:31) А моя пр... Feb 7 2011, 17:58          pr0m Цитата(KnightIgor @ Feb 7 2011, 20:58) По... Feb 7 2011, 18:05      AHTOXA Цитата(sonycman @ Feb 7 2011, 21:04) По у... Feb 7 2011, 17:06 pr0m Разобрался. sonycman прав. 15 подгрупп после ресет... Feb 7 2011, 17:53 sonycman Цитата(pr0m @ Feb 7 2011, 20:53) И что ж ... Feb 7 2011, 18:05  pr0m Цитата(sonycman @ Feb 7 2011, 21:05) В эт... Feb 7 2011, 18:11 akimych Цитата1) Для детерминированности времени исполнени... Feb 7 2011, 19:06 pr0m Цитата(akimych @ Feb 7 2011, 22:06) Стран... Feb 7 2011, 19:31 akimych ЦитатаВы наверное имеете ввиду доступ к bit-bandin... Feb 8 2011, 22:00 pr0m Цитата(akimych @ Feb 9 2011, 01:00) А что... Feb 9 2011, 16:48  ReAl Цитата(pr0m @ Feb 9 2011, 18:48) Не знаю.... Feb 9 2011, 21:08   pr0m Цитата(ReAl @ Feb 10 2011, 00:08) Значени... Feb 10 2011, 06:06    vmp Цитата(pr0m @ Feb 10 2011, 09:06) Спасибо... Feb 10 2011, 07:39     pr0m Цитата(vmp @ Feb 10 2011, 10:39) Преимуще... Feb 10 2011, 12:19    ReAl Цитата(pr0m @ Feb 10 2011, 08:06) Спасибо... Feb 10 2011, 14:07     pr0m Цитата(ReAl @ Feb 10 2011, 17:07) Проблем... Feb 10 2011, 21:48 pr0m Красиво, получается, но основной недостаток - чуть... Feb 11 2011, 14:31 akimych В принципе, запись в буфер и запись в регистр ЦАП-... Feb 13 2011, 02:17 pr0m Цитата(akimych @ Feb 13 2011, 05:17) Изме... Feb 13 2011, 07:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|