Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
FLASH_Latency_2 действительно закомментировал, я вычитал что это надо только при использовании FLASH как eeprom,
но если раскомментировать, то ничего не меняется.
Я сделал тестовый урезанный проект он только пищит динамиком и мигает светодиодами, как только ставлю версию 6
всё перестаёт работать, возвращаю 5 версию, всё нормально.
Тестовый проект: https://yadi.sk/d/xwyvEO6iD7pzQQ
Там внутри проект для Протеуса 8.7 на нём этот глюк тоже видно.
но если раскомментировать, то ничего не меняется.
Я сделал тестовый урезанный проект он только пищит динамиком и мигает светодиодами, как только ставлю версию 6
всё перестаёт работать, возвращаю 5 версию, всё нормально.
Тестовый проект: https://yadi.sk/d/xwyvEO6iD7pzQQ
Там внутри проект для Протеуса 8.7 на нём этот глюк тоже видно.
- Реклама
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Ошибка 1 -повторять один в один код для авр.
Ошибка 2- в протеусе модель с глюками.
DENIS451, хочешь ты или не хочешь а изучать железо придеться
Готов ли ты к этому, или так и будешь тыркаться?
Ошибка 2- в протеусе модель с глюками.
DENIS451, хочешь ты или не хочешь а изучать железо придеться
Готов ли ты к этому, или так и будешь тыркаться?
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Запустите отладку и посмотрите из-за чего программа не работает.
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Я ещё не умею запускать отладку, дайте ссылку на статью, или видео обучающие как это сделать.
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
DENIS451 ,
1. Компилятор 6-й версии оптимизирует твой проект
Cделай так: for(volatile int i=0;i<0x5AE8BA;i++); /* delay */ и всё замигает.
2. До запуска функции main() выполняется функция SystemInit(). В ней тактирование уже настроено на 72 МГц. Повторять это в main никакого смыла нет. Блок { //Настройка тактирования } можешь смело выкинуть.
3. Сейчас ты пока не используешь прерывания, но на будущее. У тебя глобальная переменная n_led будет соптимизирована. Либо ей тоже volatile поставь, либо static и внутрь прерывания.
4. И вообще, все переменные определяй как можно локальней. stethik_kn место внутри main. i внутри for. Во-первых, так компилятору проще оптимизировать. Во-вторых, ты же меньше ошибок понаделаешь.
5. Ошибка 1 от dosikus . Наработки с AVR по работе с железом забудь. Можешь какие-то высокоуровневые протокольные вещи взять, но I2C уж точно с нуля надо писать (копипастить у более опытных), такова плата за переход на ARM. Да, какое-то время будет непросто, но зато потом "полетит".
[uquote="DENIS451",url="/forum/viewtopic.php?p=3512459#p3512459"]Я ещё не умею запускать отладку[/uquote]
CTRL+F5
PS:
6. Солнце, воздух и вода Отладчик, осциллограф и логический анализатор наши лучшие друзья
7. Для начала убери оптимизацию на минимум. Лучше, конечно, сразу писать правильно под оптимизатор, но эти грабли надо самому пройти, иначе трудно понять почему же он выпиливает код.
8. Научись заглядывать в листинги. Там часто видно разного рода "непонятки".
1. Компилятор 6-й версии оптимизирует твой проект
2. До запуска функции main() выполняется функция SystemInit(). В ней тактирование уже настроено на 72 МГц. Повторять это в main никакого смыла нет. Блок { //Настройка тактирования } можешь смело выкинуть.
3. Сейчас ты пока не используешь прерывания, но на будущее. У тебя глобальная переменная n_led будет соптимизирована. Либо ей тоже volatile поставь, либо static и внутрь прерывания.
4. И вообще, все переменные определяй как можно локальней. stethik_kn место внутри main. i внутри for. Во-первых, так компилятору проще оптимизировать. Во-вторых, ты же меньше ошибок понаделаешь.
5. Ошибка 1 от dosikus . Наработки с AVR по работе с железом забудь. Можешь какие-то высокоуровневые протокольные вещи взять, но I2C уж точно с нуля надо писать (копипастить у более опытных), такова плата за переход на ARM. Да, какое-то время будет непросто, но зато потом "полетит".
[uquote="DENIS451",url="/forum/viewtopic.php?p=3512459#p3512459"]Я ещё не умею запускать отладку[/uquote]
CTRL+F5
PS:
6. Солнце, воздух и вода Отладчик, осциллограф и логический анализатор наши лучшие друзья
7. Для начала убери оптимизацию на минимум. Лучше, конечно, сразу писать правильно под оптимизатор, но эти грабли надо самому пройти, иначе трудно понять почему же он выпиливает код.
8. Научись заглядывать в листинги. Там часто видно разного рода "непонятки".
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Спасибо, за разъяснения.
После добавления volatile в Пртеусе без изменений, а в железе запустил отладку, пошагово прошёл по коду, в конце
контроллер заработал как положено, я решил проверить что будет если убрать volatile и ещё раз прошить в контроллер
прошивку - не заработало, тогда вернул volatile прошил запустил отладку, но теперь отладка застревает в самом начале
(см. 1.png)
Добавлено after 11 minutes 49 seconds:
Странно, но сейчас вроде в железе опять заработало.
После добавления volatile в Пртеусе без изменений, а в железе запустил отладку, пошагово прошёл по коду, в конце
контроллер заработал как положено, я решил проверить что будет если убрать volatile и ещё раз прошить в контроллер
прошивку - не заработало, тогда вернул volatile прошил запустил отладку, но теперь отладка застревает в самом начале
(см. 1.png)
Добавлено after 11 minutes 49 seconds:
Странно, но сейчас вроде в железе опять заработало.
- Вложения
-
- 1.png
- (91.93 КБ) 265 скачиваний
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Неверный инит тактовой, к примеру неправильная частота кварца или отсутствие его. Файл систем_xxx сгенерен экселовской тулзой и может быть совсем не тот что нужен.
Выкладывай.
Выкладывай.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
У него там при переключении на 6-й компилер максимальная оптимизация стоит. Вот оно и отваливается без volatile. Вернее не отваливается, а мигает светодиодом на килогерцы. Ну и с отладкой, само собой, при максимальной оптимизации он не разберётся. А SystemInit там стандартный кейловский - нормально всё на 72 выставляется и флэшь настраивается, я глянул.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
[uquote="DENIS451",url="/forum/viewtopic.php?p=3512761#p3512761"]Проект:[/uquote]Вот ты упёртый. Говорят же тебе, что при входе в main уже выставлена частота 72 МГц. Выкинуть настройки тактирования из main нах!
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Я так и сделал, вынес код "настройка тактирования" в отдельную функцию а на месте кода вызов этой функции, после чегоВот ты упёртый. Говорят же тебе, что при входе в main уже выставлена частота 72 МГц. Выкинуть настройки тактирования из main нах!
провел эксперименты с вызовом этой функции и без неё:
без этой функции на компиляторе 6.7 отладка в железе идет нормально, и даже в Протеусе прошивка работает.
Что не так с этим кодом?
Спойлер
Код: Выделить всё
void clock_ini(void)
{ //настройка тактирования
ErrorStatus HSEStartUpStatus;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
RCC_DeInit(); /* Системный RESET RCC (делать не обязательно, но полезно на этапе отладки) */
RCC_HSEConfig( RCC_HSE_ON); /* Включаем HSE (внешний кварц) */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); /* Ждем пока HSE будет готов */
if (HSEStartUpStatus == SUCCESS) /* Если с HSE все в порядке */
{
/* Следующие две команды касаются исключительно работы с FLASH.
Если вы не собираетесь использовать в своей программе функций работы с Flash,
FLASH_PrefetchBufferCmd( ) та FLASH_SetLatency( ) можно закомментировать */
//FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable); /* Включаем Prefetch Buffer */
/* FLASH Latency.
Рекомендовано устанавливать:
FLASH_Latency_0 - 0 < SYSCLK? 24 MHz
FLASH_Latency_1 - 24 MHz < SYSCLK ? 48 MHz
FLASH_Latency_2 - 48 MHz < SYSCLK ? 72 MHz */
FLASH_SetLatency( FLASH_Latency_2);
RCC_HCLKConfig( RCC_SYSCLK_Div1); /* HCLK = SYSCLK */ /* Смотри на схеме AHB Prescaler. Частота не делится (RCC_SYSCLK_Div1) */
RCC_PCLK2Config( RCC_HCLK_Div1); /* PCLK2 = HCLK */ /* Смотри на схеме APB2 Prescaler. Частота не делится (RCC_HCLK_Div1) */
RCC_PCLK1Config( RCC_HCLK_Div2); /* PCLK1 = HCLK/2 */ /* Смотри на схеме APB1 Prescaler. Частота делится на 2 (RCC_HCLK_Div2) потому что на выходе APB1 должно быть не более 36МГц (смотри схему) */
/* PLLCLK = 8MHz * 9 = 72 MHz */
/* Указываем PLL от куда брать частоту (RCC_PLLSource_HSE_Div1) и на сколько ее умножать (RCC_PLLMul_9) */
/* PLL может брать частоту с кварца как есть (RCC_PLLSource_HSE_Div1) или поделенную на 2 (RCC_PLLSource_HSE_Div2). Смотри схему */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd( ENABLE); /* Включаем PLL */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Ждем пока PLL будет готов */
RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Переключаем системное тактирование на PLL */
while (RCC_GetSYSCLKSource() != 0x08) {} /* Ждем пока переключиться */
}
else /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */
{
while (1) {} /* Пока тут заглушка - вечный цикл*/
}
}http://www.avislab.com/blog/stm32-clock_ru/
?
А если я захочу изменить настройки которые в этой функции, что делать?
FLASH_SetLatency( FLASH_Latency_2); что делает эта функция?
Пытался поставить компилятор версии 6.11 отсюда:
https://developer.arm.com/products/soft ... /version-6
Он что , к лицензии Кейла привязан?
Последний раз редактировалось DENIS451 Вс ноя 25, 2018 17:34:12, всего редактировалось 1 раз.
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Флеш может только на 24МГц работать, что бы она смогла работать с системной тактовой выше нужны задержки.
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
То есть, если я пытаюсь записывать ничего во флэш я могу вообще делитель FLASH_SetLatency( FLASH_Latency_2); у себя в проекте не настраивать?Флеш может только на 24МГц работать, что бы она смогла работать с системной тактовой выше нужны задержки.
Второй вопрос -что не так с кодом для настройки тактирования, если даже есть настройки по умолчанию в SystemInit(),
этот код в худшем случае должен занимать место в прошивке, но не как не приводить к неработоспособности программы?
Третий вопрос - зачем здесь: http://www.avislab.com/blog/keil_ru/ предлагают прописать STM32F10X_CL ?

STM32F10X_CL у меня не прописан, проект не соберётся, на картинке вообще STM32F10X_MD!
Листинг SystemInit() из файла system_stm32f10x.c
Спойлер
Код: Выделить всё
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#else
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
#endif
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Прошивка выполняется с флеша. Скорость доступа не моментальная, а с небольшой задержкой и это нужно учитывать, иначе будут сбои.DENIS451 писал(а):То есть, если я пытаюсь записывать ничего во флэш я могу вообще делитель FLASH_SetLatency( FLASH_Latency_2); у себя в проекте не настраивать?
Там же написано.DENIS451 писал(а):зачем здесь: http://www.avislab.com/blog/keil_ru/ предлагают прописать STM32F10X_CL
STM32F10X_CL задает тип МК.Без этих опций проект не будет нормально компилироваться.
STM32F10X_CL относится к Connectivity line devices, а STM32F10X_MD к Medium-density devices.DENIS451 писал(а):STM32F10X_CL у меня не прописан, проект не соберётся, на картинке вообще STM32F10X_MD!
Спойлер
Код: Выделить всё
/* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
/* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
/* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
/* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
/* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
/* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */
/* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */
/* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?
Флешь ограничена по скорости ЧТЕНИЯ. Даже если ты в неё не собираешься писать, то задержки установить обязан. Но! В SystemInit за тебя всё это уже сделали. Отстань от системы тактирования, у тебя с ней нет проблем, кроме тех что ты пытаешься сам создать.


