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

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
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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;

 

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

У моей адрес 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 пользователей онлайн

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

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