Робкие попытки помигать светодиодом

Очередная заметка про «ARM для чайников», не более.

Завелась как-то у меня девелоперская плата от LC Studio c STM32F103RB6 на ней. На ebay сейчас стоит около $12. На плате две кнопки на PA2 и PC1, и два светодиода на PB8 и PB9.



И программатор завелся. Некий Haoyu Electronics USB-MiniJTAG. Выбирал я его видимо по цене. Сейчас-то такой брать не надо — можно найти человеческий J-Link за $10 на aliexpress.



Однажды настал тот самый день, когда дошли руки что-то со всем этим сделать.

Сперва оказалось диск от программатора утерян (если вобще был). Скачал с сайта Segger последнюю версию софта и тут меня ждал облом: при запуске появлялось сообщение что мой программатор левый и работать с ним не будут. Проблема решается установкой какой-нибудь старой версии, например, 4.52c. Остановился на этой, потому что надоело перебирать версии (4.72 уже не работает).

Еще один ньюанс — JFlashARM.exe отказывается понимать микроконтроллер пока не укажешь его принудительно. Для этого нажимаем Alt-F7 (Project settings) и указываем что у нас STM32F103RB6



Далее установка CooCox CoIDE. Вот здесь камрад все толково написал, за что ему большое спасибо.

Создаем проект и вставляем следующий код:

#include <stdio.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>

int main(void) {
	GPIO_InitTypeDef gpio;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_StructInit(&gpio);
	gpio.GPIO_Pin = GPIO_Pin_9;
	gpio.GPIO_Mode = GPIO_Mode_Out_PP;
	gpio.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &gpio);
	
	gpio.GPIO_Pin = GPIO_Pin_8;
	GPIO_Init(GPIOB, &gpio);

	while(1)  {
		static int count=0;
		static int i;
		static int led_state=0;
		
		for (i=0; i<1000000; ++i);
		GPIO_WriteBit(GPIOB, GPIO_Pin_9, led_state ? Bit_SET : Bit_RESET);
		led_state = !led_state;
		GPIO_WriteBit(GPIOB, GPIO_Pin_8, led_state ? Bit_SET : Bit_RESET);
	
	}
}


Код нашел здесь и адаптировал к своей плате.

Подружить CoIDE с J-Link можно как сказано здесь. В моем случае настройки выглядят следующим образом (все картинки кликабельны):



Жмем F7 (Build), убеждаемся что ошибок нет. Жмем Ctrl-F5 (Debug) для запуска отладки перед началом которой будет залита программа в микроконтроллер и далее F5 (Run). И вот она «моя прелесть» — перемигивающиеся светодиоды.

Осталось теперь найти мирное применение всей этой мощи. Шутка ли 72 MHz и 128 кило флэша.

Хотелось бы сказать спасибо камрадам dosikus_2 и ulole за то что наставляли на путь истинный.
  • +3
  • 27 ноября 2013, 22:15
  • aliaksei
  • 4

Комментарии (18)

RSS свернуть / развернуть
для общего ознакомления:
GPIO_StructInit(&gpio);
gpio.GPIO_Pin = GPIO_Pin_9;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpio);
gpio.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOB, &gpio);
здесь можно сделать так:
gpio.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
gpio.GPIO_Mode = GPIO_Mode_Out_PP;
gpio.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &gpio);
библиотека поддерживает (а регистры тем более) указание параметров GPIO_pin_X через или(это битовая маска), но это касается далеко не всего, скажем GPIOA и GPIOB так совмещать нельзя, чтобы разобраться нужно смотреть код куда все это отправляется и макросы (GPIO_pin_0,GPIO_pin_1...)
static int count=0;
static int i;
static int led_state=0;for (i=0; i<1000000; ++i);
GPIO_WriteBit(GPIOB, GPIO_Pin_9, led_state? Bit_SET: Bit_RESET);
led_state = !led_state;
GPIO_WriteBit(GPIOB, GPIO_Pin_8, led_state? Bit_SET: Bit_RESET);
— тут принцип ясен, но нет предела совершенству:
static думаю тут неуместен, для i лучше поставить volatile (не оптимизировать), чтобы компилятор не съел цикл задержки как не оптимальный, для led_state ничего кроме int не нужно, хотя ему хватит и uint8_t, а вообще сделать моргание в противофазе можно проще(не используя библиотечных функций)
GPIOB->ORD|=GPIO_Pin_9 // set pin 9 port B
GPIOB->ORD&=~(uint16_t)GPIO_Pin_8 // reset pin 8 port B 
uint32_t volatile i;
while(1)    {
GPIOB->ORD^=GPIO_Pin_9 // XOR pin 9 port B 
GPIOB->ORD^=GPIO_Pin_8 // XOR pin 9 port B 
for(i=0;i<1000000;i++);
}

а теперь вопросы =) на каком камне программатор? можешь сфотать поближе прямо сверху и снизу?
меня смутила вот эта картинка:

stm32f101c8 — на нем нет USB, это получается софтварный USB на cortex m3???? не на столько дороже стоит stm32f102С8, чтобы писать подобное, блин, как так то =)
0
Что код не оптимален это сразу понятно. Но тут ставилась цель заставить мигать светодиоды. А заоптимизировать всегда можно так, что потом никто в коде не разберется ))

stm32f101c8 — на нем нет USB, это получается софтварный USB на cortex m3???? не на столько дороже стоит stm32f102С8, чтобы писать подобное, блин, как так то =)
Да, тебе не показалось — STM32F101C8T. Если еще нужны фотки я сделаю.
0
ежкин кот, сделай фото, я хочу ЭТО видеть, и посмотри плиз как это видится на компе (тип устройства, vid pid), мне мозг выносит мысль о подобной реализации =) интересно то, что ноги, к которым подведен USB, на старших моделях — как раз USB, или st решили сделать как в старых советских калькуляторах(если кому интересно — расскажу, но это и так общеизвестный факт), в 101 серии USB стек в кристалле оставили, но не документировали… жалко никогда не работал с 101 серией и нету в наличии %)
насчет оптимальности кода я не упрекаю ни в коем случае, просто показываю альтернативы, поскольку вы спозиционировали себя как начинающий
и мое отношение к вам весьма положительное, поскольку вы выкладываете в блог не пустой, нерабочий код с вопросом «как сделать так, чтоб заработало, с преферансом и дамами...», а вполне правильно начали, со светодиодиков =) плюс фото непривычного программатора, который лично меня заинтриговал =)
0
как в старых советских калькуляторах(если кому интересно — расскажу, но это и так общеизвестный факт),
Послушал бы с интересом

Фотографии кликабельны
И в винде:
0
Спасибо за фото, про калькулятор, к сожалению модели не помню, но история такая:
было два типа калькулятора (две связанные модели) — один инженерный (серьезный, с кучей функций, типа логарифма и т.д., верный помощник инженера) — второй обычный, цифры,+ — * / =, ну и хватит с тебя, обычный калькулятор, дак вот разница в цене была между ними была в два или много раз, не помню, а по факту, отличались только тем, что в обычном не было отверстий под кнопки в верхней крышке и собственно кнопок, платы были абсолютно одинаковыми, поэтому умельцы покупали обычные, и вручную доделывали кнопки — вуаля — инженерный калькулятор =) (сам в руках не держал, молод больно, но историю слышал от разных людей, кто это застал)
0
Это как с телевизорами в наше вермя — немного манипуляций с пультом и ящик превращатся в старшую модель )
0
=) на самом деле сейчас тоже такая же тенденция есть, смотря в чем вся «фишка» устройства, часто преимущества «старших моделей» обусловлено 5% кода прошивки, заблокированными или не залитыми у «младших моделей»
0
по vip pid гуглится код j-link 8
я фигею с китайцев, как блин они это реализовывали, интересно =)
думаю наличие осциллографа у тебя спрашивать, с моей стороны, было бы глупо? =)
0
Интересно было бы пощупать камень программатором, вдруг защитить забыли? С китайцами такое хоть и очень редко, но бывает.
Вообще, я думал там AT91SAM7S64 — раз оно видится как J-LINK V8.
0
Вообще, я думал там AT91SAM7S64 — раз оно видится как J-LINK V8.
именно это меня и смутило на фотке, вот мой

но у автора походу это единственный программатор
0
Ну у STM камни вроде совместимые друг с другом, если закатать в демоборд на STM32F103RB прошивку ST-LINK'а — мэйби оно заработает.
0
не выйдет =) пробовал =) возможно прошивки между сериями переносимы, но конкретно st-link нет, пробовал запустить на stm32f102CB — не пошла, кроме всего прочего на родном для нее камне stm32f103c8 она после первой загрузки блочит биты чтения, и прошивку прочитать с нее уже нельзя =) видимо прошивка st-link проверяет тип камня =)
0
Вот гадство. А я одно время подумывал попробовать запустить на 103CB. Видимо придется купить С8… Или растерзать дискавери.
0
20-07-2007 из описания удали «USB characteristics section removed.», может что-то было, но потом убрали :)
0
точно, загадочные камни =)
0
просмотрел reference_manual, для серии 101,102,103,105,107 он общий, и там есть способ затактировать МК 36 МГц, запитав при этом ветку USB на 48МГц, все больше склоняюсь что в 101 есть аппаратный USB, но по какой то причине (баги или маркетинг) он был исключен из документации
0
да и смысл не понятен, у нас 101 дороже чем 102 и 103 :)
0
есть такое, при дешманской цене (а у stm32 она такая), получается, что МК с высоким функционалом ввозимые большими партиями стоят дешевле, чем мизерные партии МК с низким функционалом
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.