Кто любит 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) Скачиваний: 239

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 отладка в железе идет нормально, и даже в Протеусе прошивка работает.

Что не так с этим кодом?
Спойлер
Код:
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++)?

Вс ноя 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
Спойлер
Код:
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++)?

Вс ноя 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.
Спойлер
Код:
  /* #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 */
Изображение
103.png
(36.16 KiB) Скачиваний: 17

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

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

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