STM32F030F4: создание простейшего проекта

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

Всем привет!
Недавно (буквально пару дней назад :) ) начал осваивать STM32.
Скачал и установил CooCox, STM32 ST-Link Utility, в качестве программатор использую ST-Link/V2.

CMSIS для Cortex-M0 подключил. Пытаюсь просто зажечь диод и... не получается :(

Код: Выделить всё

int main(void)
{
	RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
	GPIOB->MODER = 0x55555555;
	GPIOB->OTYPER = 0;
	//GPIOA->PUPDR = 0x55555555;
	GPIOB->ODR = 0x0000FFFF;

    return 0;
}
Собственно говоря, сам код.
Проц использую в корпусе TSSOP20, светодиод подключаю к ноге 14(PB_1).
Компилирую проект, все успешно. (Build Sucsessful)

Открываю полученный hex через ST-LINK Utility, заливаю в проц, выдает "Memory programmed". BOOT0 подключен к земле.

В чем может быть проблема?
:idea:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25559
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Может все таки зациклить код в конце main?
Кагбэ контроллеры не умеют стоять на месте при исполнении кода... Они в случае отсутствия осмысленного цикла уходят в никуда и ресетятся. То есть Вы можете и не увидеть включенную ногу из за малой скважности этого состояния...
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

Добавил бесконечный цикл

Код: Выделить всё

int main(void)
{
	RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
	GPIOB->MODER = 0x55555555;
	GPIOB->OTYPER = 0;
	GPIOB->ODR = 0x0000FFFF;

	while(1){}

    return 0;
}
Эффект тот же самый :(

Могут ли с CMSIS быть какие-либо косяки?
:idea:
Друг Кота
Аватара пользователя
Сообщения: 25559
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Включите отладчик и остановите исполнение в бесконечном цикле.
Там и увидите что не работает.
Скорее всего не запущено тактирование портов.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

КРАМ писал(а):Включите отладчик и остановите исполнение в бесконечном цикле.
+

Прямо из кокоса запустите отладку, выполняйте по шагам и будете видеть все регистры периферии в реальном времени.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

А вот и начались первые траблы. Через ST-Link Utility все прошивается.
В CooCox'e, после нажатия "Debug" пишет следующее:
Error: Flash driver function execute error
Program Download Failed !
В диспетчере устройств тоже странно отображается:

Изображение

И теперь новая проблема: CooCox программатор видит, к нему подключается, но код не зашивает? :o

П. С. Настройки отладки таковы:

Изображение
Вложения
ballast2.png
(37.3 КБ) 3548 скачиваний
ballast.png
(5.23 КБ) 3487 скачиваний
:idea:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

У меня с кокосом была проблема с отладкой в RAM. Победил тем, что сначала вставляю STlink и только затем включаю отладку в RAM. Если уже стоит RAM, переключаю во Флеш и обратно в RAM.
Max clock стоит у меня 1МГц.

А вот еще что. Я как-то что то сделал :dont_know: , что кокос ваще не стал видеть контроллер. Подключился через ST-Link Utility и стер контроллер, кокос тогда опять стал дебажить.

А у Вас в кокосе только дебаг не робит? Попробуйте просто залить прошивку.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

Только что попробовал ST-link'ом полностью стереть чип.
Потом в Кокосе прошил проц. Прошился. А вот повторно прошивать его не захотел,
выдавая ту же самую ошибку:
Flash driver function execute error
Это какой-то одноразовый чип получается :dont_know:

Проверил еще раз: если из Кокоса чип стереть, то его можно прошить/отладить, но только один раз!
Потом начинает вылетать вышеуказанная ошибка, и его опять приходится стирать.

Да и отладка, хоть и запускается, все равно не пашет: выдает следующее
Reading symbols from D:/\310\353\374\377/CooCox/HW2/HW2/Debug/bin/HW2.elf...(no debugging symbols found)...done.
file "D:/\310\353\374\377/CooCox/HW2/HW2/Debug/bin/HW2.elf"
Reading symbols from D:/\310\353\374\377/CooCox/HW2/HW2/Debug/bin/HW2.elf...(no debugging symbols found)...done.
set tdesc filename C:/Program Files (x86)/CoIDE_V2Beta/bin/target_desc/arm-with-m.xml
target remote 127.0.0.1:2009
Remote debugging using 127.0.0.1:2009
0xb5103302 in ?? ()
tbreak main
Function "main" not defined.
Continuing.
continue
:idea:
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Лучше заюзать либу, SPL или HAL. Это куда нагляднее и понятнее чем прямая запись в регистры. :shock: :shock:

Если такие проблемы с отладкой, может стоит сменить IDE. В EmBitz нет сложностей с отладкой ST-link'ом.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Мурик писал(а): Это куда нагляднее и понятнее чем прямая запись в регистры. :shock: :shock:
Бредим? :)))

gauss, Настройки пинов SWD затронуты, теперь физически подсоединить Reset и отметить опцию - Connect under Rsest.
И я вам советую начать осваивать Keil , все остальные IDE сплошные глюки и танцы с бубном .
Если нужна "рыба" на F0, могу здесь выложить...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

Все-таки тяжело прогать в общаге, когда у тебя мобильный интернет и 10 гигов трафика в месяц,
а безлимит только с часу ночи до семи утра :)

Господи, чего только не перепробовал: IAR, AtollicTrue, Coocox... В итоге, как и советовали, скачал Keil.
Самая новая - 5.2 - вызвала кучу непонимания, ибо слишком новая :) В итоге остановился на 4.74.
Все сделал по рекомендации и... я таки-помигал этим чертовым диодом!!! :beer: :beer: :beer:

Спасибо всем за помощь и советы. В ряду ARM'щиков пополнение :))

Остался только небольшой вопрос: практически пустая прога уже занимает что-то около полутора КБайт.
А вот куда они уходят - не очень-то ясно :o Расскажите, пожалуйста :)
:idea:
Друг Кота
Аватара пользователя
Сообщения: 25559
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Полтора килобайта ЧЕГО?
Флеша или хекса?
А вообще инициализация стм32 занимает много места.
Тем более, что все это делается через шаблоны структур...
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

Сообщение gauss »

Program Size: Code=1268 RO-data=212 RW-data=20 ZI-data=1636
После компиляции выдает такое. Code -насколько я понял, то, что лежит во flash'e, дальше.... наверное, что-то в ОЗУ
зарезервировано. Ну и общий размер :)
:idea:
Друг Кота
Аватара пользователя
Сообщения: 25559
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Не забывайте, что это 32 разрядная машина и обычный NOP занимает 4 байта.
RO (read only) - константы в програмном флеше
RW (read/write) - переменные в ОЗУ
ZI (zero init.) - ОЗУ инициализированное нулями
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

КРАМ писал(а): Тем более, что все это делается через шаблоны структур...

"Рыба" на F0 - один стартап без систем , инит тактовой вручную :

Program Size: Code=1456 RO-data=224 RW-data=36 ZI-data=1636

При включенной опцией Use Microlib

Program Size: Code=936 RO-data=224 RW-data=36 ZI-data=1028

С оптимизацией Level 3

Program Size: Code=576 RO-data=224 RW-data=16 ZI-data=1024
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

dosikus писал(а):
Мурик писал(а): Это куда нагляднее и понятнее чем прямая запись в регистры. :shock: :shock:
Бредим? :)))
Т. е. код из этого сообщения понятный без просмотра даташита?

Код: Выделить всё

   GPIOB->MODER = 0x55555555;
   GPIOB->OTYPER = 0;
   GPIOB->ODR = 0x0000FFFF;
Представьте что в таком же виде настраивается вся периферия...
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

КРАМ писал(а):Не забывайте, что это 32 разрядная машина и обычный NOP занимает 4 байта.
Неужели?
Вложения
nop.PNG
(24.68 КБ) 795 скачиваний
Держит паяльник хвостом
Аватара пользователя
Сообщения: 958
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Мурик писал(а):Т. е. код из этого сообщения понятный без просмотра даташита?

Код: Выделить всё

   GPIOB->MODER = 0x55555555;
   GPIOB->OTYPER = 0;
   GPIOB->ODR = 0x0000FFFF;
Представьте что в таком же виде настраивается вся периферия...
А если так, код из реального проекта STM32F449:

Код: Выделить всё

// разрешение тактирования портов A, B, C, D
RCC->AHB1ENR = RCC_AHB1Periph_GPIOA		* 1	// GPIOA clock
			| RCC_AHB1Periph_GPIOB	* 1	// GPIOB clock
			| RCC_AHB1Periph_GPIOC	* 1	// GPIOC clock
			| RCC_AHB1Periph_GPIOD	* 1	// GPIOD clock
			| RCC_AHB1Periph_GPIOE	* 0	// GPIOE clock
			| RCC_AHB1Periph_GPIOF	* 0	// GPIOF clock
			| RCC_AHB1Periph_GPIOG	* 0	// GPIOG clock
			| RCC_AHB1Periph_GPIOG	* 0	// GPIOG clock
			| RCC_AHB1Periph_GPIOI	* 0	// GPIOI clock
			| RCC_AHB1Periph_GPIOJ	* 0	// GPIOJ clock (STM32F42xxx/43xxx devices) 
			| RCC_AHB1Periph_GPIOK	* 0;	// GPIOK clock (STM32F42xxx/43xxx devices)  
и так:

Код: Выделить всё

// ------------------------ Порт А
// PA0 - UART4_TX (AF8) - UART_EXT_TX
// PA1 - UART4_RX (AF8) - UART_EXT_RX
// PA2 - USART2_TX (AF7) - MIDI TX
// PA3 - USART2_RX (AF7) - MIDI TX
// PA4 - I2S1_WS (AF5) - выход 48кГц = Fs
// PA5 - I2S1_CK (AF5) - выход 64Fs
// PA6 - I2S2_MCK (AF6) - выход 256Fs
// PA7 - I2S1_SD (AF5) - вход данных
// PA8 - GPIO OUT	- I2S1_ON - 0-выкл 1-вкл АЦП
// PA9 - OTG_FS_VBUS (???)
// PA10 - OTG_FS_ID (AF10)
// PA11 - OTG_FS_DM (AF10)
// PA12 - OTG_FS_DP (AF10)
// PA13 - SWDIO (AF0)
// PA14 - SWCLK (AF0)
// PA15 - GPIO BIDIR	- SPI ESP NSS
GPIOA->MODER = GPIO_MODER_MODER0_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER1_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER2_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER3_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER4_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER5_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER6_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER7_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER8_0	// 01 - выход
			| GPIO_MODER_MODER10_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER11_1	// 10 - альтернативная ф-я
			| GPIO_MODER_MODER13_1	// 10 - SWDIO
			| GPIO_MODER_MODER14_1	// 10 - SWCLK
			| GPIO_MODER_MODER15_0;	// 01 - выход
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

GARMIN писал(а):А если так
Так уже лучше. :)
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

GARMIN писал(а): А если так, код из реального проекта STM32F449:

Код: Выделить всё

// разрешение тактирования портов A, B, C, D
RCC->AHB1ENR = RCC_AHB1Periph_GPIOA		* 1	// GPIOA clock
			| RCC_AHB1Periph_GPIOB	* 1	// GPIOB clock
			| RCC_AHB1Periph_GPIOC	* 1	// GPIOC clock
			| RCC_AHB1Periph_GPIOD	* 1	// GPIOD clock
			| RCC_AHB1Periph_GPIOE	* 0	// GPIOE clock
			| RCC_AHB1Periph_GPIOF	* 0	// GPIOF clock
			| RCC_AHB1Periph_GPIOG	* 0	// GPIOG clock
			| RCC_AHB1Periph_GPIOG	* 0	// GPIOG clock
			| RCC_AHB1Periph_GPIOI	* 0	// GPIOI clock
			| RCC_AHB1Periph_GPIOJ	* 0	// GPIOJ clock (STM32F42xxx/43xxx devices) 
			| RCC_AHB1Periph_GPIOK	* 0;	// GPIOK clock (STM32F42xxx/43xxx devices)  
Я примерно так же описываю, но стиль чуток другой. Мне он кажется нагляднее.

Код: Выделить всё

  RCC->AHBENR |= (
    1 * RCC_AHBENR_GPIOAEN | // GPIOA clock enable
    1 * RCC_AHBENR_GPIOBEN | // GPIOB clock enable
    0 * RCC_AHBENR_GPIOCEN | // GPIOC clock disable
    0 * RCC_AHBENR_GPIODEN | // GPIOD clock disable
    1 * RCC_AHBENR_GPIOFEN   // GPIOF clock enable
  );
При такой записи получается почти унификация с вызовом функций, получающих битовые параметры. Как пример, приведу вызов функции из своего кода работы с NRF24L01

Код: Выделить всё

  nrf_write_register(CONFIG,     // Transmitter power-up
    0 * NRF24_CONFIG_PRIM_RX      |  // select TX mode
    1 * NRF24_CONFIG_PWR_UP       |  // turn power on
    1 * NRF24_CONFIG_EN_CRC       |  // enable CRC
    0 * NRF24_CONFIG_CRCO         |  // use 8-bit CRC
    1 * NRF24_CONFIG_MAX_RT       |  // disable MAX_RT flag
    0 * NRF24_CONFIG_TX_DS        |  // enable "TX Data Sent" flag
    1 * NRF24_CONFIG_RX_DR           // disable "RX Data Ready" flag
  );
Ответить

Вернуться в «ARM»