STM32: "HD44720 LCD controller" C driver топик-ссылка

Symbol LCD driver port for STM32F10x microcontrollers (universal driver, with usage examples)...

STM32: "AN2594 EEPROM emulation" C library топик-ссылка

EEPROM emulation Drivers for STM32F10x microcontroller: "16bit virtual variables" emulator; "2Kb BLOB data" emulator; Low-level Flash access driver; Usage examples...

Блокнот: размещение файлов в памяти.

Если проект выдаёт что-либо наружу сложнее нескольких светодиодов, то надо это как-то хранить. И для этого придумали понятие файл: это именованная область данных на носителе информации. Самый простой способ — разместить в памяти. Но даже тут возможны варианты.

Читать дальше

Инициализация периферии с помощью именованных аргументов

В статье речь пойдет о реализации способа работы c периферией микроконтроллера с помощью именованных аргументов функций Си. Способ разобран на примере реализации функции конфигурации таймера TIM4 семейства STM8L.

Вообще, существует 2 типа передачи параметров внутрь функции или программного модуля: позиционный или именной. Так например, обычные функции в Си используют позиционную передачу, т.е. мы должны знать что и в каком порядке передавать функции. Использование именованных аргументов же гарантирует, что мы присвоим нужные значения куда положено, да и освободим себя от необходимости помнить какой параметр за каким следует. Ну вообщем, на дальнейшем примере это станет понятно.


Читать дальше

Очередной диспетчер. AVR. Си

Edit. Ну прямо азарт у меня появился. Очередная версия диспетчера. Возможности:
однократное выполнение,
отложенное однократное выполнение.

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

Сразу же попробовал перенести на диспетчер свой один проект для проверки.

Примечание, у меня диспетчер работает только в основном цикле. Установка, удаление задач тоже в основном цикле. Обработчики прерываний должны быть максимально быстрыми. Нужно добавить\удалить задачу, ставьте флаги, в основном цикле по флагам делайте, что нужно.


Читать дальше

Об адресах и указателях в Си

Сегодня на хабре появилась статья о работе с регистрами внешних устройств на языке Си. Такая статья наверняка полезна начинающим Си-программистам, а особенно хороша для людей, переползающих с ассемблера.

Хотелось бы добавить пять копеек. Возьмем последний пример кода из статьи:


#define IO_DATA_ADRESS  0x40000004
typedef struct  {
   uint32_t data;
   uint32_t status;
} IO_DEVICE;
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);
while (pio_device->status==0) {};
pio_device->data=3;


Не придираясь к стилистике (ну раз уж uint32_t, то почему не IO_DEVICE_t? И для чего верхний регистр, если это не константа?) обратим внимание на адрес и его применение:

#define IO_DATA_ADRESS  0x40000004
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);

Автор намеренно поместил адрес в скобки при приведении — это хороший тон и помогает избежать ошибок при работе с адресами и адресной арифметикой. Но так почему бы не поместить все дефайны сразу в скобки, чтобы избежать лишних проблем? Мне думается, что хорошо иметь привычку писать так:

#define IO_DATA_ADRESS  (0x40000004)
IO_DEVICE * const pio_device = (IO_DEVICE *) (IO_DATA_ADRESS);

Пара «лишних» скобок поможет избежать трудноуловимых проблем.

Однако в этой части кода присутствует и самая основная ошибка программистов встраиваемых систем. Компилятор взглянет на строчку:
while (pio_device->status==0) {};

И произведет оптимизацию либо в while(1), либо в while(0). Так что обязательно указать volatile ко всей структуре регистров переферии:

typedef volatile struct  {
   uint32_t data;
   uint32_t status;
} IO_DEVICE;

Поменьше математики процессору, или оптимизация расчётов.

Досталась горстка дохлых ноутбучных батарей, тех самых, что на литиевых габарита 18650 собраны. По этому случаю делаю тут измеритель фактической ёмкости акумуляторов, чтобы хоть как то отбраковать их. Хочется видеть цифры по итогу в удобоваримом формате. А поскольку делаю на ATTiny26 (Не пинать! Ну, завалялся у меня.), то тащить вычисления с точкой накладно. Сел, помозговал — решаемо. Материал под катом может кому-то показаться очевидной истиной, может оказаться кому-то не востребованным, но надеюсь — большинство хоть что-нибудь подчерпнут для себя. Для нетерпеливых итог:
(1)(1)
Для тех, кто не боится формул — ниже.

Читать дальше

Управление GSM модулем с AVR (часть 2)

AVR
В предыдущей части мы отправляли команды на модуль.



Теперь о получении команд с модуля.


Читать дальше
  • +2
  • 23 сентября 2013, 17:00
  • ilus
  • 4

Управление GSM модулем с AVR (часть 1)

AVR
Идея проекта: спроектировать устройство на базе микроконтроллера AVR для управления готовым GSM модулем (я выбрал модуль TC35 от SIEMENS, но можно использовать любой другой, если используется связь через последовательный порт RS232). Устройство должно быть компактным, минимально простым и надёжным.

Отправка заранее записанного в память сообщения на указанный номер должна выполняться после нажатия кнопки. Всего нужно было 6 кнопок для отправки на 6 различных номеров. Для индикации процессов были выбраны 3 светодиода (Ready, Send, Error), но в последствии был добавлен алфавитно цифровой LCD 16x2 (скорее, для отладки устройства, чем для обычного использования).

Проектировалось всё дело на плате Pinboard II (Rev 2) со стандартным процессорным модулем на ATmega16. На готовом устройстве схема была немного другой (и микроконтроллер использовался ATmega8). Программа писалась в AVR Studio 4.19. В проекте были использованы различные заголовочные файлы (#include) для переключения между Pinboard и готовым устройством.

Общая схема системы:



Читать дальше
  • +6
  • 23 сентября 2013, 15:10
  • ilus
  • 1

'Тайны ПОРТИ'+(is_shit(CODE) ? 'М':'Н')+'ГА'

Заинтересовала статья про портирование простого стека TCP/IP для AVR на STM32, хотел написать там, но как-то постепенно получилось очень много для простого вопроса, и скорее всего — возникнут еще новые вопросы.

Тема портирования, правильного портирования и написания портируемых программ для MCU интересна многим, например я, — не знаю как это ПРАВИЛЬНО делать. Поэтому буду периодически «разжигать» здесь вопросами по Си: что и зачем добавлено, и как правильнее. Исходники стека берем из этой статьи.


Читать дальше