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(). [этот пункт не проверял]