Пришла мне пару месяцев назад из поднебесной отладочная плата STM32F103RBT6. До сих пор с данной архитектурой не сталкивался, поэтому подробно описываю процесс – авось кому пригодится. Итак, статья о том, как работать с отладочной платой STM32 без использования JTAG. Почему без JTAG? А потому что я понятия не имел, зачем он нужен, поэтому и не заказывал. Если же вы решили серьезно заняться данной архитектурой – лучше всё-таки прикупите что то вроде ST-Link/v2 – внутрисхемный дебаггер, эмулятор, программатор (нужное подчеркнуть). Сам такой штукой не пользовался, но судя по названию – очень удобная вещь.
Вот лежит на столе наша плата. Что мы видим – гнездо для батарейки (батарейка шла в комплекте с платой, я ее уже вставил) – видимо для встроенных часов, кнопка включения (понятно зачем), джамперы, USBвходы (потом разберемся, кто есть кто).
Начнем с джамперов (перемычек). В зависимости от логического уровня на BT0 BT1 (они же boot0 и boot1), контроллер выбирает начальный адрес размещения программы согласно таблице ниже:
|
BT1 |
BT0 |
Режим запуска |
|
Любой |
0 |
Выполняется программа, прошитая в FLASH |
|
0 |
1 |
Выполняется загрузчик |
|
1 |
1 |
Выполняется программа из SRAM |
При BT0=0 (Джампер на BT0 соединяем с GND) будет выполняться наша прошивка. Для того, чтобы залить прошивку на STM32 нужно BT1 соединить с GND, а BT0 с 3.3v. В этом случае программа-загрузчик позволит прошить микроконтроллер через интерфейс USART1. Ага. Теперь понятно для чего два USB порта на плате. USB-232 будет использоваться для прошивки – в windows должен появиться COM порт.. (Ещё один). При подключении этого чуда к ноутбуку появилось устройство, но ругается на что то.. Хм. Ладно потом разберемся. Второй USB порт на отладочной плате очевидно используется для подключения периферии к контроллеру (клавиатура, мышь, флешки и т д).
Ах да. Ещё пара джамперов, подписанных как “USB – CAN”. Вероятно, используется для превращения USB порта в интерфейс CAN(могу ошибаться). В данный момент CAN мне совершенно не интересен, поэтому оставим как есть. Последний вариант загрузки заставляет контроллер загружаться из статического ОЗУ. Полезная функция на стадии отладки программы. Загружаем прошивку в ОЗУ, сам контроллер загружается оттуда очень быстро, что экономит время, а мы к тому же экономим ресурс перепрограммирования Flash памяти (хотя 10000 циклов хватит на много лет отладки).
Пришло время устранить проблему с драйверами. Мост UART-USB организован тайваньской китайской микросхемой PL2303. Драйвера подписаны, установлены, но, тем не менее, диспетчер устройств сообщает о невозможности запуска устройства (код 10). После пяти минут гугления выясняем – тайваньские друзья в драйвера выше версии 3.2 встроили защиту от поддельных чипов. А китайцы.. Ну да действительно – зачем китайцам закупать тайваньские чипы, если они в каждом подвале процессоры клепают.. Подумаешь, какую то микросхемку скопировать, это ж дешевле чем покупать непонятно где.. Ну ладно. Удаляем установленные драйвера на сей девайс, ставим драйвер 3.2 аж от 2007 года и всё прекрасно работает даже на windows 8.1. Чудненько.
Прежде чем разбираться с архитектурой нужно поставить какую-нибудь кошерную IDE для STM32. Решил не загромождать eclipse плагинами и поставить найденную на просторах сети CooCox. Странное название, но почему то скриншоты меня завлекли. С помощью CooCox центра устанавливаем всё что нужно или не нужно. Запускаем CoIDE… Уже от сплеш окна повеяло чем то знакомым. Предчувствие меня не подвело, после запуска я увидел всё тот же мой любимый Eclipse. Вот так сюрприз! Создание проекта сделали очень простым. Моей NoNamestm32 board в списке плат не было, поэтому я просто выбрал Chip, ST, STM32F103RB, Finish… Появилось окошко с выбором необходимых библиотек, драйверов на периферию, которую я буду использовать. Очень удобно, но пока что слишком много непонятных названий. Когда отмечаю нужные модули, файлы сами появляются в проекте. Чего собственно ещё надо желать? Ладно. Для того чтобы помигать светодиодами нам не нужны никакие драйвера. Открываем main.c и видим вполне знакомую картину:
int main(void)
{
while(1)
{
}
}
Ну и теперь, посмотрев одним глазом документацию, помигаем светодиодом:
#include<stm32f10x.h>
#include<stm32f10x_conf.h>
#include<stm32f10x_rcc.h>
#include<stm32f10x_gpio.h>
void Delay(volatile uint32_t nCount) {
for (; nCount != 0; nCount—);
}
int main(void) {
/* SystemInit() вызываетсяиз startup_stm32f10x_md_vl.c */
//Создаем переменную структуры
GPIO_InitTypeDef GPIO_InitStructure;
//включаем тактирование порта
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
//Настраиваем 9-й пин порта на выход
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//Собственно инициализация
GPIO_Init( GPIOC , &GPIO_InitStructure);
while (1) {
//Установкав 1 пин 9
GPIOC->ODR |= GPIO_ODR_ODR9;
//Пауза
Delay(0x1FFFF);
//Установка в 0 пин 9
GPIOC->ODR &= ~GPIO_ODR_ODR9;
//Пауза
Delay(0x7FFFF);
}
return 0;
}
По умолчанию вся периферия микроконтроллера выключена, и если вы хотите использовать что то, будь то порты GPIO, или UART– необходимо включить тактирование (подать питание на ту периферию, которая вам нужна).




тыц says:
А где часть 2? :3