Код под STM32F072 для "вундервафли v2.0"
Почти закончил написание прошивки для тестирования F0x2 на новой девборде. Осталось решить проблему: возможно ли сбрасывать Tx FIFO у SPI в режиме slave, не выполняя полную переинициализацию SPI (как это предлагают в интернетах). Если невозможно, то пусть останется как есть.
Еще обнаружил, что нет-нет, да зависает прием в моем терминале. Сначала грешил на МК (мол, зависает), пока не запустил режим теста, при котором мониторится состояние АЦП и выхлоп пишется в терминал + 4 светодиода исполняют роль "линейки" в зависимости от положения ручки переменного резистора. И оказалось, что светодиоды исправно меняют яркость, а вот в терминале пустота. Выключил терминал, запустил заново — вуаля! Работает!.. Надо будет искать косяк (а еще я хотел расширить функционал этого терминала до частичного функционала netcat, т.к. netcat не разделяет вход/выход и не позволяет перемещаться по истории команд, неудобно работать при отладке моих сетевых велосипедов).
Вкратце, что умеет данная прошивка.
Основным коммуникационным интерфейсом является USB (эмуляция PL2303). Команды символьные. Если вводить много символов, первый из которых — не команда, строка просто возвращается обратно. Если же ввести один символ, не являющийся командой (например, '?'), появится подсказка:
+/- позволяет изменять значение заполнения (0..256) ШИМ на канале 1 таймера 1 (на нем висит красный светодиод + есть пин для подключения стандартным ардуинопроводом). Аналогично ведет себя +/- с префиксом 1..4, но теперь уже изменяет заполнение N-го канала ШИМ таймера 3 (на них висят разноцветные светодиоды + пины).
'A' выводит значения на АЦП. Нулевой канал подключен к движку переменного резистора, первый — туда же через делитель 1:2, пятый — к выходу ЦАП (генерирующего пилу). Например (вне скобок - ADU, в скобках — в сотых долях Вольта):
'd' позволяет изменять значение стартовой величины "пилы", генерируемой ЦАПом, что приводит к генерированию интересных М-подобных фигур.
'g' отображает значения регистров CCR каналов ШИМ.
'i' запускает настройку I2C с заданной скоростью в зависимости от параметра (0 - 5.8кГц, 1 - 10кГц, 2 - 100кГц).
'Ia' задает адрес устройства I2C (семь бит). Без задания адреса писать ничего не будет. Например:
'Iw' позволяет что-нибудь в I2C записать (от 0 до 32 байт).
'Ir' позволяет прочитать из указанного регистра N байт. Например:
'Is' позволяет просканировать шину. Среди выхлопа NAK'ов появится адрес, на который откликается подключенное устройство. Сейчас подключен BMP180, так что в колонке NAK'ов появляется строчка 0x77 (119) - found device.
'L' просто посылает длинную тестовую строчку на USB.
'm' включает/выключает мониторинг АЦП (поворот движка переменного резистора приводит к отображению значения на входах АЦП и изменению яркости свечения четырех цветных светодиодов, как на диодной линейке).
'Pw' отправляет записанные далее числа с SPI1 (мастер).
'pw' подготавливает записанные далее числа к отправке с SPI2 (слейв).
'Pr' читает (если что-то там есть) данные, поступившие на SPI1.
'pr' читает данные с SPI2.
Если соединить SPI1 и SPI2 проводками, можно обмениваться данными. Заодно отображается немного отладочной информации. Например:
'R' — программный перезапуск.
'S' — отправить короткую тестовую строку на USB.
's' — включить SPI и выключить USART'ы.
'Ux' — отправить на USART с индексом x (0..2) строку данных. При получении данных с USART'а они отображаются автоматически. USART2 и USART3 перекрестно соединены (наружу, соответственно, только два пина). Например:
'u' — инициализация USART'ов (соответственно, SPI отключаются).
'T' — показометр температуры МК (например, 375 — 37.5℃).
'V' — напряжение Vdd (например, 330 — 3.30В).
'W' — тестирование сторожевого пса.
На F103, пожалуй, пока не буду почти (там нет ЦАП, например, поэтому "почти") весь этот код переносить. Сначала надо поиграться с F303 и разобраться с его USB и FPU.
Еще обнаружил, что нет-нет, да зависает прием в моем терминале. Сначала грешил на МК (мол, зависает), пока не запустил режим теста, при котором мониторится состояние АЦП и выхлоп пишется в терминал + 4 светодиода исполняют роль "линейки" в зависимости от положения ручки переменного резистора. И оказалось, что светодиоды исправно меняют яркость, а вот в терминале пустота. Выключил терминал, запустил заново — вуаля! Работает!.. Надо будет искать косяк (а еще я хотел расширить функционал этого терминала до частичного функционала netcat, т.к. netcat не разделяет вход/выход и не позволяет перемещаться по истории команд, неудобно работать при отладке моих сетевых велосипедов).
Вкратце, что умеет данная прошивка.
Основным коммуникационным интерфейсом является USB (эмуляция PL2303). Команды символьные. Если вводить много символов, первый из которых — не команда, строка просто возвращается обратно. Если же ввести один символ, не являющийся командой (например, '?'), появится подсказка:
+/-[num] - increase/decrease TIM1ch1 PWM by 1 or `num` 1..4'+'/'-'[num] - increase/decrease TIM3chN PWM by 1 or `num` A - get ADC values dx - change DAC lowcal to x g - get PWM values i0..3 - setup I2C with lowest..highest speed (5.8, 10 and 100kHz) Ia addr - set I2C address Iw bytes - send bytes (hex/dec/oct/bin) to I2C Ir reg n - read n bytes from I2C reg Is - scan I2C bus L - send long string over USB m - monitor ADC on/off Pw bytes - send bytes over SPI1 pw bytes - send bytes over SPI2 Pr - get data from SPI1 pr - get data from SPI2 R - software reset S - send short string over USB s - setup SPI (and turn off USARTs) Ux str - send string to USARTx (1..3) u - setup USARTs (and turn off SPI) T - MCU temperature V - Vdd W - test watchdog
+/- позволяет изменять значение заполнения (0..256) ШИМ на канале 1 таймера 1 (на нем висит красный светодиод + есть пин для подключения стандартным ардуинопроводом). Аналогично ведет себя +/- с префиксом 1..4, но теперь уже изменяет заполнение N-го канала ШИМ таймера 3 (на них висят разноцветные светодиоды + пины).
'A' выводит значения на АЦП. Нулевой канал подключен к движку переменного резистора, первый — туда же через делитель 1:2, пятый — к выходу ЦАП (генерирующего пилу). Например (вне скобок - ADU, в скобках — в сотых долях Вольта):
AIN0: 1722 (138/100 V) AIN1: 858 (69/100 V) AIN5: 2527 (203/100 V)
'd' позволяет изменять значение стартовой величины "пилы", генерируемой ЦАПом, что приводит к генерированию интересных М-подобных фигур.
'g' отображает значения регистров CCR каналов ШИМ.
'i' запускает настройку I2C с заданной скоростью в зависимости от параметра (0 - 5.8кГц, 1 - 10кГц, 2 - 100кГц).
'Ia' задает адрес устройства I2C (семь бит). Без задания адреса писать ничего не будет. Например:
Ia 0x77 I2Caddr=0x77 OK
'Iw' позволяет что-нибудь в I2C записать (от 0 до 32 байт).
'Ir' позволяет прочитать из указанного регистра N байт. Например:
Ir 0x80 32 Register 0x80: a5 94 41 09 da 27 27 24 b4 96 1e be fb ae c7 0e 82 26 63 1c 4d 0a 19 73 00 28 80 00 d1 f6 0a 21
'Is' позволяет просканировать шину. Среди выхлопа NAK'ов появится адрес, на который откликается подключенное устройство. Сейчас подключен BMP180, так что в колонке NAK'ов появляется строчка 0x77 (119) - found device.
'L' просто посылает длинную тестовую строчку на USB.
'm' включает/выключает мониторинг АЦП (поворот движка переменного резистора приводит к отображению значения на входах АЦП и изменению яркости свечения четырех цветных светодиодов, как на диодной линейке).
'Pw' отправляет записанные далее числа с SPI1 (мастер).
'pw' подготавливает записанные далее числа к отправке с SPI2 (слейв).
'Pr' читает (если что-то там есть) данные, поступившие на SPI1.
'pr' читает данные с SPI2.
Если соединить SPI1 и SPI2 проводками, можно обмениваться данными. Заодно отображается немного отладочной информации. Например:
pw 4 5 6 add byte: 0x04 add byte: 0x05 add byte: 0x06 Send 3 bytes SPI->SR=0x1002 done Pw 0 9 8 7 6 add byte: 0x00 add byte: 0x09 add byte: 0x08 add byte: 0x07 add byte: 0x06 Send 5 bytes SPI->SR=0x02 doneSPI1 tx done SPI2 tx done pr SPI data: 00 09 08 07 06 Pr SPI data: 04 05 06 06 06
'R' — программный перезапуск.
'S' — отправить короткую тестовую строку на USB.
's' — включить SPI и выключить USART'ы.
'Ux' — отправить на USART с индексом x (0..2) строку данных. При получении данных с USART'а они отображаются автоматически. USART2 и USART3 перекрестно соединены (наружу, соответственно, только два пина). Например:
U2 hello OK Got string over USART3: hello U3 go to sleep OK Got string over USART2: go to sleep
'u' — инициализация USART'ов (соответственно, SPI отключаются).
'T' — показометр температуры МК (например, 375 — 37.5℃).
'V' — напряжение Vdd (например, 330 — 3.30В).
'W' — тестирование сторожевого пса.
На F103, пожалуй, пока не буду почти (там нет ЦАП, например, поэтому "почти") весь этот код переносить. Сначала надо поиграться с F303 и разобраться с его USB и FPU.