
Пропоную ваші увазі проект годинника з будильником та термометром на мікроконтролері 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
|