Flyboy74
Пт 15 июня 2018 г. 5:06 утра
Я хочу научиться C, чтобы иметь возможность управлять вещами низкого уровня, которые нельзя управлять в Langues на более высоком уровне. Итак, я учусь писать C (Ardunio C ATM). Моя первая задача - это простая задача - я просто хочу включить/выключить штифт GPIO с помощью регистров.
Из моего Googling я, хотя этот код выполнит работу, но он получил ошибку компиляции
Неверное преобразование из 'int' to 'uint32* {aka long unsigned int*}' [-fpermissive]
Из моего 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
Flyboy74
Пт 15 июня 2018 г., 7:04
@ Pito Спасибо.
Я получил этот код для работы, как и ожидалось, но это поднимает для меня еще один вопрос. это GPIOA->регс->CRL стандартный сцепление или это что -то добавленное в порт STM32 в Ардунио. Для меня читая таблица данных на чипе, он дает физический адрес в памяти.
Я получил этот код для работы, как и ожидалось, но это поднимает для меня еще один вопрос. это 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.час
https: // github.com/rogerclarkmelbourne/arduino_stm32
GPIO.час:
https: // github.com/rogerclarkmelbourne/ ... IES/GPIO.час
Flyboy74
Пт 15 июня 2018 г. 8:07
@Pito еще раз спасибо за ссылки. Я сейчас читаю их внимательно.
Я только что заметил это: регистр BRR - это 16 -битный регистр, но он объявлен как единица32, создавая неверный размер указателя, а также неправильный адрес для следующего указателя LCKR
Я только что заметил это: регистр BRR - это 16 -битный регистр, но он объявлен как единица32, создавая неверный размер указателя, а также неправильный адрес для следующего указателя LCKR
attachInterrupt(, , );
Эдогальдо
Пт 15 июня 2018 г., 9:54
@flyboy74
BRR на самом деле не 16 бит: это 32 бита, но используется только низкая часть (нижняя 16 бит), высокая часть «зарезервирована».
Вы можете увидеть это в RM0008, где вы также можете увидеть, что BRR начинается с смещения 0x14, а LCKR начинается с смещения 0x18 (32 бита после)..
РЕДАКТИРОВАТЬ: Это также то же самое для IDR и ODR.
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
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
Теперь я буду играть с таймерами и прерываниями и посмотрю, смогу ли я их считать