Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

В 01.04.2018 в 17:56, Alex сказал:

Keil 5.25 (последний на сегодняшний день). STM32-Discovery (STM32F100).
Проблема - МК, после залития прошивки, не запускается. Приходится либо передёрнуть питание, либо нажать на батон сброса.

Разобрался. Надо было галочку поставить :
2018-04-01_16-09-18.png.8a66e82dfc14e1a5718615344721a4b8.png

Использую STM32CubeMX. Мне это не помогло.

Прошивка и отладка не работают. 

В файле stm32f1xx_hal_msp.c
Закомментировал строку
  //__HAL_AFIO_REMAP_SWJ_DISABLE();

После этого загрузка и отладка стали работать нормально.

МК - STM32F103C8T6

Изменено пользователем Smith2007
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

ну первым то делом надо все свалить конечно же не на кривость собственных рук

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Проблема такая: есть часы DS1307 и на платке с ними память AT24С32N, используя HAL записываю в память значение, и считывая его оно считывается как положено, но сняв питание с памяти 24C32, и подав снова питание на память, в памяти 0, вот так вот. Помогите пожалуйста:

 HAL_I2C_Mem_Write(&hi2c2, 0xD0,0x14,1,&loud2,1,5);
HAL_I2C_Mem_Read(&hi2c2,0xD1,0x14,1,&data59,1,5);

Так само если делаю регистрами:

void i2c_eeprom_write2(uint16_t address5, uint8_t data190)
{
  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));
  (void) I2C2->SR1;

  I2C2->DR = 0xD0;
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;

  I2C2->DR = address5;
  while (!(I2C2->SR1 & I2C_SR1_BTF));

  I2C2->DR = data190;
  while (!(I2C2->SR1 & I2C_SR1_BTF));

  I2C2->CR1 |= I2C_CR1_STOP;
}

uint8_t i2c_eeprom_read(uint16_t address6)
{


  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));
  (void) I2C2->SR1;

  I2C2->DR = 0xD0;
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;

  I2C2->DR = address6;
  while (!(I2C2->SR1 & I2C_SR1_BTF));


  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));/
  (void) I2C2->SR1;

  I2C2->DR = 0xD1;// 
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;


	// ожидаем окончания приема данных
	while (!(I2C2->SR1 & I2C_SR1_RXNE))
	{
	}

	// cчитываем приянтое значение
	
  
}
i2c_eeprom_write2(0x05, 19);
i2c_eeprom_read(0x05);
data59 = I2C2->DR;

 

Ссылка на комментарий
Поделиться на другие сайты

У моей адрес 0x68(просканировав адреса) + бит передачи, или приема и получаем 0хD0, хотя может реально пишу в часы, и попробовать второй адрес на I2C 0х50.

Попробовал и A0, тоже самое, как буд-то память энергозависимая, так то ж записывает и считывает, а питание отключил, и по нулям.

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

19 minutes ago, Электронщик said:

просканировав адреса

Чем сканируете адреса ? Если адрес записываете в I2C2->DR, то надо писать тот что в даташите. Для часов

Clipboard09.jpg.001beab96ec5f53d3408462c8672c73a.jpg

А для памяти

Clipboard10.jpg.e643b67527ce776dd51cf33f93d82767.jpg

 

Ссылка на комментарий
Поделиться на другие сайты

Сканирую через ардуино Уно, там все просто выводим в юарт переменную счётчика при выставлении флажка на ответ стартовой команды, и этот сканер ни разу не подводил, и часы работают с адресом от сканера. Проблема скорее всего что думаю возможно что после хала, или с кодом на регистрах, нужна команда сохранения, но не знаю точно.  Так то все работает.

Адреса по даташите для памяти, у меня А0 ну и А1(что я и писал 0х50), но пробовал тоже самое.

Сейчас ещё раз попробую

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Библиотеки Ардуино передаваемый адрес например 0х68 сдвигают на один бит влево и добавляют бит чтение/запись. Для часов получается D0/D1

Для памяти адрес 0x50 будет 0xA0/0xA1. Не знаю как хал, но если пишете в регистры, то надо адрес 0xA0/0xA1.

Действительно вы пишете в часы в регистр года. При выключении питания он сбрасывается.

Ссылка на комментарий
Поделиться на другие сайты

Я знаю за адреса, я же и писал что 0х68 + бит чтения записи, что даёт D0 D1, а второй адрес 0х50 + тоже бит что и даёт А0 А1, просто плата лежала, давно не к СТМ подключал, адреса записал, а что к чему нет, и запутался а трёх соснах, спасибо. Вот только сейчас так делаю и ничего, считываются при чтении 255, а не 8, и в регистры тоже самое

 uint8_t data94=8;

HAL_I2C_Mem_Write(&hi2c2, 0xA0,0x14,1,&data94,1,5);
HAL_I2C_Mem_Read(&hi2c2,0xA1,0x14,1,&data59,1,5);
 

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Так же проблема у Америкосов, и по оду никто не решил. https://community.st.com/thread/37467-unable-to-read-and-write-to-i2c-eeprom

Причем с i2c постоянно проблема на стм, то часы не мог запустить, пока параллельно резистору подтяжки сцл не повесил еще один резистор, и по нету у многих проблемы

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

странно, у меня с i2c как раз вообще проблем никаких не наблюдалось пока. И девайсы все те же (1307 и 24Схх в основном). Может все таки дело в прокладке?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Да часы то работают, как и раньше, и даже попробовал в часы записать байт, а потом снял питание и подал сново и только считывал этот байт и то что нужно в еепроме самих часов( настройке часов сохраняется), а вот в 24C ну никак, может она там какая-то бракованная, плата то за 17грн., Жаль нет другой, придется наверное к Меге, или ардуино прицепить попробовать как память себя ведёт.А ну платка СТМ самая дешёвая на f103 за 70 грн, читал помню что это могут попадаться китайские чипы, как нелеквид, или что-то в этом роде

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

11 minutes ago, Электронщик said:

в еепроме самих часов( настройке часов сохраняется)

там нет епрома, там просто срам. :huh: Чет чую у вас что-то  не то далеко не с i2c )

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, mail_robot сказал:

там нет епрома, там просто срам. :huh: Чет чую у вас что-то  не то далеко не с i2c )

Проблема в том что с этой платы часы что запускал на AVR что на  STM32, как доходят 69 минут и идут сразу на 86 минут, с часами 3223, или 2332, не помню какие все нормально работает, может такой чип часов кривой и память такая, просто а другой стране и не могу другой чип достать

Ссылка на комментарий
Поделиться на другие сайты

Проверил память на Атеге нормально, подключил осцил на тригер по одиночному  фронту, и обмен данными с стм от 24С есть, потом подправил функции HAL, то как я отправлял халом неправильно, причем я так нигде и не нашел по нету, правильные примеры с халом, суть теперь в том что запись регистрами нормально работает, а нормально прочитать могу только халом, что не так с регистрами при чтении, может что не так делаю, не такая последовательность?

uint8_t i2c_eeprom_read3(uint16_t address66)
{


  I2C1->CR1 |= I2C_CR1_START;
  while (!(I2C1->SR1 & I2C_SR1_SB));
  (void) I2C1->SR1;

  I2C1->DR = 0xA0;
  while (!(I2C1->SR1 & I2C_SR1_ADDR));
  (void) I2C1->SR1;
  (void) I2C1->SR2;

  I2C1->DR = address66;
  while (!(I2C1->SR1 & I2C_SR1_BTF));

  I2C1->CR1 |= I2C_CR1_START;
  while (!(I2C1->SR1 & I2C_SR1_SB));//"Повторный Старт"
  (void) I2C1->SR1;

  I2C1->DR = 0xA1;
  while (!(I2C1->SR1 & I2C_SR1_ADDR));
  (void) I2C1->SR1;
  (void) I2C1->SR2;

 // ожидаем окончания приема данных
	while (!(I2C2->SR1 & I2C_SR1_RXNE))
	{
	}

	data59 = I2C1->DR;
 
  I2C1->CR1 |= I2C_CR1_STOP;
}

 

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

поменьше читайте советских газет ) Своей головой надо думать в первую очередь

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

12 часа назад, GOR23 сказал:

Первый раз такое вижу. Это чтение регистра в "пустоту"? 

Любителям калокуба невдомек что флаги статуса сбрасываются чтением?

 А про "Первый раз такое вижу" - шедеврально, видимо уровень кодописательства  нуль?

Ссылка на комментарий
Поделиться на другие сайты

@dosikus да думаю не нуль. Твой код, сугубо твое дело, мой - сугубо мое.  И язвить тут нечего! А на счёт (void) перед чтением регистра, я действительно такое увидел первый раз. Теперь можно завязывать с программированием МК и идти вешаться?

Изменено пользователем GOR23
Ссылка на комментарий
Поделиться на другие сайты

11 час назад, snn_krs сказал:

Адрес ЕЕПРОМ два байта и передавать надо два раза соответственно.

Да я читал об этом, но если я использую переменную двухбайтную для адреса, и регистр i2c двухбайтный, а адрес ячейки памяти еепром, это 12 бит, зачем тогда отправлять два раза один адрес? Да и запись по регистрам я делаю одним адресом через двухбайтную переменную и все работает, а чтение не работает, так что проблема скорее всего не в этом

Скрытый текст

 

 

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

@Электронщик попробуй это, как-то для интереса делал:

void I2C2_Init(void)
{
  I2C2->CR1 &= ~I2C_CR1_PE;
  I2C2->CR2 = 36;
  I2C2->TRISE = 12;
  I2C2->CCR = 30 | I2C_CCR_FS;
  I2C2->CR1 = I2C_CR1_PE;
  I2C2->OAR1 = 0;
}


void i2c_eeprom_write(uint16_t address, uint8_t data)
{
  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));
  (void) I2C2->SR1;

  I2C2->DR = 0xa0;
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;

  I2C2->DR = (uint8_t) (address >> 8);
  while (!(I2C2->SR1 & I2C_SR1_TXE));
  I2C2->DR = (uint8_t)(address & 0x00FF);
  while (!(I2C2->SR1 & I2C_SR1_TXE));

  I2C2->DR = data;
  while (!(I2C2->SR1 & I2C_SR1_BTF));

  I2C2->CR1 |= I2C_CR1_STOP;
}

uint8_t i2c_eeprom_read(uint16_t address)
{
uint8_t eeprom_data;

  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));
  (void) I2C2->SR1;

  I2C2->DR = 0xa0;
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;

  I2C2->DR = (uint8_t)(address >> 8);
  while (!(I2C2->SR1 & I2C_SR1_TXE));
  I2C2->DR = (uint8_t)(address & 0x00FF);
  while (!(I2C2->SR1 & I2C_SR1_TXE));


  I2C2->CR1 |= I2C_CR1_START;
  while (!(I2C2->SR1 & I2C_SR1_SB));
  (void) I2C2->SR1;

  I2C2->DR = 0xa0 | 0x01;
  while (!(I2C2->SR1 & I2C_SR1_ADDR));
  (void) I2C2->SR1;
  (void) I2C2->SR2;

  I2C2->CR1 &= ~I2C_CR1_ACK;
  while (!(I2C2->SR1 & I2C_SR1_RXNE));
  eeprom_data = I2C2->DR;
  I2C2->CR1 |= I2C_CR1_STOP;
  return eeprom_data;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...