воскресенье, 18 декабря 2011 г.

Настройка Keil+STM32F10x

     Поскольку в ходе экспериментов было получено, что 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, то его и выбираем (ну или другой, необходимый вариант):
     Далее, спрашивается, создать ли стартапный код и добавить ли его в проект, жмем "Да":
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, порты, периферию и все прочее.
Пока все, позже расскажу как подключается библиотека для работы со стандартной периферией.

воскресенье, 4 декабря 2011 г.

А не замахнуться ли ...

А не замахнуться ли нам на Вильяма, нашего Шекспира...
Готовлюсь к более детальному изучению ядра Cortex, и МК STM32 в частности. Готовиться коннект Компьютер-STM32 по UART-у, вопрос пока за железом. Соединение нужно для отладочных целей, для будущего взаимодействия с microSD-картой.