
В кейле создаём новый проект под плату STM32F4Discovery:
1. Project -> New project.
Выбираем папку и называем проект. Сохраняем.
2. Предлагают выбрать микроконтроллер. Окай.
В папочке ST ищем STM32F407VG и выбираем (он на плату вбубенен). Если его нету -- обновите Кейл.
3. Он предложит скопировать файл инициализации. Да, пусть копирует, он нужен.
читать дальшеТеперь проект создан, но запустить ничего не получится - нет функции main и SystemInit. Что ж, сделаем их.
4. File -> New... И сохраняем под именем main.c (или как пожелается, ему на названия плевать).
5. Добавим его в проект. Сбоку есть панелька со структурой проекта, выбираем« Source Group 1» и правой кнопкой вызываем меню. Там есть пункт «Add files to Group "..."». Вот там сохранённый файл и выбираем.
6. Пишем в файле что-то такое:
Если подключаете system_stm32f4xx.c (заметка про него есть далее, как его получить для своего кварца и т.д.), то не надо функцию SystemInit писать здесь, иначе будет ошибка линковки. Но я бы советовал не торопиться подключать всё подряд, всему своё время.
Вот. Теперь проект будет компилироваться без ошибок.
В опциях проекта выбираем отладчик ST-Link Debugger (вкладка Debug), ставим точечку у надписи Use, чтоб он использовал его. В опциях отладчика выбираем вместо JTAG пункт SW. На плате разведён именно этот интерфейс.
То же самое на вкладке Utilites (тут настраивается прошивание контроллера). Выбираем ST-Link, в опциях добавляем алгоритм прошивания: Utilites -> ST-Link ->Settings -> Add-> STM32F4xx Flash.
Иначе он будет ругаться на отсутствие алгоритма прошивания "No Algorithm found....".
И надо выставить ещё одну галочку на вкладке Target: Use MicroLIB. Иначе при запуске он будет вываливаться в HardFault на неизвестной инструкции.
Всё. Дальше можно загружать и отлаживать. Скорее всего, в первый раз он скажет, что прошивка у отладчика слишком старая и надо бы её обновить. Почему бы и нет? Соглашайтесь. Появится окошко с кнопкой Connect. Жмите. Если он ругнётся, что устройство не в DFU-mode, перезагрузите, то перезагрузите. И снова нажмите на кнопочку. Отладчик обновится и скажет «Upgrade succesful». Всё, больше проблем быть не должно.
Не лишним будет поменять в настройках Keil (Edit -> Configuration -> Editor) кодировку редактора: вместо ANSI выбрать UTF-8. А то иначе русский язык будет не работать. По желанию на соседних вкладочках можно поменять цвета подсветки синтаксиса и размеры отступов (на 4 пробела).
Драйвера для ST-Link v2 уже есть в папочке Keil по адресу «Keil\ARM\STLink\USBDriver».
Reference Manual на всю серию STM32F4xx, где описана вся периферия и порядок работы с ней.UPD от 19.04.2013: Интересно, нужен кому-нибудь последовательный мини-курс по си/асму в принципе, в контексте сей платы? Цикл данных заметок не являются в полном смысле обучающим, так как представляет собой конспекты моих попыток разобраться с периферией/ядром контроллера и ассемблером кортексов. Просто на память, чтоб посмотреть самые важные моменты и разного рода грабли, когда это понадобится снова.
UPD от 22.04.2013: могут быть проблемы с драйерами, в частности в Windows 8. чтобы всё установилось, надо в меню выбора режима загрузки (которое вызывается после биоса по F8) отключить проверку цифровой подписи. Возможно, есть иные пути решения проблемы, я не в курсе. В ХР такой проблемы нет точно.
Следующее >>
А конкретнее?) Язык Си в контексте МК, асм в контексе МК, работа с МК в принципе, всё равно какой язык (тогда Си) или ещё что?)
было бы полезно программирование на си, в контексте кортекса 4го. если будут отступления в сторону общих принципов работы МК - буду весьма признательна, нет - сама постараюсь постепенно разобраться)
спасибо!
в контексте КАКОЙ платы?
и, собственно, чем же отличается си для вообще любой платы/MCU?
В общем-то, ничем, но си достаточно низкоуровневый язык, чтобы код от одного МК можно было бы вот так сразу запустить на другом. Да и новичкам, возможно, вот так сразу и непонятно, а что писать-то? Если брать курс для винды какой-нибудь или линукса, так там всякие файлы, сокеты, консоль, API, вообще какая-то муть, и как это всё барахло может пригодиться в мире МК? То есть я знаю, что может, но это вовсе не очевидно. Фиг ты каким-нибудь sprintf светодиодом поморгаешь (хотя, можно, конечно), да и даже для этой платы чтобы получить вывод printf и иже с ними надо сделать ряд действий и настроек, о которых и не догадаешься вот так и добавить некоторый код. А иначе или зависнет в заглушках библиотеки, или нет, но результата тоже не будет. Есть же особенности, и не обойтись простым:
Хотя, конечно, у меня затруднения в связи с тем, что я не знаю, с чего начать и что там должно быть ^^"
жаль, что stm32f4discovery...
а я уж думал, что собрата по разуму встретил - хотел спросить про FSMC с внешней памятью
а на этой плате оно не выведено
смотри
ситуация такая:
- есть SRAM, подключено к FSMC
- есть LCD, также подключено к FSMC
- работа каждого проверена по отдельности
- всё пашет отлично, но... занимаем CPU
дабы избежать бессмысленной загрузки проца заряжаю DMA на вычитку из SRAM в LCD и... выводится не весь обьём (((
Обрывается что ли? Хотя могу представить, сколько там данных. Если правильно помню, поток может за один запуск скопипастить до 64 килобайт данных (2 байта там что ли под размер)? Оо
LCD 320*240 точек
цветной - т.е каждая точка = 2 байта
во внешнем SRAM лежит фрэйм буфер, с которым работают все функции отрисовки (графические примитивы и прочее)
>Обрывается что ли?
пока ХЗ, что происходит...
Хотя чего это я, никто ж не запрещает гонять данные шириной 16 или 32 бита? Тогда можно и в две, и в одну передачу влезть, если экран имеет не восьмибитную шину данных.
Ну, что с флагами потока, сколько данных он должен был передать (в посылках/байтах), что там осталось после завершения? Но да, если передаётся побайтно, то и не должно передаться всё целиком.
откуда взялась цифра "64 килобайт данных" ?
*ушёл курить даташит
DMA_SxNDTR — Number of data items to transfer (0 up to 65535).
Если передаётся за раз по байту, то как раз 64 килобайта и получается. Если передаём по 16 бит за раз, то 128 килобайт максимум. Ну а если по 32 бита, то всю четверть мегабайта можно переправить, один раз настроив DMA. Иначе придётся запускать несколько раз, чтоб передавать по частям...
я как раз и заряжаю DMA_InitStructure.DMA_BufferSize = 320*240 (слов)
т.е. выходит 76800 -> и в итоге вижу 76800 - 65535 = 11265 точек (или почти 36 строк на LCD)
надо попробовать поставить размер item-а в u32
Если экран умеет 32 бита получать, то пожалуйста =) Главное, не забыть разделить количество правильно:
DMA_InitStructure.DMA_BufferSize = sizeof(Framebuffer) / sizeof(uint32_t);
BufferSize — это не размер буфера однако ж, а количество элементов. SPL такой SPL.
вернулся домой, проверил u32 транзакции - всё ОК
спасибо за наводку!
Фиолетовым отмечены новые команды, добавившиеся в ядре M4. Практически все из них относятся к rкомандам DSP (цифровая обработка сигналов, векторные инструкции и типа того). Расширения для работы с плавающей точкой указаны внизу. Всё остальное — точно такое же. Отличия будут относиться к контроллерам, а не ядру. Адреса периферии, флаги и т.д, но это всё по аналогии можно подглядеть в даташите.
Да и нет у меня платы с контроллером на базе CM3, только CM0 и CM4...