Поскольку в ходе экспериментов было получено, что IAR ARM v.6.10 выдает очень много отладочной информации в конечном файле прошивки и он раздувается до непристойных размеров, особенно при подключении CMSIS и библиотек стандартной периферии STD_PERIPH_LIB, то было решено спользовать среду Keil. Результат меня удовлетворил, размер целевого файла прошивки значительно уменьшился))). Пару раз отваливался ST-LINK, но вопрос удалось решить.
Итак, настало время немного написать о настройке Keil для "старта" и подключении всяческих библиотек. Хочу заметить, что процесс настройки незначительно отличается от такового в среде IAR ARM, где тоже может быть использован.
Начинаем с установки - я использовал версию Keil v.4.21, чего и Вам советую. Можно использовать бесплатную версию с ограничением кода, если религия не позволяет.
Я, обычно, создаю папку для проектов типа C:\Keil\ARM\My_projects, дальше уже каждый проект в свой каталог.
1. Запускаем Keil, тыкаем "Project->New uVision Project", выбираем путь, забиваем имя проекта, далее предлагается выбрать что-нибудь из имеющейся номенклатуры МК. Поськольку имеем плату Discovery Value Line с установленным STM32F100RB, то его и выбираем (ну или другой, необходимый вариант):
Начинаем с установки - я использовал версию Keil v.4.21, чего и Вам советую. Можно использовать бесплатную версию с ограничением кода, если религия не позволяет.
Я, обычно, создаю папку для проектов типа C:\Keil\ARM\My_projects, дальше уже каждый проект в свой каталог.
1. Запускаем Keil, тыкаем "Project->New uVision Project", выбираем путь, забиваем имя проекта, далее предлагается выбрать что-нибудь из имеющейся номенклатуры МК. Поськольку имеем плату Discovery Value Line с установленным STM32F100RB, то его и выбираем (ну или другой, необходимый вариант):
Далее, спрашивается, создать ли стартапный код и добавить ли его в проект, жмем "Да":
2. Далее, нужно посоздавать группы в дереве проекта. Корень дерева "Target 1" и группу со стартовым кодом "Source Group 1" переименовываем в что-то более осмысленное - в моем случае "UART" и "Startup" соответственно. Добавляем также группы "Main" и "CMSIS".
Создаем в каталоге с проектом каталог "Main" с пустым файлом Main.c внутри. Также копируем в
каталог с проектом каталог "CMSIS".
3. Подвязываем наши файлы в проект, для чего дважды щелкаем на группе "Main" и добавляем пока свой единственный исходник - файл Main.c. В группу "CMSIS" добавляем файлы core_cm3.c, system_stm32f10x.c из каталога "CMSIS". Должно получиться как на картинке:
4. После этого переходим к настройке свойств проекта. Для этого выбираем пункт из контекстного меню "Options for Target ...". Первым делом идем на вкладку "Output" и ставим галочку напротив пункта "Create HEX file" - создавать файл прошивки, остальное не трогаем, должно получиться как на картинке:
Переходим к вкладке "C/C++". В строке "Preprocessor Symbols -> Define" дописываем следующую информацию:
STM32F10X_MD_VL - означает то, что используем МК MD_VL - medium density value line device.
USE_STDPERIPH_DRIVER - на данном этапе это определение пока не особо нужно, если не планируем подключать библиотеку стандартной периферии. Но, оно особо и не мешает, тем более, что дальше будет рассказано о поключении библиотеки стандартной периферии.
В строку "Include paths" прописываем все пути к каталогам проекта:
Теперь, заодно заходим во вкладку "Debug" и настраиваем отладчик ST-LINK, коли таковой имеется на плате Discovery VL ;). Собственно, выбираем ST-LINK, ставим галочки - "Run to main" - стартовать с ф-ции Main при отладке, а не со стартапного кода, "SWD" - Single Wire Debug.
Собственно, на этом можно и ограничиться, дописав в пока еще пустой файл Main.c следующие строки:
#include "stm32f10x.h"
int main(void)
{
}
Теперь можно откомпилить это все дело с помощью F7, убедившись, что все файлы подключены и всё настроено правильно.
Т.е. получили заготовку с подключенной CMSIS в сыром виде. Но дело в том, что в стартапном коде присутствует вызов ф-ции SystemInit(), которая вобщем-то делает немного полезного - инициализирует модуль тактовых генераторов RCC. Ничего криминального в этом нет, ею, наверное, можно пользоваться, но я предпочитаю "выпилить напильником" вызов сей ф-ции из стартапа напрочь и запускать собственные маленькие ф-ции для настройки модуля RCC, частоты шины AHB, вывод импульсов "наружу" через вывод MCO и тому подобные вещи.
Выпиливается очень просто, лезем в файл startup_stm32f10x_md_vl.s, находим строки:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Заккоментируем вызов SystemInit, т.е. приводим к следующему виду:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
Собственно, всё! Ф-ция при старте не вызывается и можно вручную настраивать RCC, порты, периферию и все прочее.
Пока все, позже расскажу как подключается библиотека для работы со стандартной периферией.
2. Далее, нужно посоздавать группы в дереве проекта. Корень дерева "Target 1" и группу со стартовым кодом "Source Group 1" переименовываем в что-то более осмысленное - в моем случае "UART" и "Startup" соответственно. Добавляем также группы "Main" и "CMSIS".
Создаем в каталоге с проектом каталог "Main" с пустым файлом Main.c внутри. Также копируем в
каталог с проектом каталог "CMSIS".
3. Подвязываем наши файлы в проект, для чего дважды щелкаем на группе "Main" и добавляем пока свой единственный исходник - файл Main.c. В группу "CMSIS" добавляем файлы core_cm3.c, system_stm32f10x.c из каталога "CMSIS". Должно получиться как на картинке:
4. После этого переходим к настройке свойств проекта. Для этого выбираем пункт из контекстного меню "Options for Target ...". Первым делом идем на вкладку "Output" и ставим галочку напротив пункта "Create HEX file" - создавать файл прошивки, остальное не трогаем, должно получиться как на картинке:
STM32F10X_MD_VL - означает то, что используем МК MD_VL - medium density value line device.
USE_STDPERIPH_DRIVER - на данном этапе это определение пока не особо нужно, если не планируем подключать библиотеку стандартной периферии. Но, оно особо и не мешает, тем более, что дальше будет рассказано о поключении библиотеки стандартной периферии.
В строку "Include paths" прописываем все пути к каталогам проекта:
Теперь, заодно заходим во вкладку "Debug" и настраиваем отладчик ST-LINK, коли таковой имеется на плате Discovery VL ;). Собственно, выбираем ST-LINK, ставим галочки - "Run to main" - стартовать с ф-ции Main при отладке, а не со стартапного кода, "SWD" - Single Wire Debug.
Собственно, на этом можно и ограничиться, дописав в пока еще пустой файл Main.c следующие строки:
#include "stm32f10x.h"
int main(void)
{
}
Теперь можно откомпилить это все дело с помощью F7, убедившись, что все файлы подключены и всё настроено правильно.
Т.е. получили заготовку с подключенной CMSIS в сыром виде. Но дело в том, что в стартапном коде присутствует вызов ф-ции SystemInit(), которая вобщем-то делает немного полезного - инициализирует модуль тактовых генераторов RCC. Ничего криминального в этом нет, ею, наверное, можно пользоваться, но я предпочитаю "выпилить напильником" вызов сей ф-ции из стартапа напрочь и запускать собственные маленькие ф-ции для настройки модуля RCC, частоты шины AHB, вывод импульсов "наружу" через вывод MCO и тому подобные вещи.
Выпиливается очень просто, лезем в файл startup_stm32f10x_md_vl.s, находим строки:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
Заккоментируем вызов SystemInit, т.е. приводим к следующему виду:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
;IMPORT SystemInit
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
Собственно, всё! Ф-ция при старте не вызывается и можно вручную настраивать RCC, порты, периферию и все прочее.
Пока все, позже расскажу как подключается библиотека для работы со стандартной периферией.
Комментариев нет:
Отправить комментарий