Регистры GPIO и манипуляции с портами

Iwalpola
Sun 3 июля 2016 г., 21:35
Источники:
http: // incedded-lab.com/blog/stm32-gpio-ports-insights/
http: // hertaville.com/stm32f0-gpio-tutorial-part-1.HTML

Библиотеки Libmaple, на которых базируется STM32Duino, обеспечивает доступ к регистрам с помощью синтаксиса:
GPIOA->regs->REG

Rogerclark
Sun 3 июля 2016 г., 22:42
Вы видели пост об отдельном доступе к битам через разные адреса.

(Извините, я не могу найти ссылку на ветку в данный момент, когда я публикую с телефона)

Олли
Sun 3 июля 2016 г., 11:01 вечера
Вот пост для доступа
- индивидуальные кусочки периферических регистров
- битовые поля в периферических регистрах

http: // www.STM32duino.com/viewtopic.PHP ... ing#P15081

В первом случае параметры - это имя регистра и номер бита. Во втором случае параметры
- зарегистрировать имя
- Первый бит номер
- количество битов

Примечание: номер бита может превышать 32, чтобы упростить обращение в битовые поля, которые хранятся в нескольких 32 -битных словах регистрации.

Этот метод является самым быстрым способом доступа (чтение и запись). Кроме того, он является безопасным для многоточного потока, когда последовательность считывания считывания-модификации на основе маски не.

Ура, Олли

Rogerclark
Sun 3 июля 2016 г., 11:25
@ollie

Спасибо.

Я должен получить привычку пытаться вспомнить что -то уникальное в таких постах, поэтому у меня больше шансов найти их снова.
В этом случае это было бы «бит -бить»

Iwalpola
Sun 3 июля 2016 г., 23:49
Звучит интересно, при таком скорости я вообще не выспатся : D

кузница
Солнце 04 сентября 2016 г., 14:54
Хм, может быть, я что -то неправильно понял, но попытка следовать не дала результатов, которые я ожидал: void setup() { GPIOA->regs->CRL = (GPIOA->regs->CRL & 0x33333333) ; //set PA0-PA7 output //Set A0-A7 (HIGH) GPIOA->regs->ODR |= 0b0000000011111111; }

Атакантенк
Пн, 8 мая 2017 г., 7:05 утра
Я хочу использовать светодиодный порт GPIOC для PC13
Как я могу использовать Witd Direct Registers и Manipulation Port
STM32F103 Series

Эдогальдо
Пн, 8 мая 2017 г. 9:57 утра
void setup() { RCC_BASE->APB2ENR |= 0x10; // enable GPIOC clock GPIOC->regs->CRH = (GPIOC->regs->CRH & 0xFF0FFFFF) | 0x00100000; // PC13 output push/pull (max speed 10MHz) GPIOC->regs->CRH = (GPIOC->regs->CRH & 0xFF0FFFFF) | 0x00200000; // PC13 output push/pull (max speed 2MHz) GPIOC->regs->CRH = (GPIOC->regs->CRH & 0xFF0FFFFF) | 0x00300000; // PC13 output push/pull (max speed 50MHz) } void loop() { GPIOC->regs->BSRR = 0x00002000; //PC13 = 1 (leave others unchanged) GPIOC->regs->BSRR = 0x20000000; //PC13 = 0 (leave others unchanged) GPIOC->regs->BSRR = 0x20002000; //PC13 = 1 (leave others unchanged - lower bits (set) have precedence over higher (clear)) GPIOC->regs->BRR = 0x00002000; //PC13 = 0 (leave others unchanged) GPIOC->regs->ODR = 0x00002000; //PC13 = 1 (all others set to 0) GPIOC->regs->ODR |= 0x00002000; //PC13 = 1 (leave others unchanged) GPIOC->regs->ODR = 0x00000000; //PC13 = 0 (all others set to 0 too) GPIOC->regs->ODR &= ~0x00002000; //PC13 = 0 (leave others unchanged) }

Атакантенк
Пн, 8 мая 2017 г., 11:22
Можете ли вы сделать тот же PC15

Эдогальдо
Пн, 8 мая 2017 г., 11:53
Атакантенк писал:Можете ли вы сделать тот же PC15

Атакантенк
Вторник 09 мая 2017 12:50
Как я добавляю в целочисленный порт прочитать так

int state = ddrc & B00000011;

и написать
DDRC = состояние | (bx<<5) | (к<<2);

Эдогальдо
Вторник 09 мая 2017 г., 20:11
Атакантенк писал:Как я добавляю в целочисленный порт прочитать так

int state = ddrc & B00000011;

и написать
DDRC = состояние | (bx<<5) | (к<<2);

Дэнниф
Пт 16 июня 2017 г. 12:06
Атакантенк писал:Как я добавляю в целочисленный порт прочитать так

Олли
Пт 16 июня 2017 г. 8:57 утра
Если ваше приложение использует прерывания, которые могут манипулировать целевыми портами GPIO, операция по считыванию-модификации не является безопасной. Вот почему, почему STM разработала регистры BSRR для установки и сброса выбранных булавок.

Монотонные манипуляции с штифтами могут быть сделаны с помощью макросов

#define gpio_clear (gpioport, gpiopins) gpioport->BSRR = ((GPIOPINS) << 16)
#define gpio_set (gpioport, gpiopins) gpioport->BSRR = (GPIOPINS)

Это самый быстрый способ сделать обновления PIN -код GPIO.

erinqvnm
Пт 15 сентября 2017 г. 7:49 утра
Привет, спасибо за хорошее объяснение. Попроеклся в моем STM32F103, чтобы увеличить частоту битов, вместо использования DigitalWrite. С простым сравнительным анализом: unsigned long time = micros(); for (uint32_t i = 0; i < 1000000; i++) { GPIOA->regs->BSRR = 0b0000000000000001; GPIOA->regs->BRR = 0b0000000000000001; } time = micros() - time;

Дэнниф
Пт 15 сентября 2017 г. 12:51
Настройки CRL предназначены только для текущих возможностей привода.

Два измерения, которые вы получили, должны быть идентичными. Изменение, которое вы видели, вероятно, связано с другими факторами и может исчезнуть, если вы запустите несколько испытаний.

редактировать:

В качестве теста я запустил следующее, чтобы перевернуть штифт, используя BSRR/BRR и протестировал скорость на 1 миллион переворотов на 48 МГц F103.
int main(void) { int i; mcu_init(); //reset the mcu //systick_init(); coretick_init(); //reset coretick //initialize the pins to outout IO_OUT(LED_PORT, LED1 | LED2); //led1/2 as output @ 10Mhz GPIO_DDR(LED_PORT, LED1 | LED2, 0x03); //led1/2 as output @ 50Mhz IO_CLR(LED_PORT, LED1 | LED2); ei(); //enable global interrupts while (1) { time0 = coreticks(); //time stamp for (tmp=0; tmp < 1000000ul; tmp++) {FIO_SET(LED_PORT, LED2); FIO_CLR(LED_PORT, LED2);} time0 = coreticks() - time0; NOP(); }; }

32-битные таймеры