Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Не отрицаю. Но я так и оставил ногодрыг у себя, а всю остальную периферию на дма выкинул. Я сейчас не помню точно, но вышло что скорость по дма была ниже чем мне требовалось
На этом контроллере stm32f103c8t6 максимальная скорость передачи по SPI как раз без DMA.
The actual size of the integer types varies by implementation. The standard requires only size relations between the data types and minimum sizes for each data type:
The relation requirements are that the long long is not smaller than long, which is not smaller than int, which is not smaller than short. As char's size is always the minimum supported data type, no other data types (except bit-fields) can be smaller.
The minimum size for char is 8 bits, the minimum size for short and int is 16 bits, for long it is 32 bits and long long must contain at least 64 bits.
if(color==WHITE)
memcpy(displayBuff,0xFF,BUFFER_SIZE);
else if(color==BLACK)
memcpy(displayBuff,0x00,BUFFER_SIZE);
с помощью библиотеки CMSIS
while((SPI1->SR & SPI_SR_BSY))Кстати проверка флага SPI_SR_BSY при отправке данных, не лучшее решение, так вы проверяете есть ли еще данные в сдвиговом регистре, ну и как пишут в RM:
The BSY flag must be used with caution: refer to Section28.5.10: SPI status flags and
Procedure for disabling the SPI on page767.
Зачем конструкции вида:
SPI1->CR1|=SPI_CR1_SSM;//Программный NSS
SPI1->CR1|=SPI_CR1_SSI;//NSS - high
SPI1->CR2|=SPI_CR2_TXDMAEN;//Разрешить запросы DMA
SPI1->CR1|=SPI_CR1_SPE;//включить SPI1Для установки 1 бита каждый раз вычитывать volatile-регистр — ненужный расход памяти и тактов. Компилятор не будет это оптимизировать.
Лучше свернуть к 1 записи:
SPI1->CR1|= SPI_CR1_SSM | ... ;Обращение к BSRR регистру неправильно:
#define CS_SET GPIOA->BSRR |= GPIO_BSRR_BS2Этот регистр только для записи. Читать его ненужно — только записывать:
#define CS_SET GPIOA->BSRR = GPIO_BSRR_BS2BS[2:0] контроллера (ssd1306 datasheet, 13), что в свою очередь определяет интерфейс между MCU и ssd1306.
Подключение OLED дисплея ssd1306 к STM32 (SPI+DMA)