Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Пт май 13, 2016 12:59:13

Всем привет!
Недавно (буквально пару дней назад :) ) начал осваивать 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 подключен к земле.

В чем может быть проблема?

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

Пт май 13, 2016 13:09:52

Может все таки зациклить код в конце main?
Кагбэ контроллеры не умеют стоять на месте при исполнении кода... Они в случае отсутствия осмысленного цикла уходят в никуда и ресетятся. То есть Вы можете и не увидеть включенную ногу из за малой скважности этого состояния...

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

Пт май 13, 2016 14:57:12

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

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

   while(1){}

    return 0;
}


Эффект тот же самый :(

Могут ли с CMSIS быть какие-либо косяки?

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

Пт май 13, 2016 15:12:53

Включите отладчик и остановите исполнение в бесконечном цикле.
Там и увидите что не работает.
Скорее всего не запущено тактирование портов.

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

Пт май 13, 2016 15:23:44

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

Прямо из кокоса запустите отладку, выполняйте по шагам и будете видеть все регистры периферии в реальном времени.

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

Пт май 13, 2016 15:50:01

А вот и начались первые траблы. Через ST-Link Utility все прошивается.
В CooCox'e, после нажатия "Debug" пишет следующее:

Error: Flash driver function execute error
Program Download Failed !


В диспетчере устройств тоже странно отображается:

Изображение

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

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

Изображение
Вложения
ballast2.png
(37.3 KiB) Скачиваний: 2531
ballast.png
(5.23 KiB) Скачиваний: 2500

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

Пт май 13, 2016 16:09:40

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

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

А у Вас в кокосе только дебаг не робит? Попробуйте просто залить прошивку.

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

Пт май 13, 2016 17:39:47

Только что попробовал 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

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

Пт май 13, 2016 22:42:04

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

Если такие проблемы с отладкой, может стоит сменить IDE. В EmBitz нет сложностей с отладкой ST-link'ом.

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

Сб май 14, 2016 07:34:12

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


Бредим? :)))

gauss, Настройки пинов SWD затронуты, теперь физически подсоединить Reset и отметить опцию - Connect under Rsest.
И я вам советую начать осваивать Keil , все остальные IDE сплошные глюки и танцы с бубном .
Если нужна "рыба" на F0, могу здесь выложить...

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

Сб май 14, 2016 18:08:27

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

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

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

Остался только небольшой вопрос: практически пустая прога уже занимает что-то около полутора КБайт.
А вот куда они уходят - не очень-то ясно :o Расскажите, пожалуйста :)

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

Сб май 14, 2016 18:44:25

Полтора килобайта ЧЕГО?
Флеша или хекса?
А вообще инициализация стм32 занимает много места.
Тем более, что все это делается через шаблоны структур...

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

Сб май 14, 2016 21:52:07

Program Size: Code=1268 RO-data=212 RW-data=20 ZI-data=1636


После компиляции выдает такое. Code -насколько я понял, то, что лежит во flash'e, дальше.... наверное, что-то в ОЗУ
зарезервировано. Ну и общий размер :)

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

Вс май 15, 2016 02:17:54

Не забывайте, что это 32 разрядная машина и обычный NOP занимает 4 байта.
RO (read only) - константы в програмном флеше
RW (read/write) - переменные в ОЗУ
ZI (zero init.) - ОЗУ инициализированное нулями

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

Вс май 15, 2016 08:06:39

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



"Рыба" на 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

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

Вс май 15, 2016 21:03:03

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


Бредим? :)))
Т. е. код из этого сообщения понятный без просмотра даташита?
Код:
   GPIOB->MODER = 0x55555555;
   GPIOB->OTYPER = 0;
   GPIOB->ODR = 0x0000FFFF;
Представьте что в таком же виде настраивается вся периферия...

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

Вс май 15, 2016 21:45:51

КРАМ писал(а):Не забывайте, что это 32 разрядная машина и обычный NOP занимает 4 байта.

Неужели?
Вложения
nop.PNG
(24.68 KiB) Скачиваний: 627

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

Пн май 16, 2016 07:06:15

Мурик писал(а):Т. е. код из этого сообщения понятный без просмотра даташита?
Код:
   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 - выход

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

Вт май 17, 2016 10:11:04

GARMIN писал(а):А если так
Так уже лучше. :)

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

Ср май 18, 2016 00:49:42

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
  );
Ответить