eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2021-07-07 12:11 am

Код под STM32F072 для "вундервафли v2.0"

Почти закончил написание прошивки для тестирования F0x2 на новой девборде. Осталось решить проблему: возможно ли сбрасывать Tx FIFO у SPI в режиме slave, не выполняя полную переинициализацию SPI (как это предлагают в интернетах). Если невозможно, то пусть останется как есть.

Еще обнаружил, что нет-нет, да зависает прием в моем терминале. Сначала грешил на МК (мол, зависает), пока не запустил режим теста, при котором мониторится состояние АЦП и выхлоп пишется в терминал + 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.