Четвер, 25.04.2024, 01:44
Приветствую Вас Гість | RSS

Radiomanoff+

Меню сайта
Форма входа
Календарь
«  Серпень 2016  »
ПнВтСрЧтПтСбНд
1234567
891011121314
15161718192021
22232425262728
293031

Блог

Главная » 2016 » Серпень » 16 » Stm32f030f4 & Ds3231.CubeMX HAL & I2C . Годинник з будильником та термометром
22:26
Stm32f030f4 & Ds3231.CubeMX HAL & I2C . Годинник з будильником та термометром

Пропоную ваші увазі проект годинника з будильником та термометром на мікроконтролері stm32f030f4p6 та годиннику реального часу на мікросхемі ds3231.

Для початку нагадаємо ,що МК серії stm32f0хх впринципі мають на своєму "борту" - годинник реального часу RTC. Та всеж в корпусах TSSOP20 та QFP32 відсутній пін для підключення батарейки, це не дає змогу зберігати покази годинника при відключенні живлення. Саме корпус TSSOP20 має наш МК stm32f030f4p6  .

Саме по причині відсутності батарейки, вирішено було примінити зовнішній RTC. Вибір впав на ds3231 . Ця мІкросхема досить непогано себе зарекомендувала. крім того її досить просто купити в мережі у вигляді ARDUINO-шилда в придачу з мікросхемою пам'яті , при чому по досить "демократичні" ціні...

На відміну від безлічі популярних, але застарілих рішень, тут на платі немає кварцевого резонатора, який визначає точність та стабільність ходу годинника, але водночас є самим примхливим вузлом. Сучасний надмініатюрний резонатор захований в корпус мікросхеми DS3231. Там же знаходиться термометр і схема термокомпенсації. Така система забезпечує точність ходу кілька хвилин на рік - близько 4ppm, тобто 4 мільйонні частки в діапазоні температур від нуля до +40 градусів Цельсія. Параметри звичайних кварців гірше в десятки раз! У мікросхемі реалізована цифрова корекція ходу, є два будильника, високосний календар на 100 років і безліч інших "зручностей". Докладний опис мікросхеми DS3231 можна подивитись на сайті виробника.

Також в проекті примінено дисплей NOKIA 5110 та 3 кнопки , підключених як у минулій статі .

Принципова схема:

Розбір польотів - STM32 & CubeMX HAL & I2C.

Мікросхема DS3231 "спілкується" з мікроконтролером за допомогою шини I2C ( послідовна шина даних для зв'язку інтегральних схем, що використовує дві двохнаправлені лінії зв'язку SDA і SCL ). 

Мені доводилось вже підключати цей RTC до МК Atmega... все працювало, при чому набагато краще DS3107. Підключити ж їх до STM32 та заодне "поюзати I2C" захотілось після перегляду на Ютубі  "суперових" відео уроків від NarodStream .

Отже уроки 8 та 9 ( https://www.youtube.com/ ) , автор досить детально описує процес налаштувань I2C в программі Cube MX від STMicroelectronics ., ми ж зупинимось лиш на деяких моментах...

Створюємо проект, вибираємо наш МК STM32F030F4P6. Налаштування практично ідентичні минулому - проекту, тільки вмикаємо ще I2C .

Далі створюємо проект, і тепер нам потрібні функції для роботи з I2C.

У відеоуроках автор створив буфер aTxBuffer в який зчитував всі дані з мікросхеми RTC а далі з буфера вже витягував потрібні йому значення секунд,минут,годин і тд., причому тільки перших 7 байт.

Цього безумовно достатньо для уроку , щоб зрозуміти "принцип дії", та всеж на практиці  зручніше зчитувати "побайтно" , наприклад зчитати температуру ( 11Н та 12Н )

    temp1 = I2C_Read_Byte(hi2c1,(uint16_t)0xD0, 0x11);
    temp2 = I2C_Read_Byte(hi2c1,(uint16_t)0xD0, 0x12);

Ось сама функція:

//Прочитати байт

uint8_t I2C_Read_Byte(I2C_HandleTypeDef hi,uint8_t DEV_ADDR,uint8_t addr)
{
  uint8_t data = 0;
  uint8_t d;
  while (HAL_I2C_GetState(&hi) != HAL_I2C_STATE_READY);
  d = HAL_I2C_Master_Transmit(&hi, (uint16_t) DEV_ADDR, &addr, 1, (uint32_t) 10000);
  if ( d != HAL_OK) {
      return d;
  }

  while (HAL_I2C_GetState(&hi) != HAL_I2C_STATE_READY);
  d = HAL_I2C_Master_Receive(&hi, (uint16_t) DEV_ADDR, &data, 1, (uint32_t) 10000);
  if ( d != HAL_OK) {
      return d;
  }
  return data;
}

Теж саме тільки записати, наприклад записати дату ( 04Н )

         // ------set date------
         date_var = RTC_ConvertFromBinDec(date_var);              
         I2C_Write_Byte(hi2c1,(uint16_t)0xD0,0x04,date_var);

Також сама функція:

//Записати байт

uint8_t I2C_Write_Byte(I2C_HandleTypeDef hi,uint8_t DEV_ADDR,uint8_t addr, uint8_t data)
{
  uint8_t buf[] = {addr, data};
  uint8_t d;
  while (HAL_I2C_GetState(&hi) != HAL_I2C_STATE_READY);
  d = HAL_I2C_Master_Transmit(&hi, (uint16_t) DEV_ADDR, buf, 2, (uint32_t) 10000);
  if ( d != HAL_OK) {
      return d;
  }
  return HAL_OK;
}

При цьому функції , ще вертає значення HAL_OK , якщо все нормально...

// **********************************************************************************************************************

Ну і фото зборки нашого "заліза"

 

 

 

Ще вирішується питання , що використовувати в якость сигнала будильника ( PF0 ) ...

Проект для KEIL http://radiomanoff.at.ua/load/ds3231_stm32/1-1-0-40

 

 

Просмотров: 5789 | Добавил: rastamanoff | Рейтинг: 5.0/1
Всего комментариев: 1
1 Unsaddy  
0
<a href=https://vardenafil.buzz>levitra avis doctissimo</a> Herbs, FDA, 130 p542 45

Ім`я *:
Email *:
Код *:
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0