Страница 1 из 1
Прошивка STM32
Добавлено: Сб апр 09, 2016 13:54:12
Юрий199
Здравствуйте. Использую stm32f103c8t6, EmBits 0.42 и st-link v2. Программа в контроллере исполняется только после запуска сессии отладки. Запустил, нажал run и все работает, после этого хоть среду разработки закрывай. А если сбросить контроллер или просто прршить, а потом подать питание, ничего не происходит. В чем может быть причина?
Re: Прошивка STM32
Добавлено: Сб апр 09, 2016 13:58:32
uldemir
Может быть неправильно поданы сигналы на входы boot, выбирающие с кого начинать выполнение после включения?
Re: Прошивка STM32
Добавлено: Сб апр 09, 2016 18:41:09
Юрий199
Никак нет. Подал на оба входа BOOT нули (замкнул на минус), но это ничего не поменяло. Программа во флеше есть точно. При подаче питания на BOOT0 и BOOT1 по 0,7V при подаче питания.
Re: Прошивка STM32
Добавлено: Сб апр 09, 2016 20:15:17
Юрий199
Что-то не так со средой разработки. При написании того же кода из CooCox все работает в штатном режиме.
Re: Прошивка STM32
Добавлено: Вс апр 10, 2016 17:24:22
pixar
отладка в ОЗУ
Re: Прошивка STM32
Добавлено: Ср апр 13, 2016 21:50:51
Юрий199
Да, спасибо, дело было в этом.
Re: Прошивка STM32
Добавлено: Вс апр 17, 2016 18:57:47
Юрий199
Ещё есть вопрос. Настроил прерывания по переполнению таймера 2. На прерывание он уходит, но флаг упорно сбрасывать не хочет, если в регистре ARR не 0. При чём изменить значение флагов невозможно даже через отладчик, пока в ARR не пусто.
Инициализация:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM2->PSC=10;
TIM2->ARR=2057;
TIM2->DIER|=TIM_DIER_UIE;
TIM2->CR1 |=TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn,4);
Прерывание:
void TIM2_IRQHandler(void)
{
TIM2->ARR=0; //Сброс
while(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR =~TIM_SR_UIF; //Сбрасываем флаг
};
TIM2->ARR=2057;
};
Re: Прошивка STM32
Добавлено: Вс апр 17, 2016 19:10:20
uldemir
Re: Прошивка STM32
Добавлено: Вс апр 17, 2016 19:33:04
Z_h_e
pixar писал(а):отладка в ОЗУ
Юрий199 писал(а):Да, спасибо, дело было в этом.
Юрий199, у меня к Вам вопрос. Если у Вас была отладка в ОЗУ, Вы же должны были сменить адрес таблицы векторов прерываний. Или кейл автоматом его меняет?
Re: Прошивка STM32
Добавлено: Вс апр 17, 2016 20:08:55
Юрий199
Не помогало. У меня программатор st/linkV2 - позволяет смотреть и менять значения в регистрах периферии и процессора, но даже прямой записью значения флаг не сбрасывался. В то время, как на другом таймере, не использующим ARR, все флаги можно было устанавливать/сбрасывать через отладчик.
Z_h_e писал(а):pixar писал(а):отладка в ОЗУ
Юрий199 писал(а):Да, спасибо, дело было в этом.
Юрий199, у меня к Вам вопрос. Если у Вас была отладка в ОЗУ, Вы же должны были сменить адрес таблицы векторов прерываний. Или кейл автоматом его меняет?
У меня не кейл, а EmBitz (EmBlocks). У него 2 режима debug и release. В режиме Release, при прошитом контроллере, достаточно просто подать на него питание. В debug, скорее всего, таблицу сам меняет. Только я сомневаюсь, что код исполняется из ОЗУ. Сервер при старте всё равно пишет, что прошивает FLASH.
Re: Прошивка STM32
Добавлено: Вс апр 17, 2016 20:37:12
Z_h_e
Юрий199 писал(а):позволяет смотреть и менять значения в регистрах периферии и процессора,
Область памяти переферии USB через ST-Link2 и кокос я просматривать не мог, добавлял код, копирующий данные в ОЗУ и глядел уже оттуда. Но как не мог, данные то какие-то показывал типа 0xFF или может нули. Я к тому, что как оказалось не все можно увидеть. Может еще чего не видно.
Z_h_e писал(а):В debug, скорее всего, таблицу сам меняет. Только я сомневаюсь, что код исполняется из ОЗУ.
Дебаг и исполнение в ОЗУ разные вещи. Оба режима могут быть и во флеш и в озу. Если Ваш код исполняется в ОЗУ или отлаживается то надо менять адрес таблицы прерываний, на нее спец. регистр указывает. В Кокосе я так делал
Код: Выделить всё
int main(void)
{ //адрес таблицы векторов прерываний
SCB->VTOR = 0x20000000;
...
Re: Прошивка STM32
Добавлено: Ср апр 20, 2016 16:08:26
Юрий199
Юрий199 писал(а):Ещё есть вопрос. Настроил прерывания по переполнению таймера 2. На прерывание он уходит, но флаг упорно сбрасывать не хочет, если в регистре ARR не 0. При чём изменить значение флагов невозможно даже через отладчик, пока в ARR не пусто.
Инициализация:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM2->PSC=10;
TIM2->ARR=2057;
TIM2->DIER|=TIM_DIER_UIE;
TIM2->CR1 |=TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
NVIC_SetPriority(TIM2_IRQn,4);
Прерывание:
void TIM2_IRQHandler(void)
{
TIM2->ARR=0; //Сброс
while(TIM2->SR & TIM_SR_UIF)
{
TIM2->SR =~TIM_SR_UIF; //Сбрасываем флаг
};
TIM2->ARR=2057;
};
Так что с этим?
Re: Прошивка STM32
Добавлено: Чт апр 21, 2016 07:24:00
dosikus
Невнимательность?
ARR оставьте в покое...