Привет всем форумчанам. Я здесь новенький. Начал недавно осваивать Cortex M3, а точнее STM32F107VC, и наверное, как и многие другие, столкнулся с отсутствием четких инструкций по начальной настройке проекта и инициализации камня, хотя этот процес показался мне далеко не тривиальным.
Перерыл кучу документации и море топиков, в результате, более или менее разобрался, и хочу, по горячим следам, предложить результаты своего поиска другим, может это кому то сэкономит кучу времени.
Итак, у меня есть стартовый набор TE-STM32F107 (около 3000 р.) и отладчик SW RDI CoLinkEx (около 1000 р.). При плате есть CD, с программой "IAR Embedded Workbench for ARM, v. 5.50, 32K Kickstart Edition". Для разгона пойдет, главное с самим камнем разобраться.
Для CoLinkEx скачал с сайта CooCox драйвер "ColinkExUsbDriver-1.1.0.exe" и плагин для IAR "CoIARPlugin-1.2.0.exe". Поставил все это. Для отладчика сделал переходник IDC10->IDC20. При этом возникли непонятки с выводом TRST. Методом "научного тыка" выяснил, что его надо оставить в воздухе.
STM для работы со своими камнями предлагает на своем сайте библиотеку stm32f10x_stdperiph_lib. Ее можно использовать с драйверами периферии или без, работая только с регистрами. Но она все равно нужна. Насчет целесообразности использования библиотечных драйверов часто возникают споры.
Я, на основе работы с Tms320vc55xx и библиотеки CSL, пришел к такому выводу. Пока только осваиваешь новую платформу, и голова и так пухнет от моря новой информации, использовать подобные библиотеки можно и нужно. В дальнейшем, по мере накопления опыта, накапливается и раздражение по поводу явных ошибок, непонятных глюков и оверкода (из за претензии на универсальность). В следствии чего наступает частичный или полный отказ от библиотеки. И это нормально. Так как в ARM я, пока, полный чайник, буду работать с библиотекой.
1. На базе ряда примеров, типа IOToggle, создаю свой файл "main.c" (просто выкинул лишнее и использовал свой вывод PC6, на котором у меня висит светодиод).
CODE
// *************************************************************************
#include "stm32f10x.h" // регистры и биты камня от STM
void myDelay(__IO uint32_t nCount);
GPIO_InitTypeDef T_ini_PORTC;
int main(void)
{
#ifndef CFG_SIMUL
SystemInit();
#endif
// Разрешение тактирования модуля GPIOC (типа, разбудить)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// конфигурируем PC6 как Push-Pull Out
T_ini_PORTC.GPIO_Pin = GPIO_Pin_6;
T_ini_PORTC.GPIO_Speed = GPIO_Speed_50MHz;
T_ini_PORTC.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &T_ini_PORTC);
while (1) {
myDelay(3*1000*500); // 28 tik, при 72МГ ~3*N mks -> ~500 ms
GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_SET);
myDelay(3*1000*500);
GPIO_WriteBit(GPIOC, GPIO_Pin_6, Bit_RESET); }
}
// -------------------------------------------------------------------------
void myDelay(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
// *************************************************************************
2. Создаю папку study3 для своего проекта и копирую туда ряд файлов.
При этом создаю следующую файловую структуру.
CODE
study3 -+
+- main.c
+- Proj -+- stm32f10x_conf.h (из ~\Project\Template)
+- stm32f10x_flash.icf (из ~\Project\Template\EWARMv5)
+- system_stm32f10x.c (из ~\Libraries\CMSIS\Core\CM3)
Здесь и далее символ '~' означает путь к библиотеке stm32f10x_stdperiph_lib. Конечно, копируются только те файлы библиотеки, что, возможно, будут модифицироваться в ходе работы над проектом.
3. Создаю в папке study3\Proj новый Empty проект. В нем уже есть две конфигурации: Debug и Release. Создаю группу STM_LIB. Включаю в дерево проекта следующие файлы:
main.c
STM_LIB\startup_stm32f10x_cl.s (из ~\Libraries\CMSIS\Core\CM3\startup\iar)
STM_LIB\system_stm32f10x.c (из study3\Proj)
STM_LIB\stm32f10x_gpio.c (из ~\Libraries\STM32F10x_StdPeriph_Driver\src)
STM_LIB\stm32f10x_rcc.c (то же)
Сохраняю Workspace как Proj\study3.eww. Теперь надо настроить проект.
4. В текущей конфигурации Debug задаю следующие опции:
1. В General/Target задаю свой Device - STM32F107xC
2. В General/Library... стоит Си библиотека Normal. Устраивает.
3. В Compiler/Optimizations стоит Low, я, для учебы, выбираю None.
4. Убеждаюсь, что в Compiler/Output стоит галочка "Genegate debug info"
5. В Compiler/List ставлю галочку "Output list file" и обе сопутствующие опции, на этапе учебы информации надо побольше.
6. В Compiler/Preprocessor в поле "Additional include" добавляю пути к включаемым файлам
.\.. (это к файлам папки study3)
~\Libraries\CMSIS\Core\CM3
~\Libraries\STM32F10x_StdPeriph_Driver\inc
~\Project\Template
7. Там же, в поле "Defined symbols" добавляю:
USE_STDPERIPH_DRIVER (не надо, если работать через регистры)
STM32F10X_CL (правильно выбрать свое семейство!)
8. Убеждаюсь, что в Assembler/Output стоит галочку "Genegate debug info"
9. В Linker/Config ставлю галочку "Overide default" и указываю местонохождение своей копии icf файла.
10. В Linker/List ставлю галочку "Genegate linker map file"
11. Согласно описанию плагина CoLinkEx к IAR, в Debugger/Setup/Driver выбираю протокол отладки RDI, затем в Debugger/RDI указываю путь к файлу CoIARPlugin\CoRDI.dll
12. в Debugger/Download ставлю галочки "Verify download", "Use flash loader" и "Overide default board file" и выбираю подходящий скрипт загрузчика - "FlashSTM32F10xxC.board"
(Пробовал "FlashSTM32F105xC.board" - полет тоже нормальный).
13. Жму OK, чтобы сохранить изменения конфигурации.
5. Удаляю конфигурацию Release и создаю ее вновь на базе Debug.
.4. В Compiler/Output снимаю галочку "Genegate debug info"
.8. В Assembler/Output снимаю галочку "Genegate debug info"
.11. В Debugger/Setup выбираю Simulator, хотя подозреваю, что все равно, что выбирать, так как нет отладочной информации.
6. Создаю новую конфигурацию Simul на базе Debug
.7. В Compiler/Preprocessor в поле "Defined symbols" добавляю: CFG_SIMUL
.11. В Debugger/Setup выбираю отладку через Simulator.
Итак, проект создан и сконфигурирован. Теперь надо правильно иницииализировать ядро и периферию своего камня.
Долго не мог понять, как правильно использовать SystemInit(). В ряде примеров, в начале main(), стоит комментарий (вот его перевод):
/* На этот момент тактовый МК уже сконфигурирован, это сделано функцией
SystemInit(), которая вызывается из файла startup_stm32f10x_xx.s перед
заходом в функцию main(). Чтобы изменить уставки по умолчанию см.
файл system_stm32f10x.c */
А в других примерах есть явный вызов ее, как первой функции в main().
Перекопав кучу примеров, пришел к выводу: примечание относится к примерам из пакетов, типа stm32vldiscovery_package, где разработчик Evalution Board модифицировал файлы "startup_stm32f10x_xx.s" и файл "system_stm32f10x.c".
А если брать библиотеку прямо от STM (по крайней мере в версии 3.1.0), то требуется прямой вызов SystemInit(). При этом, в конфигурации Simul нас ждет засада: так как мы не получим бита готовности RCC_CR_HSERDY, то попадаем в бесконечный цикл. Чтобы избежать этого, надо либо модифицировать файл, убрав этот цикл (если нужно пройтись по нему под отладчиком), либо использовать символ CFG_SIMUL для условной компиляции функции (см. мой main()).
Точка входа в библиотеку - "stm32f10x.h" (из Libraries\CMSIS\Core\CM3). По умолчанию файл настроен на семейство STM32F10X_CL. Для смены семейства достаточно изменить символ в опциях проекта.
Файл "system_stm32f10x.c" по умолчанию настроен на частоту 72 МГц при кварце 25 МГц. А как это? Если в наличии только умножитель?. Копаю код и документацию. Похоже документ "STM32F105_107_Reference manual.pdf" делался методом Copy/Paste. Иначе, как объяснить, что регистры, специфичные для CL (а весь документ о камнях этой линии) спрятаны в отдельной 7 главе, где есть регистр CFGR2, который уже содержит биты делителя. А нигде, в общих обзорах по Cortrex, это не звучало. Вопрос снят.
В файле "stm32f10x_conf.h" выбираю периферию, пока только RCC и GPIO.
Компилирую, линкую, дебажу, полет нормальный.
Ну вот. Проект по этой инструкции создан. Плата лежит на столе и мигает диодом. Идет как симуляция, так и пошаговая отладка с помощью CoLinkEx.
Пробовал создавать BIN файл командой:
ielftool.exe --bin Release.out Release.bin
и грузить его по USART с помощью программы "Flash Loader Demonstrator", скачанной с STM сайта. Все дышит. Теперь можно двигаться дальше.
Допускаю, что в силу, пока, низкой квалификации, где то допустил ляп, который сейчас не мешает, но позже может выйти боком. Так что, если кто из местных Гуру обнаружит такое, прошу ткнуть носом, буду только благодарен.