Измеритель частоты, напряжения. Инструменты и реализация на stm8s.

Приобрёл несколько плат Board Minimum System Dev Module ARM STM8003F3P6. На плате кроме микроконтроллера есть стабилизатор AMS 1117 напряжения 3.3 В, кнопка ресет, два сетодиода, контакты для присоединения внешних устройств. Питается от MicroUSB разъёма.

N|Minimum System Dev Module stm8s.

На одном из сайтов, которые продают эти платки скачал примеры программ от китайского программиста. И мне помогли эти примеры проектов писать оптимальный код, если сравнивать с использованием стандарной библиотеки STM8S_StdPeriph_Lib от фирмы STMicroelectronics.

  1. Minimum System Dev Module stm8s. //[электронный ресурс] .- (http://www.uctronics.com/stm8-development-board-minimum-system-dev-module-arm-stm8s103f3p6-for-arduino.html)

N|Скачать примеры проектов U3025-STM8.zip.

Оптимизация проектов для stm8s с использованием IAR STM8.

IoT-измеритель должен измерять частоты F1,F2 и напряжения V1,V2, отображать на oled 1306 индикторе, отправлять измеренные физические величины на UART, подсвечивать светодиодом, желательно в перспективе использовать SPI интерфейс для внешних устройств. Ещё хочется иметь фичу, а именно подключать к UART GPS/GLONASS модуль с тточными секундными импульсами PPS для калибровки внутреннего тактового генератора.

В проект Meas_Fx_Vx собирал с использованием STM8S_StdPeriph_Lib. Библиотека классная! Хорошо задокументированная, имеются примеры проектов. Умеет "отлавливать" ошибки программиста при конфигурации периферии. Но! Код полуился очень большой. Как только использую функции библиотеки flash память была полностью исчерпана.

Вывод на oled, измерение F1,F2, измерение V1,V2.

Использованием STM8S_StdPeriph_Lib ( IAR STM8 ).

Результат сборки Build проекта Meas_Fx_Vx

├── adc.c
├── adc.h
├── EWSTM8
├── freq.c
├── freq.h
├── i2c_master_poll.c
├── i2c_master_poll.h
├── main.c
├── printf.c
├── printf.h
├── RIDE
├── ssd1306.c
├── ssd1306.h
├── stm8s_conf.h
├── stm8s_it.c
├── stm8s_it.h
├── stm8s_type.h
├── STVD
├── ustdlib.c
├── ustdlib.h
├── util.c
└── util.h  

  5 611 bytes of readonly code memory
  1 725 bytes of readonly data memory
    371 bytes of readwrite data memory

Мне пришлось отказаться от функции sprintf для преобразования бинарных числе в строку для вывода на oled.

Пришлось поискать решение крошечной реализации преобразования в ascii строку значений измерений. Программисты, я часо слышал эту историю, переписывают функцию printf для микроконтроллеров с малой памятью flash и sram. Даже есть сайт tiny printf. Здесь можно скачать код реализации крошечной printf для своих проектов с ограниченной памятью микроконтроллера.

Tinyprintf originally from (http://www.sparetimelabs.com/tinyprintf/index.html) Copyright (C) 2004,2012 Kustaa Nyholm Licenses: LGPL 2.1 or later (see LICENSE.LGPL-2.1) or BSD-new (see LICENSE.BSD-new) (https://github.com/cjlano/tinyprintf)
Протестировал функции автора. Мне нужна была функция u32 -> string. Исправил ошибку. У меня функции попадала в бесконечный цикл. В репозитории на github этой ошибки нет.

Функция действительно получилась очень компактная! Можно реобразовывать не только в десятичную систему счисления, но и в '2','8','16' системы счисления.

Bytes  Function/label
-----  --------------
   14  Delay_My
  207  uli2a

221 bytes of CODE memory     

Использованием операций '|=' '&=' и бинарные операции в примерах U3025-STM8 ( IAR STM8 ).

Когда стал собирать проекты китайца мне это вдохновило! Практически все проекты сумел собрать для stm8s003

U3025-STM8/proj$ tree -d -L 1
.
├── 10-PWM
├── 11-ADC
├── 12-IWDG
├── 13-WWDG
├── 14-I2C
├── 15-SPI_Flash
├── 16-TFT_LCD
├── 17-SPI_SD
├── 18-SD_FATFS
├── 19-LCD_CNEN
├── 20-LCD_PICTURE
├── 22-Uart3
├── 23-UniqueID
├── 27-LCD_TOUCH
├── 2-LED
├── 3-Key_Scan
├── 4-Uart
├── 5-Beep
├── 6-Key_Exti
├── 7-TIM1
├── 8-TIM2
├── 9-TIM3
└── STM8_Demo

23 directories

Переписал проект Meas_Fx_Vx и исключил функции стандартной библиотеки. У меня всё уместилось!

MeasFxVx/USER$ tree
.
├── adc.c
├── adc.h
├── beep.c
├── beep.h
├── clk_conf.c
├── clk_conf.h
├── freq.c
├── freq.h
├── i2c_ee.c
├── i2c_ee.h
├── i2c_master_poll.c
├── i2c_master_poll.h
├── iwdg.c
├── iwdg.h
├── key_exti.c
├── key_exti.h
├── led.c
├── led.h
├── main.c
├── main_old.c
├── pwm.c
├── pwm.h
├── spi.c
├── spi.h
├── ssd1306.c
├── ssd1306.h
├── stm8s_interruput.c
├── tim2.c
├── tim2.h
├── type_def.h
├── uart.c
├── uart.h
├── uart_it.c
├── uart_it.h
├── util.c
├── util.h
├── w25x16.c
├── w25x16.h
├── wwdg.c
└── wwdg.h

  4 353 bytes of readonly code memory
  1 451 bytes of readonly data memory
    406 bytes of readwrite data memory (+ 57 absolute)

TODO в проекте MeasFxVx

  • Вернуться к драйверу oled 1306. Есть моменты "зацикливания", когда модуль дисплея не может принять команды и не отпускает линию I2C.
  • Переписать стандартиые функции TIM1 на управление битами для оптимизации кода.
  • Добавить калибровку тактовой частоты от сигналов GPS/GLONASS.
  • Тестирование на надёжность и стабильность работы проекта для измерения частоты и напряжения по двух каналам.

Комментарии

comments powered by Disqus