LINUX.ORG.RU

Железячники, подскажите литературу по STM32

 ,


0

1

Оказалось, что программировать STM32 — это вам не PIC'и прошивать!

Свои страдания я излил в уютной ЖЖшечке. Здесь же хочу лишь попросить совета: литературы и дельных ссылок (а то их в интернете 100500, но толковых почти 0).

P.S. Для Ъ: у меня для тренировки макетка STM32-P103, программатор ST-LINK/V2. Компилирование при помощи arm-none-eabi-XXX, заливка при помощи st-flash. Я уже второй день ковыряюсь, но пока получилось запустить лишь один кастрированный примерчик, моргающий диодом. А прикрутить к нему хотя бы таймер не получилось.

P.P.S. Необходимый минимум, который мне нужен в ближайшее время от контроллера: все 4 таймера (часть — для работы на прерывания, часть — для работы в качестве счетчика); управление цифровыми портами (I/O, но это самое простое); USB (работа с железкой через libusb); АЦП. На будущее: ШИМ, CAN, SPI (в т.ч. работа с SD), работа с ЖК-мониторчиком, возможно — ethernet.

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

Reference manual

675 страниц. Его лучше как справочник использовать, а не как учебник.

easyelectronics.ru

Как раз оттуда часть кода и утащил. Не работает нифига. И нет ни одного готового примера (чтобы просто запустил make, прошил и заработало) все нужно перепиливать.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ilovewindows

Смотрел уже. Завтра попробую скомпилять что-нибудь оттуда, но, боюсь, ничего не скомпиляется. Как обычног.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от aol

Нет. Пример был с сайта разработчика макетки. А примеры с STM'овского компиляются, но после прошивки ничего не происходит.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ilovewindows

Мне бы собрать рабочий пример с библиотечкой, чтобы не наковыривать с миру по нитке.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от aol

Попробую еще раз. Возможно, скачал не то…

Eddy_Em ☆☆☆☆☆
() автор топика

В этом коде, например, не видно инициализации прерывания, нужного для Delay() (SysTick).

В StdPeriphLibrary есть достаточно хорошие примеры работы для почти всей периферии. Я обычно следую по такому пути: Пример -> Дока по StdPeriphLibrary -> RM. Не очень правильно, наверное.

Kosyak ★★★★
()

USB

Это самое сложное пожалуй будет. У STM есть библиотека для USB, я летом попытался её вкурить, но как то с первого раза не вышло...

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

В этом коде, например, не видно инициализации прерывания, нужного для Delay() (SysTick).

Это да — у меня под конец рабочего дня совсем каша в голове была. Но дело не только в этом:

GPIOC->BSRR = GPIO_Pin_12;
не работает, светодиод не загорается.

Дока по StdPeriphLibrary

Кривые они какие-то. Но надо будет повнимательнее пошукать.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Kosyak

Да я просто обратил внимание, что в примерах есть эмулятор мышки (который должен курсор по кругу водить) и еще какая-то штука с HID-устройством.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

При том, что в мастдайке есть все эти ваши Keil'ы и прочие IAR'ы. А у нас — только ARM'овский gcc, да st-link. Благо, хоть долбанутый эклипс подключать не надо (а то поначалу только для этой убогости и находил инструкции по прошивке).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

Зря ты так: все необходимое на STM32-P103 есть. Вот, правда, ступил я: надо было другую модель заказывать, у которой еще и LCD есть.

А ардуина — извиняюсь, говно.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Kosyak

Спасибо. Я бы и сам мог, но с готовым проще, конечно.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А ардуина — извиняюсь, говно.

Смотря что нужно делать. Если просто рулить нехитрой железкой, то самое то. По крайней мере там много чего работает искаропки. Не нужно быть линух гуру, чтоб эту хрень завести.

anonymous
()
Ответ на: комментарий от aol

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

Черт-те что! Пока получилось запустить только простейший пример с STM32-P103-EW-ARM5_41.zip…

Похоже, сначала нужно сделать какую-то инициализацию, которую библиотека stdperiphlib не делает.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

Как раз таки для работы с ардуиной и надо быть мега-гуру, т.к. «из коробки» ее вообще невозможно запустить.

STM32 хорош тем, что метод прошивки МК один и тот же — внутрисхемный — что на макетке, что в реальной железяке. А с ардуиной нужно долбить себе мозг, как прошить контроллер после того, как спаяешь железяку.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

может, что-то типа:
Don't forget to enable the external or internal oscillator that you need to use for SYSCLK.
At power-on for default is enabled the internal RC oscillator HSI.
Remember tha there are different sources of clock that for stm32F100xx are:

http://www.emcu.it/STM32/STM32VLDiscovery_Test/Things to remember when develo...

м?

aol ★★★★★
()
Ответ на: комментарий от aol

Дык, запитано:

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime){
	TimingDelay = nTime;
	while(TimingDelay != 0);
}

void SysTick_Handler(void){
	if (TimingDelay != 0x00)
		TimingDelay--;
}

int main(void) {
	GPIO_InitTypeDef GPIOC_init_params;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOC_init_params.GPIO_Pin = GPIO_Pin_12;
	GPIOC_init_params.GPIO_Speed = GPIO_Speed_50MHz;
	GPIOC_init_params.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIOC_init_params);

	GPIO_WriteBit(GPIOC,GPIO_Pin_12,Bit_SET);
	if(SysTick_Config(SystemCoreClock / 1000)){
		while (1);
	}
	__enable_irq();
	while(1){
		GPIOC->ODR ^= GPIO_Pin_12;
		Delay(50);
		GPIOC->ODR ^= GPIO_Pin_12;
		Delay(100);
	}
}
Но при этом светодиод не загорается

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от aol

Его-то я и запускал: компилится и работает.

Но мне-то хочется на stdperiphlib...

А если я в примеры с stdperiphlib даже добавлю Clk_Init, все равно ничего не работает.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от rimsleur

Есть оно у меня. Толку-то...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

если через недели три-месяц всё еще будет актуально, я обязательно посмотрю! просто дома сейчас ремонт, и всё распихано чёрти куда...

aol ★★★★★
()
Ответ на: комментарий от aol

Надеюсь, не будет. Но чем черт ни шутит...

А пока — попробовал ну уж совсем элементарщину:

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

void myDelay(unsigned long delay ){
	while(delay) delay--;
}

int main(void) {
	GPIO_InitTypeDef GPIOC_init_params;
	SystemInit();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOC_init_params.GPIO_Pin = GPIO_Pin_12;
	GPIOC_init_params.GPIO_Speed = GPIO_Speed_50MHz;
	GPIOC_init_params.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIOC_init_params);

	while(1){
		GPIOC->ODR ^= GPIO_Pin_12;
		myDelay(1500000);
		GPIOC->ODR ^= GPIO_Pin_12;
		myDelay(1500000);
	}
}
И… фигвам! Компилируется на ура. Но не прошивается:
make load
st-flash write testproject 0x08000000
2012-10-12T12:12:21 INFO src/stlink-common.c: Loading device parameters....
2012-10-12T12:12:22 INFO src/stlink-common.c: Device connected is: F1 Medium-density device, id 0x20036410
2012-10-12T12:12:22 INFO src/stlink-common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x20000 bytes (128 KiB) in pages of 1024 bytes
2012-10-12T12:12:22 INFO src/stlink-common.c: Attempting to write 91169 (0x16421) bytes to stm32 address: 134217728 (0x8000000)
2012-10-12T12:12:22 WARN src/stlink-common.c: unaligned addr or size
stlink_fwrite_flash() == -1
make: *** [load] Ошибка 255

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от aol

Нет, я его yaourt'ом установил из AUR'а (а там как раз с git'а качается).

pacman -Q stlink-git 
stlink-git 20121012-1

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от rimsleur

Дык, прикол в том, что даже без таймеров фигвам (точнее: не получилось загрузить, ХЗ — может код и рабочий)

Похоже, явно надо сделать какие-то дополнительные шаманские действия. А что именно — хрен поймешь.

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Я так понимаю при выполнени meke load запускается утилита st-flash? А что такое 0x08000000? Я не понимаю, почему в сообщении стоит ссылка на исходник (..src/stlink-common.c:..). На данном этапе мы вроде как бинарник имеем.

Ты же имеешь один рабочий пример? В чем разница между ним и этим примером? Может перед прошивкой нужно стирать флешь отдельной командой?

rimsleur
()
Ответ на: комментарий от rimsleur

(..src/stlink-common.c:..)

это отладочные сообщения из стлинка, когда он не смог

0x08000000

базовый адрес на борде, куда заливать

aol ★★★★★
()
Ответ на: комментарий от rimsleur

Я так понимаю при выполнени meke load запускается утилита st-flash?

Да

А что такое 0x08000000?

адрес, по которому загружается прошивка

Я не понимаю, почему в сообщении стоит ссылка на исходник (..src/stlink-common.c:..).

Потому что это — стандартные ошибки stlink'а

Ты же имеешь один рабочий пример? В чем разница между ним и этим примером?

Разница в уйме исходных файлов.

Может перед прошивкой нужно стирать флешь отдельной командой?

Она и стирается st-flash'ем.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от amaora

Похоже, придется долго ковыряться: нахрапом не получилось.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от aol

Черт меня дери! Я Makefile неправильный сделал: забыл добавить objcopy, в результате получалось черт те что.

Теперь предыдущий примерчик скомпилировался, прошился и запустился. Мигает.

Сейчас с таймером попробую.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

оу, йесс! ;)

а ведь была у меня идея стребовать makefile...

aol ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.