[Решено] Запись для регистрации на STM32 (Casting Int Value)

Flyboy74
Пт 15 июня 2018 г. 5:06 утра
Я хочу научиться C, чтобы иметь возможность управлять вещами низкого уровня, которые нельзя управлять в Langues на более высоком уровне. Итак, я учусь писать C (Ardunio C ATM). Моя первая задача - это простая задача - я просто хочу включить/выключить штифт GPIO с помощью регистров.

Из моего Googling я, хотя этот код выполнит работу, но он получил ошибку компиляции
Неверное преобразование из 'int' to 'uint32* {aka long unsigned int*}' [-fpermissive] volatile uint8_t toggle = 1; volatile uint8_t event = false; uint8_t bIRQIgnore = true; const uint8_t irq_pins[] = IRQ_PINS; const ExtIntTriggerMode irq_mode[] = IRQ_MODE; const uint16_t irq_ids[] = IRQ_IDS; const WiringPinMode irq_pull[] = IRQ_PULL; uint16_t irq_event = 0; // each bit one irq, max 16 uint16_t irq_state = 0; // each bit one irq, max 16 uint16_t irq_stateA = 0; // each bit one irq, max 16 uint16_t irq_stateB = 0; // each bit one irq, max 16 uint16_t irq_stateC = 0; // each bit one irq, max 16 // minimal activity in irqhandler void irqhandler(void) { if (bIRQIgnore || event) return; irq_stateA = GPIOA->regs->IDR; irq_stateB = GPIOB->regs->IDR; irq_stateC = GPIOC->regs->IDR; event = true; } // enable IRQ for specified pins void setupIRQ() { for (int i = 0; i < arrlen(irq_pins); i++) { pinMode(irq_pins[i], irq_pull[i]); // give time to settle, before that initial state was false. delay(10); // read current pin states irq_stateA = GPIOA->regs->IDR; irq_stateB = GPIOB->regs->IDR; irq_stateC = GPIOC->regs->IDR; // set "old" IRQ states for (uint8_t i = 0; i < arrlen(irq_pins); i++) { if (getIRQPinState(irq_pins[i])) { sbi(irq_state, i); } else { cbi(irq_state, i); } } attachInterrupt(irq_pins[i], irqhandler, irq_mode[i]); } bIRQIgnore = false; } void checkIRQ() { if (event) { // check all PINs to see which changed/triggered for (uint8_t i = 0; i < arrlen(irq_pins); i++) { uint8_t pnew = getIRQPinState(irq_pins[i]); uint8_t pold = gbi(irq_state, i); if (pnew != pold) { // set new value if (irq_mode[i] == CHANGE) { if (pnew) sbi(irq_state, i); else cbi(irq_state, i); } // set to high, does not check for falling edge if (irq_mode[i] == RISING) { cbi(irq_state, i); } // set to low, does not check for rising edge if (irq_mode[i] == FALLING) { sbi(irq_state, i); } Serial.println(pnew ? "CLOSED" : "OPENED"); } } event = false; } } // helper to get single pin status uint8_t getIRQPinState(uint8_t irq) { if (irq < 16) { return gbi(irq_stateA, irq); } if (irq < 32) { return gbi(irq_stateB, irq - 16); } return gbi(irq_stateC, irq - 32); }

Пито
Пт 15 июня 2018 г., 6:32
ViewTopic.PHP?F = 18&t = 1220

Flyboy74
Пт 15 июня 2018 г., 7:04
@ Pito Спасибо.

Я получил этот код для работы, как и ожидалось, но это поднимает для меня еще один вопрос. это GPIOA->регс->CRL стандартный сцепление или это что -то добавленное в порт STM32 в Ардунио. Для меня читая таблица данных на чипе, он дает физический адрес в памяти.
exti_attach_interrupt(/*(afio_exti_num)*/ EXTI4, gpio_exti_port(GPIOB), inputCheck, EXTI_FALLING);

Пито
Пт 15 июня 2018 г., 7:24
Это происходит из определений в официальном ядре STM32Duino Core

https: // github.com/rogerclarkmelbourne/arduino_stm32

GPIO.час:

https: // github.com/rogerclarkmelbourne/ ... IES/GPIO.час

Flyboy74
Пт 15 июня 2018 г. 8:07
@Pito еще раз спасибо за ссылки. Я сейчас читаю их внимательно.

Я только что заметил это: регистр BRR - это 16 -битный регистр, но он объявлен как единица32, создавая неверный размер указателя, а также неправильный адрес для следующего указателя LCKR
attachInterrupt(, , );

Эдогальдо
Пт 15 июня 2018 г., 9:54
@flyboy74
BRR на самом деле не 16 бит: это 32 бита, но используется только низкая часть (нижняя 16 бит), высокая часть «зарезервирована».
Вы можете увидеть это в RM0008, где вы также можете увидеть, что BRR начинается с смещения 0x14, а LCKR начинается с смещения 0x18 (32 бита после)..

РЕДАКТИРОВАТЬ: Это также то же самое для IDR и ODR.

Zoomx
Пт 15 июня 2018 г. 10:27 утра
Маленькая коррекция
[Flyboy74 - Пт 15 июня 2018 г. 7:04] - attachInterrupt(, , );

Flyboy74
Пт 15 июня 2018 г. 10:41
BRR на самом деле не 16 бит: это 32 бита, но используется только низкая часть (нижняя 16 бит), высокая часть «зарезервирована». Аааа да. Я только что прочитал бит на вершине регистров GPIO, где он написал 16 -битный.

Хорошо, я смотрел на исходный код, который был связан выше, пытаясь обойти все это.

этот код void inputCheck() { uint16_t newdata = GPIOB->regs->IDR & INPUT_MASK; if (newdata != incomingData) { incomingData = newdata; newIncomingData = true; } }

fpistm
Пт 15 июня 2018 г. 10:56 утра
Адрес GPIO определяется как структура для облегчения доступа:
https: // github.com/rogerclarkmelbourne/ ... GPIO.H#L56

https: // github.com/rogerclarkmelbourne/ ... GPIO.H#L51

Пито
Пт 15 июня 2018 г., 11:05
Например в ..\ cores \ maple \ libmaple \ gpiof1.в Global variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.

Flyboy74
Пт 15 июня 2018 г., 11:36
Спасибо, теперь это начинает иметь для меня больше смысла.
Хорошо, я знаю, что эти коды работают должным образом, потому что я запускаю код и вижу в своей области то, что я ожидаю увидеть: быстро включен, затем небольшой перерыв из -за запуска петли. Sketch uses 105,396 bytes (80%) of program storage space. Maximum is 131,072 bytes. Global variables use 6,152 bytes of dynamic memory.

Стивестронг
Пт 15 июня 2018 г., 11:40
Попробуйте это: DS3231 STM32F103ZET6 VCC 3.3V GND GND SDA PB7 (i2C1_SDA) SCL PB6 (i2C1_SCL)

Flyboy74
Пт 15 июня 2018 г., 11:47
[Стивестронг - Пт 15 июня 2018 г. 11:40] - Попробуйте это: // This uses the greiman sdfat library. // To use SdFatEX, set ENABLE_EXTENDED_TRANSFER_CLASS to 1 in the library's // src/SdFatConfig.h #include #include #include "SdFat.h" #define LED_PIN 33 #define PRODUCT_ID 0x29 SdFatEX sd; ///const uint32_t speed = SD_SCK_MHZ(18) ; const uint8_t SD_CHIP_SELECT = 20; bool enabled = false; uint32 cardSize; bool write(uint32_t memoryOffset, const uint8_t *writebuff, uint16_t transferLength) { return sd.card()->writeBlocks(memoryOffset/512, writebuff, transferLength/512); } bool read(uint32_t memoryOffset, uint8_t *readbuff, uint16_t transferLength) { return sd.card()->readBlocks(memoryOffset/512, readbuff, transferLength/512); } void setup() { USBComposite.setProductId(PRODUCT_ID); pinMode(LED_PIN,OUTPUT); digitalWrite(LED_PIN,1); } void initReader() { digitalWrite(LED_PIN,0); cardSize = sd.card()->cardSize(); MassStorage.setDrive(0, cardSize*512, read, write); MassStorage.registerComponent(); CompositeSerial.registerComponent(); USBComposite.begin(); enabled=true; } void loop() { if (!enabled) { if (sd.begin(SD_CHIP_SELECT,SPI_CLOCK_DIV2)) { initReader(); } else { delay(50); } } else { MassStorage.loop(); } }

Flyboy74
Пт 15 июня 2018 г., 11:49
Теперь я буду играть с таймерами и прерываниями и посмотрю, смогу ли я их считать :)

SSD1306 OLED Проблемы