ВХОД & ВЫХОД

Nulldragon
Ср 25 ноября 2015 г. 5:10 утра
Привет,

Я прочитал, и наткнулся на что -то интересное, что я надеялся, что кто -то может подтвердить или опровергнуть.

В случае Maple Mini вы не можете использовать DigitalRead (x) на выводе, который помечен как выход?
dfu-util -a 0 -s 0x08000000 -D f4_bootloader_test.ino.generic_f407v.bin

Rogerclark
Ср 25 ноября 2015 г., 6:43
Вы можете прочитать вывод, который настроен на вывод, я делаю это все время, чтобы сделать простые мигальные наброски

DigitWrite (PIN,!DigitalRead (PIN));

переворачивать состояние булавки

Nulldragon
Ср 25 ноября 2015 г., 7:02
Спасибо, что прояснили это.

Я только что читал этот Пост, который вызвал путаницу.

Rogerclark
Ср 25 ноября 2015 г. 8:26 утра
Я не совсем уверен, почему он работает на STM32, но, насколько я знаю, ядро ​​не делает никаких приемов, таких как кэш, последнее значение, записанное в реестр вывода, поэтому я предполагаю, что это так, как работает оборудование.

Хотя STM32 является процессором ARM, подобным Due ​​и Zero, сходство ограничивается основным ядром обработки, но способ GPIO (и SPI и т. Д.) Работает на STM32, полностью отличается от (SAM) или от Due (SAM) или от Ноль (SAMD) или подростка и т. Д.

Мадиас
Ср 25 ноября 2015 г. 9:35
Rogerclark написал:Вы можете прочитать вывод, который настроен на вывод, я делаю это все время, чтобы сделать простые мигальные наброски

DigitWrite (PIN,!DigitalRead (PIN));

переворачивать состояние булавки

Rogerclark
Ср 25 ноября 2015 г. 9:53 утра
Честно. Оно работает. Я использую это все время

Ахулл
Ср 25 ноября 2015 г., 10:07
Я также использовал этот метод в прошлом. Таким образом, может быть немного медленнее переключать штифт, чем использовать переменную, поскольку я подозреваю, что накладные расходы DigitalRead будут больше, чем переключать и сравнить лом.

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

Rogerclark
Ср 25 ноября 2015 г. 10:10
Использование VAR будет быстрее, так как код для чтения бита - это несколько вызовов глубоко.

Но код, возможно, будет немного меньше.

Я делаю это только для сохранения печати

Мадиас
Ср 25 ноября 2015 г. 10:16 утра
[QUOTE = "AHULL"] (но только лопатка, так что, вероятно, не огромная экономия).цитировать]
Как я знаю, Bool также компилируется, по крайней мере, как байт (ОК, сохранение нескольких переменных для RAM было бы скорее темой на Atiny, а не на наших устройствах 20K+ ;) )

Mrburnette
Пт 27 ноября 2015 г. 12:22
Мадиас написал:Ахулл написал: (Но только лопатка, так что, вероятно, не огромная экономия).цитировать]
Как я знаю, Bool также компилируется, по крайней мере, как байт (ОК, сохранение нескольких переменных для RAM было бы скорее темой на Atiny, а не на наших устройствах 20K+ ;) )

Rogerclark
Пт 27 ноября 2015 г. 12:33
Mrburnette написал:[
Я делаю это также на STM32, но нужно помнить, что это не портативно

Стевех
Пт 27 ноября 2015 г. 5:16 утра
Rogerclark написал:Вы можете прочитать вывод, который настроен на вывод, я делаю это все время, чтобы сделать простые мигальные наброски

DigitWrite (PIN,!DigitalRead (PIN));

переворачивать состояние булавки

Ахулл
Пт 27 ноября 2015 г. 10:59
Стевех написал:Rogerclark написал:Вы можете прочитать вывод, который настроен на вывод, я делаю это все время, чтобы сделать простые мигальные наброски

DigitWrite (PIN,!DigitalRead (PIN));

переворачивать состояние булавки

JCW
Пт 27 ноября 2015 г. 14:54
Насколько я знаю, работает для всех AVR и ARM µCs (на AVR, PIN читает и пишет, используют разные регистры, но это скрыто за этими вызовами).
Единственный трюк Avr-ish письмо в входной реестр. Это определено (и специально разрешено) как способ переключить штифт.
Не уверен насчет всех чипов руки, но, по крайней мере, LPC от NXP также имеет отдельный регистр, чтобы переключить PIN -код.

Действительно, различия повсюду... Но это то, для чего предназначены цифровые чтения/писать: скрыть самые распространенные.

Rogerclark
Пт 27 ноября 2015 г. 20:08
Я собирался написать тот же комментарий, что и Энди

По своей природе встроенное программирование очень зависит от оборудования.

Можно также утверждать, что то, что делают AVR Arduinos, является API детекатором для Arduino IDE в целом.
Поэтому, если оборудование STM32 не делало этого изначально, нам, возможно, нам пришлось хранить предыдущие состояния штифтов в структуре данных PINMAP Register; На самом деле я смотрел на то, чтобы сделать что -то подобное для прочтения Pinmode, пока не понял, что смогу прочитать режим вывода из аппаратного обеспечения (я не думаю, что это возможно во всех MCU)

Rogerclark
Сб 28 ноября 2015 г. 8:46 утра
Подобно тому, как интересно, я попробовал это на NRF51822, и, похоже, трюк, кажется, прекрасно работает на этом MCU, по крайней мере, используя Arduino IDE
void setup() { // put your setup code here, to run once: pinMode(PB0,OUTPUT); } int c=0; #include #define SCB_AIRCR_VECTKEYSTAT (0x5FA << 16) #define SCB_AIRCR_VECTKEY (0x5FA << 16) #define SCB_AIRCR_ENDIANNESS (1U << 15) #define SCB_AIRCR_PRIGROUP (0x3 << 8) #define SCB_AIRCR_SYSRESETREQ (1U << 2) #define SCB_AIRCR_VECTCLRACTIVE (1U << 1) #define SCB_AIRCR_VECTRESET (1U << 0) void nvic_sys_reset() { uint32 prigroup = SCB_BASE->AIRCR & SCB_AIRCR_PRIGROUP; SCB_BASE->AIRCR = SCB_AIRCR_VECTKEY | SCB_AIRCR_SYSRESETREQ | prigroup; asm volatile("dsb"); while (1) ; } #define RESET_DELAY 100000 static void wait_reset(void) { delay_us(RESET_DELAY); nvic_sys_reset(); } #define STACK_TOP 0x20000800 #define EXC_RETURN 0xFFFFFFF9 #define DEFAULT_CPSR 0x61000000 void reset_to_bootloader() { //Reset the USB interface on generic boards - developed by Victor PV pinMode(PA12,OUTPUT); digitalWrite(PA12,LOW); for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin pinMode(PA12,INPUT_FLOATING); uintptr_t target = (uintptr_t)wait_reset | 0x1; asm volatile("mov r0, %[stack_top] \n\t" // Reset stack "mov sp, r0 \n\t" "mov r0, #1 \n\t" "mov r1, %[target_addr] \n\t" "mov r2, %[cpsr] \n\t" "push {r2} \n\t" // Fake xPSR "push {r1} \n\t" // PC target addr "push {r0} \n\t" // Fake LR "push {r0} \n\t" // Fake R12 "push {r0} \n\t" // Fake R3 "push {r0} \n\t" // Fake R2 "push {r0} \n\t" // Fake R1 "push {r0} \n\t" // Fake R0 "mov lr, %[exc_return] \n\t" "bx lr" : : [stack_top] "r" (STACK_TOP), [target_addr] "r" (target), [exc_return] "r" (EXC_RETURN), [cpsr] "r" (DEFAULT_CPSR) : "r0", "r1", "r2"); } #define DELAY 250 void loop() { // put your main code here, to run repeatedly: for(int i=0;i<10;i++) { digitalWrite(PB0,HIGH); delay(DELAY); digitalWrite(PB0,LOW); delay(DELAY); } reset_to_bootloader(); }