ARM Cortex M3 с нуля. Часть 1.

            Пришла мне пару месяцев назад из поднебесной отладочная плата STM32F103RBT6. До сих пор с данной архитектурой не сталкивался, поэтому подробно описываю процесс – авось кому пригодится. Итак, статья о том, как работать с отладочной платой STM32 без использования JTAG. Почему без JTAG? А потому что я понятия не имел, зачем он нужен, поэтому и не заказывал. Если же вы решили серьезно заняться данной архитектурой – лучше всё-таки прикупите что то вроде ST-Link/v2 – внутрисхемный дебаггер, эмулятор, программатор (нужное подчеркнуть). Сам такой штукой не пользовался, но судя по названию – очень удобная вещь.

Вот лежит на столе наша плата. Что мы видим – гнездо для батарейки (батарейка шла в комплекте с платой, я ее уже вставил) – видимо для встроенных часов, кнопка включения (понятно зачем), джамперы, USBвходы (потом разберемся, кто есть кто).

Начнем с джамперов (перемычек). В зависимости от логического уровня на BT0 BT1 (они же boot0 и boot1), контроллер выбирает начальный адрес размещения программы согласно таблице ниже:

BT1

BT0

Режим запуска

Любой

0

Выполняется программа, прошитая в FLASH

0

1

Выполняется загрузчик

1

1

Выполняется программа из SRAM

SDC10178

При BT0=0 (Джампер на BT0 соединяем с GND) будет выполняться наша прошивка. Для того, чтобы залить прошивку на STM32 нужно BT1 соединить с GND, а BT0 с 3.3v. В этом случае программа-загрузчик позволит прошить микроконтроллер через интерфейс USART1. Ага. Теперь понятно для чего два USB порта на плате. USB-232 будет использоваться для прошивки – в windows должен появиться COM порт.. (Ещё один). При подключении этого чуда к ноутбуку появилось устройство, но ругается на что то.. Хм. Ладно потом разберемся. Второй USB порт на отладочной плате очевидно используется для подключения периферии к контроллеру (клавиатура, мышь, флешки и т д).

SDC10184
SDC10183

Ах да. Ещё пара джамперов, подписанных как “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– необходимо включить тактирование (подать питание на ту периферию, которая вам нужна).

Posted in ARM

One thought on “ARM Cortex M3 с нуля. Часть 1.

Leave a Reply to тыц Cancel Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>