Keil error 65: access violation at 0x40021000 : no 'read' permission


Вариант решения проблемы с отладкой в симуляторе Keil на примере платы STM32F103C8T6.

Среда разработки Keil предлагает возможность отладки с использованием симулятора программируемого устройства. Выбор режима производится в окне "Options for Target ..." на вкладке "Debug":

При отладке в режиме симулятора с первой же инструкции инициализации SystemInit() трассировщик выдаёт ошибку доступа к памяти (к регистрам микроконтроллера) следующего вида:

 *** error 65: access violation at 0x40021000 : no 'read' permission

 *** error 65: access violation at 0x40021000 : no 'write' permission

 *** error 65: access violation at 0x40021004 : no 'read' permission

 *** error 65: access violation at 0x40021004 : no 'write' permission

и так далее при каждой попытке чтения-записи в регистр.

Исполняемый код при этом выглядит так (файл 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;

   ...


Решение


Скорее всего симулятор считает, что адресное пространство вне областей Flash и RAM недоступно, хотя там находятся регистры периферийных устройств.

В качестве решения надо указать симулятору область памяти, выделенную периферийным устройствам, и разрешить к ней доступ для чтения и записи. Делается командой MAP с указанием границ диапазона и вариантом доступа:

MAP 0x40000000, 0x47FFFFFF READ WRITE

Указанную строку разместить в ini файле, например: MAP.ini и подключить к проекту опциях на вкладке "Debug" (где выбирали симулятор).

Примечания

 1.  Если ошибка не пропадает, то в окне выбранного ini-файла попробовать убрать обратный слэш перед именем файла (потом попробовать убрать точку). В версии 5.41 это не требуется.

 2.  При работе с HAL-функциями закомментировать обращение к Error_Handler(). [этот пункт не проверял]