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, обеспечивает доступ к регистрам с помощью синтаксиса:
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 -битных словах регистрации.
Этот метод является самым быстрым способом доступа (чтение и запись). Кроме того, он является безопасным для многоточного потока, когда последовательность считывания считывания-модификации на основе маски не.
Ура, Олли
- индивидуальные кусочки периферических регистров
- битовые поля в периферических регистрах
http: // www.STM32duino.com/viewtopic.PHP ... ing#P15081
В первом случае параметры - это имя регистра и номер бита. Во втором случае параметры
- зарегистрировать имя
- Первый бит номер
- количество битов
Примечание: номер бита может превышать 32, чтобы упростить обращение в битовые поля, которые хранятся в нескольких 32 -битных словах регистрации.
Этот метод является самым быстрым способом доступа (чтение и запись). Кроме того, он является безопасным для многоточного потока, когда последовательность считывания считывания-модификации на основе маски не.
Ура, Олли
Rogerclark
Sun 3 июля 2016 г., 11:25
@ollie
Спасибо.
Я должен получить привычку пытаться вспомнить что -то уникальное в таких постах, поэтому у меня больше шансов найти их снова.
В этом случае это было бы «бит -бить»
Спасибо.
Я должен получить привычку пытаться вспомнить что -то уникальное в таких постах, поэтому у меня больше шансов найти их снова.
В этом случае это было бы «бит -бить»
Iwalpola
Sun 3 июля 2016 г., 23:49
Звучит интересно, при таком скорости я вообще не выспатся
кузница
Солнце 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
Как я могу использовать 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);
int state = ddrc & B00000011;
и написать
DDRC = состояние | (bx<<5) | (к<<2);
Эдогальдо
Вторник 09 мая 2017 г., 20:11
Атакантенк писал:Как я добавляю в целочисленный порт прочитать так
int state = ddrc & B00000011;
и написать
DDRC = состояние | (bx<<5) | (к<<2);
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.
Монотонные манипуляции с штифтами могут быть сделаны с помощью макросов
#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.
Два измерения, которые вы получили, должны быть идентичными. Изменение, которое вы видели, вероятно, связано с другими факторами и может исчезнуть, если вы запустите несколько испытаний.
редактировать:
В качестве теста я запустил следующее, чтобы перевернуть штифт, используя 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();
};
}