STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3931415#p3931415"]"Частота скакнула" -- это и есть суть явления, упомянутого мной, как "дрожание". Совершенно точно, что ни "триггер", ни "крутизна" никак на него не влияют.[/uquote]Суть в том, что частота HSI дрожит на порядки меньше, чем может показаться по видео и в таком случае ничего в этом удивительного нет. Вероятно такие-же скачки можно получить и для HSE если заставить мк чуть больше пошуметь, например, вывести сигнал другой частоты на еще один пин...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

ARV, вижу вы частый гость в этой теме? :) Таки начали изучать STM32? :)))
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3931418#p3931418"]Суть в том, что частота HSI дрожит на порядки меньше, чем может показаться по видео и в таком случае ничего в этом удивительного нет. Вероятно такие-же скачки можно получить и для HSE если заставить мк чуть больше пошуметь, например, вывести сигнал другой частоты на еще один пин...[/uquote]
Давайте без вот этих вот фантазий про "на порядки", "может показаться" и "вероятно.. можно получить". Два видео отсняты с одного и того же осциллографа с неизменными настройками, подключенного к одной и той же схеме. Разница лишь в том, что в одном случае к выходу MCO внутри мк скоммутирован генератор HSE, а в другом HSI.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мурик писал(а):Таки начали изучать STM32?
нет. но пока не потерял надежду найти причину это сделать. потому слежу за содержимым. причин же пока не нахожу...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

ARV писал(а):причин же пока не нахожу
Тот кто не хочет найти ни когда не найдет (даже если найдет, сделает вид что не видел). :dont_know: :facepalm:
Реклама
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

[uquote="a5021",url="/forum/viewtopic.php?p=3931466#p3931466"]Давайте без вот ...[/uquote]
просто Вы не показали момент синхронизации, поэтому и пошел такой разговор.
если б по видео было видно - что фронт, по которому синхронизируется развертка "стоит как вкопанный", а далее вправо от него фронты "пляшут" - все б было понятно и разговора за триггер не было б.
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

a5021, судя по вашему осциллографу у вас нестабильность частоты +-0,4ns (+-25кГц для 8МГц), а это 10-3, что вы еще хотите от RC генератора?
Друг Кота
Аватара пользователя
Сообщения: 7049
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Тем более от RC генератора соседствующего с туевой хучей цифровой логики и питающегося от одного с ними источника без развязки внутри одного корпуса. Джиттер в таких условиях обязательно будет присутствовать.
Но, следовало бы фронты импульсов к нормальному виду привести, нагрузкой выхода MCO и подключением щупа непосредственно к выводу. Думаю, дрожание обусловленное нестабильностью момента запуска развертки осциллографа заметно снизится.
Астролябия-сама меряет, было бы что мерять!!!
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Да у него и кварц дрожит, обратите внимание, прыгает между 124,8 и 125,2 , а это уже +-13кГц.
Интересно кварц хоть запаян, или на штырьках?
Друг Кота
Аватара пользователя
Сообщения: 7049
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Да, есть чуть-чуть. Но у меня сейчас STM32F042 стоит в беспаечной макетной плате, там же кварц 4 МГц подключенный проводами по 50 мм. Но таких рывков фазы не наблюдается на MCO.

Еще раз замечу, что причина может быть не столько в генераторе, сколько в том, что синхронизация осциллографа сходит с ума из-за кривого "меандра".

И еще мы не знаем, что там с питанием и с разводкой общего провода.
Астролябия-сама меряет, было бы что мерять!!!
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Чет происходящее все больше начинает напоминать виктимблейдинг -- когнитивное искажение, проявляющееся в том, что реальная картина мира плохо ложится на идеализированные представления об этом самом мире. Раз реальность идет вразрез с представлениями, то виновата, разумеется, реальность. Остается пустячок -- найти виноватых вовне: "дрожит триггер", "крутизна фронта гуляет", "кварц на штырьках", "кривой меандр", "что там с питанием" и т.п.

Голубая пилюля -- известная схема. Куда там запаян кварц и что с разводкой можно посмотреть в гугле. На подопытном экземпляре МК получает питание с XC6204 -- "highly precise, low noise, positive voltage LDO regulator" -- цитата с даташита.
Друг Кота
Аватара пользователя
Сообщения: 7049
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

А все же включите резистор ом на 470 между выходом и общим проводом, и прямо в ногу ему щупом осциллографа, в ногу.
Астролябия-сама меряет, было бы что мерять!!!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Мурик писал(а):Тот кто не хочет найти ни когда не найдет
вы не способны допустить, что существует иная точка зрения, отличная от вашей? только дикари падки на все яркое-блестящее-звонкое, нормально развитым людям нужно нечто большее, чтобы возжелать обладать им.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Asmodey",url="/forum/viewtopic.php?p=3931604#p3931604"]А все же включите резистор ом на 470 между выходом и общим проводом, и прямо в ногу ему щупом осциллографа, в ногу.[/uquote]
Вы советуете странное с этим самым резистором. Выход сконфигурирован, как push-pull 50MHz, что ставит жирный крест на надеждах что-то улучшить подгрузив пин резистором. Осциллом в ногу тыкал и картинка в области минимальных и максимальных уровней выглядит чуть лучше, но на частотно-фазовых характеристиках сигнала это никак не сказалось.
Мудрый кот
Сообщения: 1754
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

Подскажите пожалуйста,как настроить I2C в STM32F03
Пытаюсь освоить СТМ,дошел до I2C и не могу одолеть (COOCOX)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Одна цифра пропущена. F103 или F030?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Мудрый кот
Сообщения: 1754
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

На 103 все замечательно, а вот с 030 проблема, старт проходит и все, далее ничего не отправляется, позже выложу свой исходник (сейчас на работе)

Забросил,поставлю 103-й...
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Novice user писал(а):а вот с 030 проблема
код еще нужен, будете заниматься с кодом?
Мудрый кот
Сообщения: 1754
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Сообщение Novice user »

Я вчера весь вечер гуглил, не нашёл, где то прочитал что I2C вSTM32F030 тот ещё геморр, старт/стоп идут норм, а
При отправке команд в место битов в SDA идут ноли (SCL идёт как положено)
Код ещё интересует, но сегодня проверить не смогу

У меня на плате распаян кроме STM ещё SSD1306, RDA5807, 4 кнопки, прошиваю стлинком
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Novice user писал(а):I2C вSTM32F030 тот ещё геморр,
Не знаю, я по началу думал что I2C вообще не работает, хотя у меня отладчика не было.
Код взят с этого форума
Вот в том виде в котором у меня работает с модулем LCD I2C pcf8574, меня интересовала только передача
Спойлер

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

void init_I2C1(void)
{
	RCC_I2CCLKConfig(RCC_I2C1CLK_HSI);	// I2C Clock Mux - HSI

	// Включаем тактирование нужных модулей
	//RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC->AHBENR |= RCC_AHBENR_GPIOAEN;

	// Тактирование GPIO не включаю, т.к. оно уже включено в начале программы
	RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;		// Включаю тактирование I2C
	// Настройка ног PA9, PA10
	GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1;			// Режим альтернативной функции
	GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10;				// Открытый коллектор
	GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10;	// Максимальная скорость						GPIO_OSPEEDER_OSPEEDR9
	// Выбор альтернативной функции
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);	// I2C1_SCL
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4);	// I2C1_SDA

	I2C_BUS->CR1 &= ~I2C_CR1_PE;			// Отключаю I2C
	while (I2C_BUS->CR1 & I2C_CR1_PE) {};	// Жду пока отключится

	// Частота тактирования модуля I2C = 48 МГц
	// Частота шины I2C = 100 kHz
	// Настраиваю тайминги
	/*I2C_BUS->TIMINGR |= \
	(0xB  << I2C_OFFSET_TIMINGR_PRESC)|\
	(0x13 << I2C_OFFSET_TIMINGR_SCLL)|\
	(0xF  << I2C_OFFSET_TIMINGR_SCLH)|\
	(0x4  << I2C_OFFSET_TIMINGR_SCLDEL)|\
	(0x2  << I2C_OFFSET_IMINGR_SDADEL);
	*/
	I2C_BUS->TIMINGR = (uint32_t)0x2000090E;	

	I2C_BUS->CR1 |= I2C_CR1_PE;					// Включаю I2C
	while ((I2C_BUS->CR1 & I2C_CR1_PE)==0) {};	// Жду пока включится

}

/*
Выполняет транзакцию записи Size байт в регистр Register по адресу Adress.
Параметры:
Adress - адрес ведомого устройства
Register - регистр, в который хотим передать данные
Data - указывает откуда брать данные для передачи
Size - сколько байт хотим передать (от 1 до 254)
Возвращает:
1 - если данные успешно переданы
0 - если произошла ошибка
*/
//u8 I2C_Write_Transaction (u8 Adress, u8 Register, u8 *Data, u8 Size)
void I2C_Write_Transaction (uint8_t Adress, uint8_t Data)
{
	// Старт
	I2C_Start_Direction_Adress_Size (I2C_Transmitter, Adress, 1+1);//1+1);
	// Отправляем байты до тех пор, пока не взлетит TC-флаг.
	// Если взлетит NACK-флаг, отправку прекращаем.
	while ((((I2C_BUS->ISR & I2C_ISR_TC)==0) && ((I2C_BUS->ISR & I2C_ISR_NACKF)==0)) && (I2C_BUS->ISR & I2C_ISR_BUSY))
	{
		if (I2C_BUS->ISR & I2C_ISR_TXIS) I2C_BUS->TXDR= Data;	// Отправляю данные
	}

	I2C_Stop();
}

/*
Это служебная функция, использовать её не нужно.
Устанавливает направление данных - приём или передача.
Задаёт объём пересылаемых данных.
Задаёт адрес ведомого устройства.
Выдаёт старт на шину.
Параметры:
Direction - направление (0-отправка, 1-приём)
Adress - адрес ведомого устройства
Size - размер данных (от 1 до 255 байт)
*/
void I2C_Start_Direction_Adress_Size (I2C_Direction Direction, uint8_t Adress, uint8_t Size)
{
	if (Direction) I2C_BUS->CR2 |= I2C_CR2_RD_WRN;	// Режим приёма
	else I2C_BUS->CR2 &= ~I2C_CR2_RD_WRN;			// Режим передачи
	I2C_BUS->CR2 &= ~I2C_CR2_NBYTES;				// Очистить размер данных
	I2C_BUS->CR2 |= Size<<I2C_OFFSET_CR2_NBYTES;	// Установить размер данных
	I2C_BUS->CR2 &= ~I2C_CR2_SADD;	// Очистить адрес ведомого устройства
	I2C_BUS->CR2 |= (Adress << 1);			// Установить адрес ведомого устройства
	I2C_BUS->CR2 |= I2C_CR2_START;					// Выдать старт на шину
	while ((I2C_BUS->ISR & I2C_ISR_BUSY)==0) {};	// Ожидать выдачу старта
}


/*
Это служебная функция, использовать её не нужно.
Выдаёт стоп на шину.
Очищает флаги.
Проверяет наличие ошибок, очищает флаги ошибок.
*/
void I2C_Stop (void)
{
	I2C_BUS->CR2 |= I2C_CR2_STOP;				// Выдать стоп на шину
	while (I2C_BUS->ISR & I2C_ISR_BUSY) {};		// Ожидать выдачу стопа
	// Очищаю флаги - необходимо для дальнейшей работы шины
	I2C_BUS->ICR |= I2C_ICR_STOPCF;		// STOP флаг
	I2C_BUS->ICR |= I2C_ICR_NACKCF;		// NACK флаг
	// Если есть ошибки на шине - очищаю флаги
	if (I2C_BUS->ISR & (I2C_ISR_ARLO | I2C_ISR_BERR))
	{
		I2C_BUS->ICR |= I2C_ICR_ARLOCF;
		I2C_BUS->ICR |= I2C_ICR_BERRCF;
	}
}
Ответить

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