Прошивка STM32
Прошивка STM32
Здравствуйте. Использую stm32f103c8t6, EmBits 0.42 и st-link v2. Программа в контроллере исполняется только после запуска сессии отладки. Запустил, нажал run и все работает, после этого хоть среду разработки закрывай. А если сбросить контроллер или просто прршить, а потом подать питание, ничего не происходит. В чем может быть причина?
- Реклама
Re: Прошивка STM32
Может быть неправильно поданы сигналы на входы boot, выбирающие с кого начинать выполнение после включения?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: Прошивка STM32
Никак нет. Подал на оба входа BOOT нули (замкнул на минус), но это ничего не поменяло. Программа во флеше есть точно. При подаче питания на BOOT0 и BOOT1 по 0,7V при подаче питания.
Re: Прошивка STM32
Что-то не так со средой разработки. При написании того же кода из CooCox все работает в штатном режиме.
Re: Прошивка STM32
отладка в ОЗУ
- Реклама
Re: Прошивка STM32
Да, спасибо, дело было в этом.
Re: Прошивка STM32
Ещё есть вопрос. Настроил прерывания по переполнению таймера 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;
};
Инициализация:
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
Код: Выделить всё
TIM2->SR &= ~TIM_SR_UIF;А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Прошивка STM32
pixar писал(а):отладка в ОЗУ
Юрий199, у меня к Вам вопрос. Если у Вас была отладка в ОЗУ, Вы же должны были сменить адрес таблицы векторов прерываний. Или кейл автоматом его меняет?Юрий199 писал(а):Да, спасибо, дело было в этом.
Re: Прошивка STM32
Не помогало. У меня программатор st/linkV2 - позволяет смотреть и менять значения в регистрах периферии и процессора, но даже прямой записью значения флаг не сбрасывался. В то время, как на другом таймере, не использующим ARR, все флаги можно было устанавливать/сбрасывать через отладчик.uldemir писал(а):Код: Выделить всё
TIM2->SR &= ~TIM_SR_UIF;
У меня не кейл, а EmBitz (EmBlocks). У него 2 режима debug и release. В режиме Release, при прошитом контроллере, достаточно просто подать на него питание. В debug, скорее всего, таблицу сам меняет. Только я сомневаюсь, что код исполняется из ОЗУ. Сервер при старте всё равно пишет, что прошивает FLASH.Z_h_e писал(а):pixar писал(а):отладка в ОЗУЮрий199, у меня к Вам вопрос. Если у Вас была отладка в ОЗУ, Вы же должны были сменить адрес таблицы векторов прерываний. Или кейл автоматом его меняет?Юрий199 писал(а):Да, спасибо, дело было в этом.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Прошивка STM32
Область памяти переферии USB через ST-Link2 и кокос я просматривать не мог, добавлял код, копирующий данные в ОЗУ и глядел уже оттуда. Но как не мог, данные то какие-то показывал типа 0xFF или может нули. Я к тому, что как оказалось не все можно увидеть. Может еще чего не видно.Юрий199 писал(а):позволяет смотреть и менять значения в регистрах периферии и процессора,
Дебаг и исполнение в ОЗУ разные вещи. Оба режима могут быть и во флеш и в озу. Если Ваш код исполняется в ОЗУ или отлаживается то надо менять адрес таблицы прерываний, на нее спец. регистр указывает. В Кокосе я так делалZ_h_e писал(а):В debug, скорее всего, таблицу сам меняет. Только я сомневаюсь, что код исполняется из ОЗУ.
Код: Выделить всё
int main(void)
{ //адрес таблицы векторов прерываний
SCB->VTOR = 0x20000000;
...Re: Прошивка STM32
Так что с этим?Юрий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
Код: Выделить всё
TIM2->SR =~TIM_SR_UIF; //Сбрасываем флагARR оставьте в покое...



