18.08.2011, 09:01
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Все товарищи, разобрался! Код полностью нормальный, это лыжи не едут, точнее дебуггер в кейле(4.12) ведет себя странно и некорректно. Стоило открыть окно Memory, вбить туда базовый адрес буфера SRAM и расширить его на весь экран(чтобы весь массив был виден), как по бряку все ячейки загрузились верными значениями. После этого вкладка Watch тоже начала отображать корректную информацию. Вот такой неожиданный косяк.
Цитата:
|
Это ведь не полный проект?
|
Это полный учебный проект.
|
|
|
|
18.08.2011, 10:13
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Да, кеиловский watch меня тоже малость насторожил. Работает из рук вон плохо.
|
|
|
|
22.08.2011, 11:00
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Что-то меня переклинило и я никак не могу понять, надо ли в обработчике IRQ вручную очищать флаг в NVIC-›ICPR?
Смущает то, что запускал два проекта проверки разной периферии, в одном проекте проверки DMA не надо было очищать, так проглатывало:
PHP код:
|
void DMAChannel1_IRQHandler(void)
{
ADC1-›CR2 &= (~ADC_CR2_ADON); //power-off ADC
DMA1-›IFCR = DMA_IFCR_CGIF1 | DMA_IFCR_CTCIF1;//clear DMA interrupt flags
}
|
В другом проекте проверки таймера №6, без очистки постоянно вызывается прерывание:
PHP код:
|
void TIM6_DAC_IRQHandler(void)
{
if(p_stat)
{
GPIOC-›BSRR = LED_ON;//set PC9
p_stat = 0;
}
else
{
GPIOC-›BSRR = LED_OFF;//clear PC9
p_stat = 1;
}
TIM6-›SR = 0;//clear pending flag
NVIC-›ICPR[1] = (1‹‹22);//если здесь не очистить то прерывание не отключается
}
|
|
|
|
|
22.08.2011, 18:23
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Пробовал запускать systick - ему тоже не нужно очищать ICPR, NVIC сам похоже это делает. Но для IRQ TIM6 почему-то так не проканывает. Почему?
Вот проект на микровижн. Тагет stm32f100rb на плате vl-discovery. Мигает светодиодом когда происходит прерывание.
|
|
|
|
22.08.2011, 19:32
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от uk8amk
|
Но для IRQ TIM6 почему-то так не проканывает. Почему?
|
NVIC трогать не надо вообще. Прерывания надо очищать в статусном регистре. В данном случае в таймере. Если этого не сделать, прерывание сработает повторно.
Вот эта запись TIM6-›SR = 0 нифига не работает, потому что сначало надо прочитать регистр, а потом уже занулять. Т.е. там обнуляются только те статусные биты, которые были перед этим считаны. Сделано для того, чтоб не сбрасывались биты, которые появились уже после входа в прерывание.
|
|
|
|
23.08.2011, 11:00
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
TIM6 меня начинает бесить. Мои попытки обнулять TIM6-›SR ни к чему не приводят. Покажите пожалуйста код кот. мигает светодиодо скажем раз в секунду.
PHP код:
|
uint8_t p_stat=0;
void TIM6_DAC_IRQHandler(void)
{
uint16_t temp;
temp = TIM6-›SR;
temp=0;
TIM6-›SR = temp;//clear pending flag
}
|
|
|
|
|
23.08.2011, 12:16
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Глянул более детально осциллом что творится на выходе. Получается что вход в обработчик происходит два раза подряд.
|
|
|
|
24.08.2011, 09:18
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от tanq
|
Вот эта запись TIM6-›SR = 0 нифига не работает, потому что сначало надо прочитать регистр, а потом уже занулять.
|
Если не трудно, приведите пожалуйста документ и страницу где про это почитать. В мануале про это не смог найти.
Пробовал смотреть отладчиком состояние статусного регистра. Флажок UIF сбрасывается всегда при записи нулей, вне зависисмости от того, читал я его до этого или нет.
Теперь ближе к моей проблеме. Флажок в обработчике сбрасывается, я выхожу из прерывания, затем тутже меня снова забрасывает в этот обработчик. Я вижу что флажок сброшен, но прерывание же сгенерировалось! Теперь опять зануляется этот неустановленный флажок и прерывание замолкает надолго до следующего события обновления таймера.
Хм.. Сейчас проверил еще один вариант. Сделал сброс флажков два раза подряд:
TIM6-›SR = 0x0000;
TIM6-›SR = 0x0000;
И все заработало... Что это, глюк кейла, сбой чипа?
ЗЫ. Errata читал, про ТИМ6 и ТИМ7 там пусто.
|
|
|
|
24.08.2011, 13:25
|
|
Гражданин KAZUS.RU
Регистрация: 12.10.2009
Сообщений: 576
Сказал спасибо: 30
Сказали Спасибо 138 раз(а) в 110 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от uk8amk
|
Сделал сброс флажков два раза подряд:
|
Похоже на глюк, не знаю чей. У меня GCC и работает следующая конструкция:
TIM6-›SR &= ~TIM_SR_UIF
Данная фича описана в описании регитсра SR.
|
|
|
|
24.08.2011, 14:25
|
|
Прохожий
Регистрация: 03.08.2011
Сообщений: 4
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Доброго времени суток!! Начал осваивать Ethernet.. столкнулся с интерфейсом MII (RMII). Собственно пока больше вопросов чем ответов, в какой регистр записывать данные, откуда считывать ну и т. д...... Кто уже с ним работал? скиньте проектик....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:01.
|
|