AnimeFreak1233
Сб 31 октября 2015 г. 16:08
Я 16 -летний любитель самоубийца (но никоим образом не является новичком в программировании низкого уровня, поступающим из AVR C и ASM). Я ударил голову. Это кстати, кстати, это кленовый. Кроме того, я использую только функции низкого уровня и напрямую пишу в регистры, когда они недоступны.
Я использую Libmaple Pure. Код
Я использую Libmaple Pure. Код
void setup () {
Serial.begin(115200);
Serial.println("[hello]");
while (1) {
Serial.println(millis());
delay(1000);
}
}
Rogerclark
Сб 31 октября 2015 г., 8:30 вечера
AnimeFreak1233
Сб 31 октября 2015 г., 22:12
Прошел каждый из них, но я не могу использовать функцию AttachInterrupt (), потому что мне нужна производительность для того, что я делаю. Но функция exti_attach_interrupt (), похоже, ничего не делает, кроме как позволить прерыванию выполнить один раз, я также попытался положить его на какое -то время, ничего не случилось. Если бы проблема была настолько проста, что просмотр документации - это все, что мне нужно было сделать, я бы не был здесь...
Rogerclark
Сб 31 октября 2015 г., 22:57
Если вам нужна высокая производительность, я подозреваю, что API Arduino - не лучший подход, так как все абстрагировано и в целом не так быстро, как может быть
Я бы порекомендовал вам отказаться от использования API и IDE ARDUINO и использовать что -то вроде COOCOX или EM: блоки или затмение и программа с использованием STM32Cube и стандартной периферийной библиотеки.
На самом деле, даже SPL на основе STM32Cube HAL может быть слишком медленным для вас, так как это также немного устранено, так что вы можете программировать, используя Coocox и т. Д., И напрямую настроить векторные таблицы прерывания и т. Д.
Лучшая ссылка - это руководство по программированию серии STM32F1 RM0008 http: // www.ул.com/web/en/resource/techn ... 171190.PDF
Поскольку это дает полную информацию, как программировать вещи на низком уровне, чтобы получить самую высокую производительность.
Я бы порекомендовал вам отказаться от использования API и IDE ARDUINO и использовать что -то вроде COOCOX или EM: блоки или затмение и программа с использованием STM32Cube и стандартной периферийной библиотеки.
На самом деле, даже SPL на основе STM32Cube HAL может быть слишком медленным для вас, так как это также немного устранено, так что вы можете программировать, используя Coocox и т. Д., И напрямую настроить векторные таблицы прерывания и т. Д.
Лучшая ссылка - это руководство по программированию серии STM32F1 RM0008 http: // www.ул.com/web/en/resource/techn ... 171190.PDF
Поскольку это дает полную информацию, как программировать вещи на низком уровне, чтобы получить самую высокую производительность.
Ахулл
Солнце 01 ноября 2015 1:10
Я * думаю * я вижу, что вы здесь пытаетесь сделать... Если я прав, и вы пытаетесь моргнуть светодиод в ответ на стимул на PB8, попробуйте эту версию.
Вам нужно установить (или не считать) флаг в вашем ISR, а затем не установить (или установить) в своей цикле, в зависимости от того, что противоположна действию в ISR.
Вы могли бы написать это в гораздо более простой, более ардуинозской форме, но приведенный ниже код должен делать то, что я думаю, вы пытаетесь сделать.
Вам нужно установить (или не считать) флаг в вашем ISR, а затем не установить (или установить) в своей цикле, в зависимости от того, что противоположна действию в ISR.
Вы могли бы написать это в гораздо более простой, более ардуинозской форме, но приведенный ниже код должен делать то, что я думаю, вы пытаетесь сделать.
{
"sessionID" = 665958207013298
"iManufacturer" = 1
"bNumConfigurations" = 1
"idProduct" = 3
"bcdDevice" = 513
"Bus Power Available" = 250
"USB Address" = 3
"bMaxPacketSize0" = 64
"iProduct" = 2
"iSerialNumber" = 3
"bDeviceClass" = 0
"Built-In" = No
"locationID" = 18446744073660465152
"bDeviceSubClass" = 0
"bcdUSB" = 256
"USB Product Name" = "Maple 003"
"PortNum" = 3
"non-removable" = "no"
"IOCFPlugInTypes" = {"9dc7b780-9ec0-11d4-a54f-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
"bDeviceProtocol" = 0
"IOUserClientClass" = "IOUSBDeviceUserClientV2"
"IOPowerManagement" = {"DevicePowerState"=0,"CurrentPowerState"=3,"CapabilityFlags"=65536,"MaxPowerState"=4,"DriverPowerState"=3}
"Device Speed" = 1
"USB Vendor Name" = "LeafLabs"
"idVendor" = 7855
"IOGeneralInterest" = "IOCommand is not serializable"
"USB Serial Number" = "LLM 003"
"IOClassNameOverride" = "IOUSBDevice"
}
AnimeFreak1233
Солнце 01 ноября 2015 г. 13:07
И ISR даже не выполняется один раз...
Кстати, я опубликовал более старую версию кода, я пытался использовать алгоритм, мой не работал, и не у вас...
Кстати, я опубликовал более старую версию кода, я пытался использовать алгоритм, мой не работал, и не у вас...
Ахулл
Солнце 01 ноября 2015 г. 13:40
Привет анимефрик1233
Попробуйте эскиз ниже. Я только что проверил на своем STM32F103RCT6 с PIR, прикрепленным к PB8 (ваш входной штифт), и светодиод на PB0 (мой светодиодный штифт). Вам нужно будет сменить светодиодную булавку. Я добавил некоторую отладку в Usserial Port, но вы можете изменить это на порт USART или просто прокомментировать линии serial_debug.
(Примечание: вам нужно будет прокомментировать serial_debug Out, если вы не прикрепите к выходу серийной отладки, как и в противном случае, он имеет тенденцию замедлить эскиз.)
Попробуйте эскиз ниже. Я только что проверил на своем STM32F103RCT6 с PIR, прикрепленным к PB8 (ваш входной штифт), и светодиод на PB0 (мой светодиодный штифт). Вам нужно будет сменить светодиодную булавку. Я добавил некоторую отладку в Usserial Port, но вы можете изменить это на порт USART или просто прокомментировать линии serial_debug.
(Примечание: вам нужно будет прокомментировать serial_debug Out, если вы не прикрепите к выходу серийной отладки, как и в противном случае, он имеет тенденцию замедлить эскиз.)
for(volatile unsigned int i=0;i<512;i++);
AnimeFreak1233
Солнце 01 ноября 2015 г. 15:01
Этот материал работает нормально, но проблема в том, что мне нужно использовать низкий уровень C, а не протирную библиотеку. Мне нужно, чтобы он выплюнул столько производительности, сколько необходимо, и как таковая, протирская библиотека не является хорошим выбором по сравнению с простыми функциями и прямыми манипуляциями с рег. Кстати, я попытался отсоединить весь процесс, просыпая библиотечные источники, но ничего не сработало. Я в значительной степени вставил код из AttactIntertrupt (), но ничего не произошло
Ахулл
Солнце 01 ноября 2015 г. 15:18
Попробуйте это для версии того же эскиза Libmaple.
for(delay = 0;delay<512;delay++);
// volatile unsigned x = 1024; do { ; }while(--x);// wait a moment
AnimeFreak1233
Солнце 01 ноября 2015 г. 15:43
В вашем коде было несколько ошибок, но это наконец работает!!! Я постараюсь найти путь вокруг того, что вызвало проблему на моей стороне.
Я исправил их. Вы можете взглянуть на свой код
Я исправил их. Вы можете взглянуть на свой код
// Engages stop mode on the cpu, wakes up when the onboard button is briefly pressed
// Toggles pin 3 and pin 13 every time the button is pressed/released
// Pin 3 is used to indicate that the main loop has run. It is toggled every time loop() is called.
// Normally this would be constantly flashing on/off so fast it would appear on all the time
// In this case, the loop is only finished when the button has been pressed/released.
// PROBLEMS so far : works as expected,
// : note that because it's in stop mode, you may have to
// : reset to reprogram.
// : SerialUSB.print : NOT WORKING.
#include
#include
#include
#define BOARD_LED_PIN 33
#define BOARD_BUTTON_PIN 32
#define BUTTON_DEBOUNCE_DELAY 1
// These are possibly defined somewhere but I couldn't find them. System Control Register
#define SCB_SCR_SLEEPDEEP 4 // Controls deepsleep(1) or sleep(0)
#define SCB_SCR_SLEEPONEXIT 2 // Controls sleeponexit (not used here)
volatile bool ledState = LOW; // Used in ISR blinkState()
void togglePin(uint8 pin) {
if (pin >= BOARD_NR_GPIO_PINS) {
return;
}
gpio_toggle_bit(PIN_MAP[pin].gpio_device, PIN_MAP[pin].gpio_bit);
}
void toggleLED() {
togglePin(BOARD_LED_PIN);
}
uint8 isButtonPressed(uint8 pin=BOARD_BUTTON_PIN, uint32 pressedLevel=HIGH) {
if (digitalRead(pin) == pressedLevel) {
delay(BUTTON_DEBOUNCE_DELAY);
while (digitalRead(pin) == pressedLevel)
;
return true;
}
return false;
}
uint8 waitForButtonPress(uint32 timeout=0) {
uint32 start = millis();
uint32 time;
if (timeout == 0) {
while (!isButtonPressed())
;
return true;
}
do {
time = millis();
/* properly handle wrap-around */
if ((start > time && time + (0xffffffffU - start) > timeout) ||
time - start > timeout) {
return false;
}
} while (!isButtonPressed());
return true;
}
void setup()
{
pinMode(BOARD_LED_PIN, OUTPUT);
pinMode(3, OUTPUT);
pinMode(BOARD_BUTTON_PIN, INPUT);
// Just to show that the board has reset (wdt or possibly standby mode(not used here))
for (int i = 0; i < 20; ++i)
{
delay(200);
toggleLED();
}
togglePin(3);
// Wake up cpu on button press.
attachInterrupt(BOARD_BUTTON_PIN, blinkState, FALLING);
}
void loop()
{
//SerialUSB.println("HI!"); delay(100); // Only works on first iteration, before stop mode
// Clear PDDS and LPDS bits
PWR_BASE->CR &= PWR_CR_LPDS | PWR_CR_PDDS;
// set sleepdeep in the system control register
SCB_BASE->SCR |= SCB_SCR_SLEEPDEEP;
// Now go into stop mode, wake up on interrupt
asm(" wfi");
digitalWrite(BOARD_LED_PIN, ledState);
togglePin(3);
}
// Interrupt Service Routine (ISR)
void blinkState()
{
ledState = !ledState;
waitForButtonPress(); // Dangerous in ISR, I know, but quick demo only so blah.
}
Ахулл
Солнце 01 ноября 2015 г. 15:48
AnimeFreak1233 написал:В вашем коде было несколько ошибок, но это наконец работает!!! Я постараюсь найти путь вокруг того, что вызвало проблему на моей стороне.
Я исправил их. Вы можете взглянуть на свой код
Я исправил их. Вы можете взглянуть на свой код
Let’s use TI2FP2 as trigger 1:
• Map TI2FP2 on TI2 by writing CC2S=01 in the TIMx_CCMR1 register.
• TI2FP2 must detect a rising edge, write CC2P=0 in the TIMx_CCER register.
• Configure TI2FP2 as trigger for the slave mode controller (TRGI) by writing TS=110 in
the TIMx_SMCR register.
• TI2FP2 is used to start the counter by writing SMS to ‘110 in the TIMx_SMCR register
(trigger mode).
The OPM waveform is defined by writing the compare registers (taking into account the
clock frequency and the counter prescaler).
• The tDELAY is defined by the value written in the TIMx_CCR1 register.
• The tPULSE is defined by the difference between the auto-reload value and the compare
value (TIMx_ARR - TIMx_CCR + 1).
• Let us say user wants to build a waveform with a transition from ‘0 to ‘1 when a
compare match occurs and a transition from ‘1 to ‘0 when the counter reaches the
auto-reload value. To do this enable PWM mode 2 by writing OC1M=111 in the
TIMx_CCMR1 register. The user can optionally enable the preload registers by writing
OC1PE=1 in the TIMx_CCMR1 register and ARPE in the TIMx_CR1 register. In this
case write the compare value in the TIMx_CCR1 register, the auto-reload value in the
TIMx_ARR register, generate an update by setting the UG bit and wait for external
trigger event on TI2. CC1P is written to ‘0 in this example.
In our example, the DIR and CMS bits in the TIMx_CR1 register should be low.
User only wants one pulse (Single mode), so write '1 in the OPM bit in the TIMx_CR1
register to stop the counter at the next update event (when the counter rolls over from the
auto-reload value back to 0). When OPM bit in the TIMx_CR1 register is set to '0', so the
Repetitive Mode is selected.
Ахулл
Солнце 01 ноября 2015 г. 15:52
Кстати, я собираюсь взять собаку на прогулку, поэтому я вернусь через пару часов, на случай, если вы думаете, что я потерял интерес.
Я с нетерпением жду вашей версии Uberfast, когда вернусь.
Еще одна вещь.. Я только что заметил этот маленький драгоценный камень в NVIC.час Nvic_usbwakeup = 42 -USB Sakuup от Supply через линию Exti.
Я думаю, мне придется играть с этим.
Я с нетерпением жду вашей версии Uberfast, когда вернусь.
Еще одна вещь.. Я только что заметил этот маленький драгоценный камень в NVIC.час Nvic_usbwakeup = 42 -USB Sakuup от Supply через линию Exti.
Я думаю, мне придется играть с этим.
Рик Кимбалл
Солнце 01 ноября 2015 г., 16:12
Если ваша цель состоит в том, чтобы оставаться рядом с металлом с различными чипсами коры Arm, вы можете посмотреть на LiboPencm3 https: // github.com/libopencm3/libopencm3 . Он активно развивается (в отличие от Libmaple) и уже работает на куче разных чипов и досок. Это началось в чипсах STM32F1, поэтому они довольно хорошо поддерживаются.
Программное обеспечение Blackmagic Desrobe (BMP) построено на вершине LiboPencm3.
-рик
Программное обеспечение Blackmagic Desrobe (BMP) построено на вершине LiboPencm3.
-рик
Стевех
Солнце 01 ноября 2015 г. 11:03
Комплексная библиотека ввода/вывода Cubemx + STM имеет преимущество в том, что упрощение изменения MCU на большинство других STM F32XXX.
Имеет кривую обучения.
Не Arduino. Но библиотеки St Hal имеют хорошо задокументированные драйверы для всех периферийных устройств на чипе. И есть версии API для опроса, прерывания и операции DMA.
ST обновляет Hals и Cubemx несколько раз в год, и когда выходят новые MCU.
Если вы очень случайный человек «сделать» и можете терпеть ограниченный выбор ввода -вывода в мире Ардуино, особенно. Для STM32S, тогда выше не для вас.
Но, если вы хотите избежать переосмысления драйверов ввода -вывода, или вы хотите легче перемещать код между, скажем, STM32F1XX и STM32F4XX, то IMO Вышеуказанные являются лучшими инструментами для авокационного или профессионального использования.
Вывод проекта компилятора для GCC с Eclipse или IAR/Keil, которые имеют бесплатные версии для кода < 32 КБ.
И они свободны.
Имеет кривую обучения.
Не Arduino. Но библиотеки St Hal имеют хорошо задокументированные драйверы для всех периферийных устройств на чипе. И есть версии API для опроса, прерывания и операции DMA.
ST обновляет Hals и Cubemx несколько раз в год, и когда выходят новые MCU.
Если вы очень случайный человек «сделать» и можете терпеть ограниченный выбор ввода -вывода в мире Ардуино, особенно. Для STM32S, тогда выше не для вас.
Но, если вы хотите избежать переосмысления драйверов ввода -вывода, или вы хотите легче перемещать код между, скажем, STM32F1XX и STM32F4XX, то IMO Вышеуказанные являются лучшими инструментами для авокационного или профессионального использования.
Вывод проекта компилятора для GCC с Eclipse или IAR/Keil, которые имеют бесплатные версии для кода < 32 КБ.
И они свободны.
Rogerclark
Солнце 01 ноября 2015 г., 23:36
Стив
Я уже опубликовал, в основном то же самое. Но OP, кажется, хочет использовать ARDUINO API и все же имеет быстрые ответы.
Лично я думаю, что они могут решить свои проблемы с скоростью в одном месте, но рано или поздно они найдут другое место, где API Arduino слишком медленно.
Я уже опубликовал, в основном то же самое. Но OP, кажется, хочет использовать ARDUINO API и все же имеет быстрые ответы.
Лично я думаю, что они могут решить свои проблемы с скоростью в одном месте, но рано или поздно они найдут другое место, где API Arduino слишком медленно.
Ахулл
Пн, 02 ноября 2015 г. 12:24
Rogerclark написал:Стив
Я уже опубликовал, в основном то же самое. Но OP, кажется, хочет использовать ARDUINO API и все же имеет быстрые ответы.
Лично я думаю, что они могут решить свои проблемы с скоростью в одном месте, но рано или поздно они найдут другое место, где API Arduino слишком медленно.
Я уже опубликовал, в основном то же самое. Но OP, кажется, хочет использовать ARDUINO API и все же имеет быстрые ответы.
Лично я думаю, что они могут решить свои проблемы с скоростью в одном месте, но рано или поздно они найдут другое место, где API Arduino слишком медленно.
Mrburnette
Пн, 02 ноября 2015 г. 1:49
Ахулл написал:Rogerclark написал:
<...>
Если мне нужно контролировать ракетную телеметрию или протоколы Bit Bang High Speed, я могу изо всех сил пытаться сделать это с нативным кодом Arduino. Сказав, что, поскольку больше контроллеров, которые теперь нацелены на метод Дионо, дополнительный выбор оборудования Arduino означает, что если вы хотите, чтобы он быстрее, вам может быть лучше просто переносить в более быстрый процессор.
Если мне нужно контролировать ракетную телеметрию или протоколы Bit Bang High Speed, я могу изо всех сил пытаться сделать это с нативным кодом Arduino. Сказав, что, поскольку больше контроллеров, которые теперь нацелены на метод Дионо, дополнительный выбор оборудования Arduino означает, что если вы хотите, чтобы он быстрее, вам может быть лучше просто переносить в более быстрый процессор.