Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Сб ноя 24, 2018 22:58:56

FLASH_Latency_2 действительно закомментировал, я вычитал что это надо только при использовании FLASH как eeprom,
но если раскомментировать, то ничего не меняется.

Я сделал тестовый урезанный проект он только пищит динамиком и мигает светодиодами, как только ставлю версию 6
всё перестаёт работать, возвращаю 5 версию, всё нормально.

Тестовый проект: https://yadi.sk/d/xwyvEO6iD7pzQQ

Там внутри проект для Протеуса 8.7 на нём этот глюк тоже видно.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Сб ноя 24, 2018 23:34:38

Ошибка 1 -повторять один в один код для авр.
Ошибка 2- в протеусе модель с глюками.

DENIS451, хочешь ты или не хочешь а изучать железо придеться
Готов ли ты к этому, или так и будешь тыркаться?

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Сб ноя 24, 2018 23:37:21

Запустите отладку и посмотрите из-за чего программа не работает.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 00:13:59

Я ещё не умею запускать отладку, дайте ссылку на статью, или видео обучающие как это сделать.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 00:38:22

https://yandex.ru/search/?clid=2186620& ... 43099668.1 :facepalm:

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 07:22:38

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. Да, какое-то время будет непросто, но зато потом "полетит".

Я ещё не умею запускать отладку

CTRL+F5 :facepalm:

PS:
6. Солнце, воздух и вода Отладчик, осциллограф и логический анализатор наши лучшие друзья :)
7. Для начала убери оптимизацию на минимум. Лучше, конечно, сразу писать правильно под оптимизатор, но эти грабли надо самому пройти, иначе трудно понять почему же он выпиливает код.
8. Научись заглядывать в листинги. Там часто видно разного рода "непонятки".

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 13:02:32

Спасибо, за разъяснения.

После добавления volatile в Пртеусе без изменений, а в железе запустил отладку, пошагово прошёл по коду, в конце
контроллер заработал как положено, я решил проверить что будет если убрать volatile и ещё раз прошить в контроллер
прошивку - не заработало, тогда вернул volatile прошил запустил отладку, но теперь отладка застревает в самом начале
(см. 1.png)

Добавлено after 11 minutes 49 seconds:
Странно, но сейчас вроде в железе опять заработало.
Вложения
1.png
(91.93 KiB) Скачиваний: 140

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 13:04:22

Неверный инит тактовой, к примеру неправильная частота кварца или отсутствие его. Файл систем_xxx сгенерен экселовской тулзой и может быть совсем не тот что нужен.
Выкладывай.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 13:11:37

У него там при переключении на 6-й компилер максимальная оптимизация стоит. Вот оно и отваливается без volatile. Вернее не отваливается, а мигает светодиодом на килогерцы. Ну и с отладкой, само собой, при максимальной оптимизации он не разберётся. А SystemInit там стандартный кейловский - нормально всё на 72 выставляется и флэшь настраивается, я глянул.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 13:14:29

Проект: https://yadi.sk/d/P9BVOK9aZ1WY2Q

Ответить смогу через 3 часа, дела появились.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 13:29:32

Проект:
Вот ты упёртый. Говорят же тебе, что при входе в main уже выставлена частота 72 МГц. Выкинуть настройки тактирования из main нах!

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 17:26:01

Вот ты упёртый. Говорят же тебе, что при входе в main уже выставлена частота 72 МГц. Выкинуть настройки тактирования из main нах!


Я так и сделал, вынес код "настройка тактирования" в отдельную функцию а на месте кода вызов этой функции, после чего
провел эксперименты с вызовом этой функции и без неё:

без этой функции на компиляторе 6.7 отладка в железе идет нормально, и даже в Протеусе прошивка работает.

Что не так с этим кодом?


Зачем тут учат что такой код должен быть:
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++)?

Вс ноя 25, 2018 17:32:48

Флеш может только на 24МГц работать, что бы она смогла работать с системной тактовой выше нужны задержки.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 18:34:48

Флеш может только на 24МГц работать, что бы она смогла работать с системной тактовой выше нужны задержки.


То есть, если я пытаюсь записывать ничего во флэш я могу вообще делитель FLASH_SetLatency( FLASH_Latency_2); у себя в проекте не настраивать?


Второй вопрос -что не так с кодом для настройки тактирования, если даже есть настройки по умолчанию в SystemInit(),
этот код в худшем случае должен занимать место в прошивке, но не как не приводить к неработоспособности программы?

Третий вопрос - зачем здесь: http://www.avislab.com/blog/keil_ru/ предлагают прописать STM32F10X_CL ?
Изображение

STM32F10X_CL у меня не прописан, проект не соберётся, на картинке вообще STM32F10X_MD!

Листинг SystemInit() из файла system_stm32f10x.c

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 18:50:47

DENIS451 писал(а):То есть, если я пытаюсь записывать ничего во флэш я могу вообще делитель FLASH_SetLatency( FLASH_Latency_2); у себя в проекте не настраивать?
Прошивка выполняется с флеша. Скорость доступа не моментальная, а с небольшой задержкой и это нужно учитывать, иначе будут сбои.

DENIS451 писал(а):зачем здесь: http://www.avislab.com/blog/keil_ru/ предлагают прописать STM32F10X_CL
Там же написано.
Без этих опций проект не будет нормально компилироваться.
STM32F10X_CL задает тип МК.

DENIS451 писал(а):STM32F10X_CL у меня не прописан, проект не соберётся, на картинке вообще STM32F10X_MD!
STM32F10X_CL относится к Connectivity line devices, а STM32F10X_MD к Medium-density devices.

Re: Почему этот код с AVR вызывает ошибку в Keil 5 (на C++)?

Вс ноя 25, 2018 19:01:28

Флешь ограничена по скорости ЧТЕНИЯ. Даже если ты в неё не собираешься писать, то задержки установить обязан. Но! В SystemInit за тебя всё это уже сделали. Отстань от системы тактирования, у тебя с ней нет проблем, кроме тех что ты пытаешься сам создать.
Ответить