LINUX.ORG.RU

Программирование ARM

 , , , ,


1

4

Ко мне пришли долгожданные посылки.

Итак, имеется:

1) Минимальная плата с STM32F103.

2) Китайский ST-LINK V2

3) USB-адаптер на базе FT232 со всеми выведенными пинами (можно эмулировать JTAG с помощью bitbang)

4) Ноутбук с Debian Testing

Имеется опыт программирование AVR с помощью avr-gcc, Makefile и текстового редактора. Уже смог скомпилировать st-flash из исходников и для теста очистить память МК - st-flash всё сделал и вывел параметры моего МК, значит я всё подключил правильно.

Что мне делать? Для начала - какой компилятор нужен? Желательно из репозиториев. Во-вторых, откуда взять заголовочные файлы для конкретных ядер? Опять же было бы не плохо из репозиториев. С AVR было просто - все компоненты качались из реп, в итоге я мог не беспокоиться на наличии подключаемых файлов и стандартных библиотек.

★★★★★

Последнее исправление: KivApple (всего исправлений: 2)

Возьми у меня с сосфоржа ir-controller, там как раз для 103-го. Будет тебе и образец Makefile заодно.

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

Спасибо большое. Создал на основе твоего проекта пустой свой. Разобрался с миганием светодиодом и USART, а теперь уже полдня мучаюсь и не могу заставить работать I2C. У тебя нет примера работы с ним?

Сделал так:

void i2c_init() {
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
	
	GPIO_InitTypeDef pin;
	GPIO_StructInit(&pin);
	pin.GPIO_Pin = GPIO_Pin_6;
	pin.GPIO_Mode = GPIO_Mode_AF_OD;
	
	pin.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOB, &pin);
	pin.GPIO_Pin = GPIO_Pin_7;
	GPIO_Init(GPIOB, &pin);
	
	//GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);
	//GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);
	I2C_InitTypeDef i2c;
	i2c.I2C_ClockSpeed = 400000;
	i2c.I2C_Mode = I2C_Mode_I2C; 
	i2c.I2C_DutyCycle = I2C_DutyCycle_2;
	i2c.I2C_OwnAddress1 = 0;
	i2c.I2C_Ack = I2C_Ack_Disable;
	i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_Init(I2C1, &i2c);
	I2C_Cmd(I2C1, ENABLE);
}

void i2c_start(uint8_t addr) {
	while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
	I2C_GenerateSTART(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
	I2C_Send7bitAddress(I2C1, addr & ~1, (addr & 1) ? I2C_Direction_Receiver : I2C_Direction_Transmitter);
	if (addr & 1) {
		while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
	} else {
		while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	}
}

void i2c_stop() {
	I2C_GenerateSTOP(I2C1, ENABLE);
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}

void i2c_write(uint8_t data) {
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
	I2C_SendData(I2C1, data);
}

uint8_t i2c_read(uint8_t ack) {
	if (ack) {
		I2C_AcknowledgeConfig(I2C1, ENABLE);
	} else {
		I2C_AcknowledgeConfig(I2C1, DISABLE);
		I2C_GenerateSTOP(I2C1, ENABLE);
	}
	while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
	uint8_t data = I2C_ReceiveData(I2C1);
	return data;
}

Всё это дело зависает на последнем цикле функции i2c_start как только я хочу обратиться к своему датчику MPU6050 после вызова i2c_init. При этом SCL опускается в низкое состояние (если не делать i2c_start и дальнейший обмен, а только инициализацию, то SCL в высоком уровне как и положено при бездействии).

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

Не, с I2C не работал. Кстати, стоит избегать пользоваться SPL для элементарных операций — меньше шансов будет ошибиться. SPL — тот еще быдлокод.

Eddy_Em ☆☆☆☆☆
()

Могу посоветовать поюзать CMSIS. Про STM не скажу, но NXP для своих LPC выпускает готовые библиотеки.

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

Ещё вопрос: где можно почитать как работать с USB? Везде пишут про IDE, а по-нормальному объяснить не могут. С AVR и V-USB гайды были гораздо адекватнее, а на STM всё ужасно запутано.

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

Этого в интернетах завались. Я делал обычный CDC, чтобы не париться — ни модулей ядра, ни libusb не нужно. У меня тоже реализовано в примере. Правда, на основе SPL — это жутко. Там в USB такой мегабыдлокод, что вообще странно, как оно может работать. Правда, на 407-м я пытался с SPL реализовать одновременную работу обоих USB портов — не вышло. Надо переписывать оригинальный быдлокод, но некогда.

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