[Решено] Попытка использовать простую библиотеку MBI5030

Флаб
Вторник, 1 мая 2018 г., 17:02
Привет! Я пытаюсь портировать/использовать следующую библиотеку с Baite Maple Mini STM32F103C8T6.

https: // github.com/madworm/mbi5030_demo ... BI5030.CPP

Первая ошибка, которую я получаю /home/flo/Arduino/libraries/MBI5030_demo/MBI5030.cpp:22:20: fatal error: avr/io.h: No such file or directory #include

Стивестронг
Вторник, 1 мая 2018 г., 17:23
Вам не нужна эта линия, просто удалите ее: #include

Флаб
Вторник, 1 мая 2018 г., 17:34
Я использую Arduino IDE на Ubuntu 16.04

Я удалил #include <avr/io.час> от MBI5030.CPP, теперь я снова получаю эту ошибку.
/home/flo/Arduino/libraries/MBI5030_demo/MBI5030.cpp: In constructor 'MBI5030::MBI5030(uint8_t, uint8_t, uint8_t, uint8_t)': /home/flo/Arduino/libraries/MBI5030_demo/MBI5030.cpp:34:64: error: 'portModeRegister' was not declared in this scope _spi_out_DIR = portModeRegister(digitalPinToPort(_spi_out_pin));

Стивестронг
Вторник, 1 мая 2018 г., 17:53
Вы должны изменить функции прямого доступа к регисту, такие как это: volatile uint32_t *pin1_io_port, *pin2_io_port; uint16_t pin1_bitmask, pin2_bitmask; ... #define PIN1 PA1 #define PIN2 PA2 #define pin1_set (*pin1_io_port = pin1_bitmask) #define pin1_clear (*pin1_io_port = (pin1_bitmask<<16)) #define pin2_set (*pin2_io_port = pin2_bitmask) #define pin2_clear (*pin2_io_port = (pin2_bitmask<<16)) ... (in setup): pin1_io_port = portSetRegister(PIN1); pin2_io_port = portSetRegister(PIN2) pin1_bitmask = digitalPinToBitMask(PIN1); pin2_bitmask = digitalPinToBitMask(PIN2); ... (in main loop): pin1_set; pin2_clear; ...

Флаб
Вторник, 1 мая 2018 г., 17:55
Вау круто, я надеюсь, что это сработает. Куда мне это вставить? Или какой файл является адаптированием?
Тогда я могу увидеть, смогу ли я кодировать его в отношении структуры, которую вы дали.
MH, возможно, мне нужно немного подумать. Как я видел из вашего редактирования: я должен как -то отредактировать основной файл в Arduino IDE вместо MBI5030.CPP...

Флаб
Ср. 02 мая 2018 г., 7:16 утра
_spi_out_DIR = portModeRegister(digitalPinToPort(_spi_out_pin)); _spi_out_PORT = portOutputRegister(digitalPinToPort(_spi_out_pin)); _spi_out_pinmask = digitalPinToBitMask(_spi_out_pin);

Стивестронг
Ср. 02 мая 2018 г., 11:20
Забудьте об определениях AVR, просто замените настройку PIN -кода высокую и низкую определения, как я предложил.
Вам не нужны определения DIR.

Флаб
Ср. 02 мая 2018 г., 11:47
Таким образом, с pin1_set вы имели в виду PIN1 = высокий и с PIN1_CLEAR, вы имели в виду PIN1 = низкий ?
А как насчет ввода штифта тогда?

Я попытался воспроизвести пример мига с вашим кодом, но он не сработал... Вы знаете, почему? volatile uint32_t *pin1_io_port, *pin2_io_port; uint16_t pin1_bitmask, pin2_bitmask; #define PIN1 PB1 #define PIN2 PA2 #define pin1_set (*pin1_io_port = pin1_bitmask) #define pin1_clear (*pin1_io_port = (pin1_bitmask<<16)) #define pin2_set (*pin2_io_port = pin2_bitmask) #define pin2_clear (*pin2_io_port = (pin2_bitmask<<16)) void setup(void) { pin1_io_port = portSetRegister(PIN1); pin2_io_port = portSetRegister(PIN2); pin1_bitmask = digitalPinToBitMask(PIN1); pin2_bitmask = digitalPinToBitMask(PIN2); } void loop(void) { pin1_set; delay(1000); pin1_clear; delay(1000); }

Флаб
Ср 2 мая 2018 г., 21:02
Большое спасибо за вашу помощь !!!
Я мог бы заставить это работать как -нибудь сейчас. Я использовал gpio_set_mode(PIN_MAP[_spi_out_pin].gpio_device, PIN_MAP[_spi_out_pin].gpio_bit, GPIO_OUTPUT_PP);

Rogerclark
Ср. 02 мая 2018 г., 21:28
Я не уверен, почему вам нужно сделать внутренние вызовы API, специфичные для ядра Libmaole.

Можете ли вы попробовать заменить их на обычные вызовы API ARDUINO, такие как Pinmode и DigitalWrite, это было бы более портативным, а скорость не будет проблемой, так как STM32 работает как минимум в 5 раз быстрее, чем AVR

На самом деле я сомневаюсь, что скорость была проблемой для AVR, так как эта функция выглядит как конструктор

Стивестронг
Ср 2 мая 2018 г., 21:56
Вы должны заменить все эти функции gpio_set_mode(PIN_MAP[_spi_out_pin].gpio_device, PIN_MAP[_spi_out_pin].gpio_bit, GPIO_OUTPUT_PP);

Rogerclark
Ср 2 мая 2018 г., 22:49
Да

Флаб
Чт, 3 мая 2018 г., 5:51
Спасибо ! Я заменил вызовы API стандартным кодом Arduino, и он работает. Но мне интересно, как получить или установить различные поведения, установленные в GPIO.H со стандартным кодом Arduino? typedef enum gpio_pin_mode { /** Output push-pull. */ GPIO_OUTPUT_PP = GPIO_CR_CNF_OUTPUT_PP | GPIO_CR_MODE_OUTPUT_50MHZ, /** Output open-drain. */ GPIO_OUTPUT_OD = GPIO_CR_CNF_OUTPUT_OD | GPIO_CR_MODE_OUTPUT_50MHZ, /** Alternate function output push-pull. */ GPIO_AF_OUTPUT_PP = GPIO_CR_CNF_AF_OUTPUT_PP | GPIO_CR_MODE_OUTPUT_50MHZ, /** Alternate function output open drain. */ GPIO_AF_OUTPUT_OD = GPIO_CR_CNF_AF_OUTPUT_OD | GPIO_CR_MODE_OUTPUT_50MHZ, /** Analog input. */ GPIO_INPUT_ANALOG = GPIO_CR_CNF_INPUT_ANALOG | GPIO_CR_MODE_INPUT, /** Input floating. */ GPIO_INPUT_FLOATING = GPIO_CR_CNF_INPUT_FLOATING | GPIO_CR_MODE_INPUT, /** Input pull-down. */ GPIO_INPUT_PD = GPIO_CR_CNF_INPUT_PU_PD | GPIO_CR_MODE_INPUT, /** Input pull-up. */ GPIO_INPUT_PU, /* (treated a special case, for ODR twiddling) */ } gpio_pin_mode;

Стивестронг
Чт, 3 мая 2018 г., 7:32 утра
Посмотрите здесь: https: // github.com/rogerclarkmelbourne/ ... H#L43-L100

Rogerclark
Чт, 3 мая 2018 г., 21:39
Примечание.

Некоторые из этих режимов являются нашим собственным расширением API ARDUINO

Я помню, как обсуждал, как Ардуино расширил свой API, чтобы включить такие вещи (возможно, конкретно не PinMode)
Тем не менее, люди, которые управляют arduino don’Кажется, заинтересован в продвижении API вперед, несмотря на доступность оборудования, значительно расширяющуюся за последние 5 лет, E.g с большим количеством MCU, которые теперь засыпаны ядрами 3 -й части.
Особенно устройства, такие как ESP8266 и ESP32, Teensy и т. Д