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

Кто любит RISC в жизни, заходим, не стесняемся.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

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

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

Сообщение Asmodey »

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

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

Сообщение Dimon456 »

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

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

Сообщение Asmodey »

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

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

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

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

Сообщение a5021 »

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

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

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

Сообщение Asmodey »

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

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

Сообщение ARV »

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

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

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

Сообщение a5021 »

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

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

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

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

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

Сообщение Zhuk72 »

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

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

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

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

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

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

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

Сообщение Dimon456 »

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

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

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

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

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

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

Сообщение 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;
	}
}
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

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

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

Спасибо! Буду разбираться
kvn234
Потрогал лапой паяльник
Сообщения: 339
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

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

Сообщение kvn234 »

Здравствуйте.
Изучаю SPI на STM32f030. Не могу понять почему из регистра DR считывается не правильное значение.
Спойлер

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

// Сигнатура
void w25qReadManuf(uint8_t *answer)
{
  
  uint8_t status = W25Q_JEDEC_ID;
  uint8_t i;

  W25Q_CS_LO();
  // Передать команду
  while(!LL_SPI_IsActiveFlag_TXE(SPI1));
  LL_SPI_TransmitData8(SPI1, status);
  while(LL_SPI_IsActiveFlag_BSY(SPI1));
  //LL_SPI_ReceiveData8(SPI1);//Очистка буфера

  // Прочитать сигнатуру
  for(i=0 ; i<3 ; i++)
    {
	  LL_SPI_TransmitData8(SPI1,0xFF);
	  while(!LL_SPI_IsActiveFlag_RXNE(SPI1));
      *(answer++) = LL_SPI_ReceiveData8(SPI1);
    }
  W25Q_CS_HI();
}
Вначале выдается команда на чтение сигнатуры, затем чтение 3х байт. Читаются из DR 0xFF, 0xC8 и 0x40.
Должно быть 0xC8, 0x40, 0x16.


Изображение


Если включаю строку LL_SPI_ReceiveData8(SPI1) то информация читается корректно.
Такое впечатление, что в SPI FIFO буфер. В интернете этот нюанс не нашел.
Последний раз редактировалось kvn234 Пт дек 18, 2020 00:45:53, всего редактировалось 1 раз.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="kvn234",url="/forum/viewtopic.php?p=3943137#p3943137"]Такое впечатление, что в SPI FIFO буфер.[/uquote]
Да, что в этом удивительного? Первый раз читается байт принятый при отправке status. По нормальному нужно перед чтением для RX FIFO делать flush:

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

while (SPI1->SR & SPI_SR_FRLVL)  SPI1->DR;
А перед этим дождаться окончания передачи, для чего проверки BSY недостаточно, такое работало для SPI без FIFO. Должно быть так:

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

while (SPI1->SR & (SPI_SR_FTLVL | SPI_SR_BSY)) {}
В интернете этот нюанс не нашел.
Не нашел в интернете RM на мк?
kvn234
Потрогал лапой паяльник
Сообщения: 339
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

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

Сообщение kvn234 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3943142#p3943142"][/uquote]
Спасибо.

Здесь понятно, буфер очищается.

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

while (SPI1->SR & SPI_SR_FRLVL)  SPI1->DR;
Если будем дожидаться окончания передачи

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

while (SPI1->SR & (SPI_SR_FTLVL | SPI_SR_BSY)) {}
не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="kvn234",url="/forum/viewtopic.php?p=3943150#p3943150"]не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?[/uquote]
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.
kvn234
Потрогал лапой паяльник
Сообщения: 339
Зарегистрирован: Вс апр 17, 2011 09:51:26
Откуда: Тула

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

Сообщение kvn234 »

[uquote="Reflector",url="/forum/viewtopic.php?p=3943152#p3943152"][uquote="kvn234",url="/forum/viewtopic.php?p=3943150#p3943150"]не попадем ли мы в бесконечный цикл, т.к. не происходит чтения DR ?[/uquote]
Дождаться нужно окончания передачи, там свое FIFO, чтение DR тут не при чем.[/uquote]

Не увидел, что FIFO TX
Ответить

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