Покажи настройки свои.
Ты точно в 1.6 версии это делаешь, а не в более новой?
У меня были такие сообщения на версии 1.7 и более новых.
в 1.6, пробовал и в 1.8, таже бодяга, чип видится так
13:13:44 : ST-LINK SN : 36FF70064155303456310357
13:13:44 : V2J45S7
13:13:44 : Connected via SWD.
13:13:44 : SWD Frequency = 4,0 MHz.
13:13:44 : Connection mode : Normal.
13:13:44 : Debug in Low Power mode enabled.
13:13:44 : Device ID:0x410
13:13:44 : Device flash Size : 128KBytes
13:13:44 : Device family :STM32F10xx Medium-density
Дай ссылку где покупал плату таблетки.
это копать надо, давно было, брал много, с разъёмом тайпси даже не видятся, нашел с микроусб, 2 -шт, прошились
я давно бросил затею загружать клоны из IDE, проще две лишних кнопки нажать в STM32CubeProgrammer
Странно… Все что у меня “клоны” по вышеописанной настройке в 1.6 прошиваются (хоть и ворчит, что царь (чип) не настояшшый)
библиотеку для ST7735 видимо писал, а то я кинулся искать для Arduino IDE ан нет, сидел тут переделывал от другого дисплея
Эти стервецы начали шиться из CubeIDE когда я их из под Arduino IDE прошил с активированным CDC и serial
Правда, если отключить питание снова перестают шиться и тогда по кругу, прошиваем в ARDUINO IDE далее можно отлаживаться в CubeIDE - что сказать - очень интересно девки пляшут )))
Схемотехника модулей разная! резистор в цепи USB D+ 1.5 ком проверен, номинал (измерено между +3.3v и A12 - соответствует) на плате что не шьётся без танцев с бубном на 4-ре элемента меньше
Тьфу ты!
Ну у меня такое же было, ты ту тему чего не читал то?
Стирай чипы перед прошивкой!!!
не в тему STM: не понимаю почему вы ищите постоянно какие то библиотеки для дисплеев, если гораздо проще написать самим, есть то…SPI переделать, да инициализацию дисплея.
А если уж так надо и именно для STM32 ST7735, то ниже выложил, заняло час от силы чтоб по 411 чип переделать.
Спойлер
/*
* f4spi.cpp
*
* Created on: Sep 3, 2024
* Author: seleznev_a
*/
#include "f4spi.h"
#include "stm32f4xx.h"
#include "f4base.h"
#include <stdio.h>
void f4initSPI1(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // GPIO port A
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // SPI ON
// pin SCK PA5 AF5 push-pull
GPIOA->MODER &= ~GPIO_MODER_MODER5; // 00 — clear bits
GPIOA->MODER |= GPIO_MODER_MODER5_1; // 10 — режим альтернативной функции.
GPIOA->MODER &= ~GPIO_MODER_MODER5_0; // 10 — режим альтернативной функции.
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5; // 0 - двухтактный выход или push-pull сокращено PP (после сброса)
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5; // 11 — 50 MHz
GPIOA->AFR[0] |=(0x05 << 20); // Назначаем PA5 выводу альтернативную функцию AF5
// pin MISO PA6 input pull-up
GPIOA->MODER &= ~GPIO_MODER_MODER6; // 00 — clear bits
GPIOA->MODER |= GPIO_MODER_MODER6_1; // 10 — режим альтернативной функции.
GPIOA->MODER &= ~GPIO_MODER_MODER6_0; // 10 — режим альтернативной функции.
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6; // 00 — reset bits
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR6_1; // 01 — подтяжка к плюсу питания или pull-up сокращено PU
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR6_0; // 01 — подтяжка к плюсу питания или pull-up сокращено PU
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR6; // 11 — 50 MHz
GPIOA->AFR[0] |=(0x05 << 24); // Назначаем PA6 выводу альтернативную функцию AF5
// pin MOSI PA7 AF5 push-pull
GPIOA->MODER |= GPIO_MODER_MODER7_1; // 10 — режим альтернативной функции.
GPIOA->MODER &= ~GPIO_MODER_MODER7_0; // 10 — режим альтернативной функции.
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_7; // 0 - двухтактный выход или push-pull сокращено PP (после сброса)
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; // 11 — 50 MHz
GPIOA->AFR[0] |=(0x05 << 28); // Назначаем PA7 выводу альтернативную функцию AF5
// init SPI1
SPI1->CR1 = 0;
SPI1->CR2 = 0;
//SPI1->CR1 &= ~SPI_CR1_BR; // 000: fPCLK/2
//SPI1->CR1 &= ~SPI_CR1_CPOL; // Clock polarity 0/1
//SPI1->CR1 &= ~SPI_CR1_CPHA; // Clock phase // 0: The first clock transition is the first data capture edge // The second clock transition is the first data capture edge
//SPI1->CR1 &= ~SPI_CR1_DFF; // 0: 8-bit data frame format is selected for transmission/reception
//SPI1->CR1 &= ~SPI_CR1_LSBFIRST; // 0 - MSB передается первым
SPI1->CR1 |= SPI_CR1_SSM; // Программное управление SS
SPI1->CR1 |= SPI_CR1_SSI; // I/O value of the NSS pin is ignored
SPI1->CR1 |= SPI_CR1_MSTR; // master mode
SPI1->CR1 |= SPI_CR1_SPE; // включить SPI
}
void f4sendSPI1(unsigned char cmd) {
*((__IO uint8_t *)&SPI1->DR) = cmd;
while ((!(SPI1->SR & SPI_SR_TXE)) && (SPI1->SR & SPI_SR_BSY));
}
void f4writeSPI1(unsigned char * buff, unsigned long buff_size) {
for(unsigned long i = 0; i < buff_size; ++i) {
while(!(SPI1->SR & SPI_SR_TXE)); // do not remark - its not good
*((__IO uint8_t *)&SPI1->DR) = *(buff++);
}
while ((!(SPI1->SR & SPI_SR_TXE)) && (SPI1->SR & SPI_SR_BSY));
}
Спойлер
/*
* f4st7735.cpp
*
* Created on: Sep 3, 2024
* Author: seleznev_a
*/
#include "f4st7735.h"
#include "f4spi.h"
#include "stm32f4xx.h"
#include "f4base.h"
#include <stdlib.h>
#include <string.h>
/*
* FR08x08.c
*
* Created on: 25 нояб. 2021 г.
* Author: http://forum.easyelectronics.ru/viewtopic.php?f=9&t=18271
*/
const unsigned char frus08x08[256][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E},
{0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E},
{0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00},
{0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00},
{0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x7C, 0x38, 0x7C},
{0x10, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C},
{0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00},
{0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF},
{0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00},
{0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF},
{0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78},
{0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18},
{0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0},
{0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0},
{0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99},
{0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00},
{0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00},
{0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18},
{0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00},
{0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00},
{0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0xCC, 0x78},
{0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00},
{0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF},
{0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00},
{0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00},
{0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00},
{0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00},
{0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00},
{0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00},
{0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x60, 0xF0, 0xF0, 0x60, 0x60, 0x00, 0x60, 0x00},
{0xD8, 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x6C, 0xFE, 0x6C, 0x6C, 0xFE, 0x6C, 0x00, 0x00},
{0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00},
{0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00},
{0x38, 0x6C, 0x38, 0x6E, 0xDC, 0xCC, 0x76, 0x00},
{0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00},
{0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00},
{0x00, 0xCC, 0x78, 0xFC, 0x78, 0xCC, 0x00, 0x00},
{0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60},
{0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00},
{0x7C, 0xC6, 0xCE, 0xDE, 0xF6, 0xE6, 0x7C, 0x00},
{0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00},
{0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00},
{0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00},
{0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00},
{0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00},
{0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00},
{0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00},
{0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00},
{0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00},
{0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60},
{0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00},
{0x00, 0x00, 0xFC, 0x00, 0x00, 0xFC, 0x00, 0x00},
{0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00},
{0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00},
{0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x78, 0x00},
{0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00},
{0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00},
{0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00},
{0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00},
{0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00},
{0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00},
{0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3E, 0x00},
{0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00},
{0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00},
{0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00},
{0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00},
{0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00},
{0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00},
{0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00},
{0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00},
{0x78, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x1C, 0x00},
{0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00},
{0x78, 0xCC, 0xE0, 0x70, 0x1C, 0xCC, 0x78, 0x00},
{0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00},
{0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00},
{0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00},
{0xC6, 0xC6, 0x6C, 0x38, 0x38, 0x6C, 0xC6, 0x00},
{0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00},
{0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00},
{0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00},
{0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00},
{0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00},
{0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF},
{0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00},
{0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00},
{0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00},
{0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00},
{0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00},
{0x38, 0x6C, 0x60, 0xF0, 0x60, 0x60, 0xF0, 0x00},
{0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8},
{0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00},
{0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78},
{0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00},
{0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
{0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xC6, 0x00},
{0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00},
{0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00},
{0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0},
{0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E},
{0x00, 0x00, 0xDC, 0x76, 0x66, 0x60, 0xF0, 0x00},
{0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x00},
{0x10, 0x30, 0x7C, 0x30, 0x30, 0x34, 0x18, 0x00},
{0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00},
{0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00},
{0x00, 0x00, 0xC6, 0xD6, 0xFE, 0xFE, 0x6C, 0x00},
{0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00},
{0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8},
{0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00},
{0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00},
{0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},
{0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00},
{0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00},
{0x1E, 0x36, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00},
{0x7C, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x7E, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00},
{0x38, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6},
{0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00},
{0xDB, 0xDB, 0x7E, 0x3C, 0x7E, 0xDB, 0xDB, 0x00},
{0xFE, 0x00, 0x00, 0xFE, 0x00, 0x00, 0xFE, 0x00},
{0x66, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00},
{0x3C, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00},
{0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00},
{0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00},
{0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00},
{0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00},
{0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00},
{0x7E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00},
{0x7E, 0x81, 0xA5, 0x81, 0xA5, 0x99, 0x81, 0x7E},
{0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00},
{0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x66, 0x66, 0x66, 0x3E, 0x06, 0x66, 0x3C, 0x00},
{0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x18, 0x18, 0x00},
{0x00, 0x38, 0x7C, 0x7C, 0x7C, 0x38, 0x00, 0x00},
{0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7F, 0x03},
{0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00},
{0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x00},
{0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x03},
{0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0xC6, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xF6, 0x00},
{0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x78, 0x8C, 0x06, 0x3E, 0x06, 0x8C, 0x78, 0x00},
{0xCE, 0xDB, 0xDB, 0xFB, 0xDB, 0xDB, 0xCE, 0x00},
{0x3E, 0x66, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x00},
{0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00},
{0x00, 0x3C, 0x60, 0x3C, 0x66, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x7C, 0x66, 0x7C, 0x66, 0x7C, 0x00},
{0x00, 0x00, 0x7E, 0x60, 0x60, 0x60, 0x60, 0x00},
{0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6},
{0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00},
{0x00, 0x00, 0xDB, 0x7E, 0x3C, 0x7E, 0xDB, 0x00},
{0x00, 0x00, 0x3C, 0x66, 0x0C, 0x66, 0x3C, 0x00},
{0x7E, 0x60, 0x60, 0x7E, 0x60, 0x60, 0x7E, 0x00},
{0x00, 0x18, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x00},
{0x00, 0x00, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00},
{0x00, 0x00, 0x1E, 0x36, 0x66, 0x66, 0x66, 0x00},
{0x00, 0x00, 0xC6, 0xFE, 0xFE, 0xD6, 0xC6, 0x00},
{0x00, 0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00},
{0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x7E, 0x66, 0x66, 0x66, 0x66, 0x00},
{0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44},
{0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA},
{0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77, 0xDD, 0x77},
{0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18},
{0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18},
{0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18, 0x18},
{0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36, 0x36},
{0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36, 0x36},
{0x24, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00},
{0x8E, 0x88, 0xC8, 0xA8, 0x98, 0x88, 0x88, 0x00},
{0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36},
{0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36, 0x36},
{0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00, 0x00},
{0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00, 0x00},
{0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18, 0x18},
{0x1E, 0x36, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00},
{0x7C, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x7E, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00},
{0x38, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6},
{0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00},
{0xDB, 0xDB, 0x7E, 0x3C, 0x7E, 0xDB, 0xDB, 0x00},
{0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00},
{0x66, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00},
{0x3C, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x66, 0x00},
{0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00},
{0x1E, 0x36, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00},
{0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00},
{0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00},
{0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00},
{0x7E, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00},
{0x7C, 0x66, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x00},
{0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00},
{0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x66, 0x66, 0x66, 0x3E, 0x06, 0x66, 0x3C, 0x00},
{0x7E, 0xDB, 0xDB, 0xDB, 0x7E, 0x18, 0x18, 0x00},
{0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00},
{0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7F, 0x03},
{0x66, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x06, 0x00},
{0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x00},
{0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x03},
{0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0xC6, 0xC6, 0xC6, 0xF6, 0xDE, 0xDE, 0xF6, 0x00},
{0x60, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x00},
{0x78, 0x8C, 0x06, 0x3E, 0x06, 0x8C, 0x78, 0x00},
{0xCE, 0xDB, 0xDB, 0xFB, 0xDB, 0xDB, 0xCE, 0x00},
{0x3E, 0x66, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x00},
{0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00},
{0x00, 0x3C, 0x60, 0x3C, 0x66, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x7C, 0x66, 0x7C, 0x66, 0x7C, 0x00},
{0x00, 0x00, 0x7E, 0x60, 0x60, 0x60, 0x60, 0x00},
{0x00, 0x00, 0x3C, 0x6C, 0x6C, 0x6C, 0xFE, 0xC6},
{0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00},
{0x00, 0x00, 0xDB, 0x7E, 0x3C, 0x7E, 0xDB, 0x00},
{0x00, 0x00, 0x3C, 0x66, 0x0C, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x00},
{0x00, 0x18, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0x00},
{0x00, 0x00, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00},
{0x00, 0x00, 0x1E, 0x36, 0x66, 0x66, 0x66, 0x00},
{0x00, 0x00, 0xC6, 0xFE, 0xFE, 0xD6, 0xC6, 0x00},
{0x00, 0x00, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00},
{0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x7E, 0x66, 0x66, 0x66, 0x66, 0x00},
{0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x00},
{0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x00},
{0x00, 0x00, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00},
{0x00, 0x00, 0x66, 0x66, 0x3E, 0x06, 0x3C, 0x00},
{0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x18, 0x00},
{0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00},
{0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x7F, 0x03},
{0x00, 0x00, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x00},
{0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x00},
{0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xFF, 0x03},
{0x00, 0x00, 0xE0, 0x60, 0x7C, 0x66, 0x7C, 0x00},
{0x00, 0x00, 0xC6, 0xC6, 0xF6, 0xDE, 0xF6, 0x00},
{0x00, 0x00, 0x60, 0x60, 0x7C, 0x66, 0x7C, 0x00},
{0x00, 0x00, 0x7C, 0x06, 0x3E, 0x06, 0x7C, 0x00},
{0x00, 0x00, 0xCE, 0xDB, 0xFB, 0xDB, 0xCE, 0x00},
{0x00, 0x00, 0x3E, 0x66, 0x3E, 0x36, 0x66, 0x00}};
/************************ (C) COPYRIGHT andycat2013@yandex.ru *****END OF FILE****/
unsigned char fontSizeX[4] = {fontWsize0, fontWsize1, fontWsize2, fontWsize3};
unsigned char fontSizeY[4] = {fontHsize0, fontHsize1, fontHsize2, fontHsize3};
void tftCSenable(void) {GPIOB->BSRR |= GPIO_BSRR_BR10;} // PB10 LOW // говорим slave устройству что начинаем работать
void tftCSdisable(void) {GPIOB->BSRR |= GPIO_BSRR_BS10;} // PB10 HIGH // закончили передачу SPI устройству
unsigned char nextXchar = 0;
unsigned char nextYchar = 0;
unsigned short nextColor = ST77XX_WHITE;
unsigned short nextBack = ST77XX_BLACK;
unsigned char nextSize = 0;
unsigned short oneCharBuf[fontWsize3 * fontHsize3];
void f1tftSendCommand(unsigned char cmd) {
GPIOB->BSRR |= GPIO_BSRR_BR0; // PB0 LOW
f4sendSPI1(cmd);
}
void f1tftWriteData(unsigned char * buff, unsigned long buff_size) {
GPIOB->BSRR |= GPIO_BSRR_BS0; // PB0 HIGH
f4writeSPI1(buff, buff_size);
}
void f4st7735init(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // GPIO port B
// PB1 - RESET ST7735
GPIOB->MODER |= GPIO_MODER_MODE1_0; // 01: Output mode
GPIOB->MODER &= ~GPIO_MODER_MODE1_1; // 01: Output mode
GPIOB->OTYPER &= ~GPIO_OTYPER_OT_1; // 0: Output push-pull (reset state)
GPIOB->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR1; // 00: Low speed
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR1; // No pull-up, pull-down
// PB0 - RS(A0) ST7735 cmd/data select
GPIOB->MODER |= GPIO_MODER_MODE0_0; // 01: Output mode
GPIOB->MODER &= ~GPIO_MODER_MODE0_1; // 01: Output mode
GPIOB->OTYPER &= ~GPIO_OTYPER_OT_0; // 0: Output push-pull (reset state)
GPIOB->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR0; // 00: Low speed
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR0; // No pull-up, pull-down
// PB10 - CS ST7735
GPIOB->MODER |= GPIO_MODER_MODE10_0; // 01: Output mode
GPIOB->MODER &= ~GPIO_MODER_MODE10_1; // 01: Output mode
GPIOB->OTYPER &= ~GPIO_OTYPER_OT_10; // 0: Output push-pull (reset state)
GPIOB->OSPEEDR &= ~GPIO_OSPEEDER_OSPEEDR10; // 00: Low speed
GPIOB->PUPDR &= ~GPIO_PUPDR_PUPDR10; // No pull-up, pull-down
// init tft
tftCSdisable(); // chip select off
// hardware reset
GPIOB->BSRR |= GPIO_BSRR_BR1; // PB1 LOW
delay_ms(10);
GPIOB->BSRR |= GPIO_BSRR_BS1; // PB1 HIGH
delay_ms(10);
// init routine
tftCSenable();
unsigned char dataSend[16];
f1tftSendCommand(ST77XX_SWRESET); // 0x01
delay_ms(150);
f1tftSendCommand(ST77XX_SLPOUT); // 0x11
delay_ms(150);
f1tftSendCommand(ST7735_FRMCTR1); // 0xB1
dataSend[0] = 0x01;
dataSend[1] = 0x2C;
dataSend[2] = 0x2D;
f1tftWriteData((unsigned char *)&dataSend, 3);
f1tftSendCommand(ST7735_FRMCTR2);
dataSend[0] = 0x01;
dataSend[1] = 0x2C;
dataSend[2] = 0x2D;
f1tftWriteData((unsigned char *)&dataSend, 3);
f1tftSendCommand(ST7735_FRMCTR3);
dataSend[0] = 0x01;
dataSend[1] = 0x2C;
dataSend[2] = 0x2D;
dataSend[3] = 0x01;
dataSend[4] = 0x2C;
dataSend[5] = 0x2D;
f1tftWriteData((unsigned char *)&dataSend, 6);
f1tftSendCommand(ST7735_INVCTR);
dataSend[0] = 0x07;
f1tftWriteData((unsigned char *)&dataSend, 1);
f1tftSendCommand(ST7735_PWCTR1);
dataSend[0] = 0xA2;
dataSend[1] = 0x02;
dataSend[2] = 0x84;
f1tftWriteData((unsigned char *)&dataSend, 3);
f1tftSendCommand(ST7735_PWCTR2);
dataSend[0] = 0xC5;
f1tftWriteData((unsigned char *)&dataSend, 1);
f1tftSendCommand(ST7735_PWCTR3);
dataSend[0] = 0x0A;
dataSend[1] = 0x00;
f1tftWriteData((unsigned char *)&dataSend, 2);
f1tftSendCommand(ST7735_PWCTR4);
dataSend[0] = 0x8A;
dataSend[1] = 0x2A;
f1tftWriteData((unsigned char *)&dataSend, 2);
f1tftSendCommand(ST7735_PWCTR5);
dataSend[0] = 0x8A;
dataSend[1] = 0xEE;
f1tftWriteData((unsigned char *)&dataSend, 2);
f1tftSendCommand(ST7735_VMCTR1);
dataSend[0] = 0x0E;
f1tftWriteData((unsigned char *)&dataSend, 1);
f1tftSendCommand(ST77XX_INVOFF);
f1tftSendCommand(ST77XX_MADCTL);
dataSend[0] = 0x00; // rotation 180
//dataSend[0] = 0xC0; // original string
f1tftWriteData((unsigned char *)&dataSend, 1);
f1tftSendCommand(ST77XX_COLMOD);
dataSend[0] = 0x05;
f1tftWriteData((unsigned char *)&dataSend, 1);
f1tftSendCommand(ST7735_GMCTRP1);
dataSend[0] = 0x02;
dataSend[1] = 0x1C;
dataSend[2] = 0x07;
dataSend[3] = 0x12;
dataSend[4] = 0x37;
dataSend[5] = 0x32;
dataSend[6] = 0x29;
dataSend[7] = 0x2D;
dataSend[8] = 0x29;
dataSend[9] = 0x25;
dataSend[10] = 0x2B;
dataSend[11] = 0x39;
dataSend[12] = 0x00;
dataSend[13] = 0x01;
dataSend[14] = 0x03;
dataSend[15] = 0x10;
f1tftWriteData((unsigned char *)&dataSend, 16);
f1tftSendCommand(ST7735_GMCTRN1);
dataSend[0] = 0x03;
dataSend[1] = 0x1D;
dataSend[2] = 0x07;
dataSend[3] = 0x06;
dataSend[4] = 0x2E;
dataSend[5] = 0x2C;
dataSend[6] = 0x29;
dataSend[7] = 0x2D;
dataSend[8] = 0x2E;
dataSend[9] = 0x2E;
dataSend[10] = 0x37;
dataSend[11] = 0x3F;
dataSend[12] = 0x00;
dataSend[13] = 0x00;
dataSend[14] = 0x02;
dataSend[15] = 0x10;
f1tftWriteData((unsigned char *)&dataSend, 16);
f1tftSendCommand(ST77XX_NORON);
delay_ms(10);
f1tftSendCommand(ST77XX_DISPON);
delay_ms(100);
tftCSdisable();
}
void f4tftSetAddrWindow(unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1) {
static unsigned char pos_data[4];
// column address set
f1tftSendCommand(ST77XX_CASET); // CASET
pos_data[0] = (x0 & 0xFF00) >> 8;
pos_data[1] = x0 & 0x00FF;
pos_data[2] = (x1 & 0xFF00) >> 8;
pos_data[3] = x1 & 0x00FF;
f1tftWriteData((unsigned char *)&pos_data, 4);
// row address set
f1tftSendCommand(ST77XX_RASET); // RASET
pos_data[0] = (y0 & 0xFF00) >> 8;
pos_data[1] = y0 & 0x00FF;
pos_data[2] = (y1 & 0xFF00) >> 8;
pos_data[3] = y1 & 0x00FF;
f1tftWriteData((unsigned char *)&pos_data, 4);
// write to RAM
f1tftSendCommand(ST77XX_RAMWR); // RAMWR
}
void f4st7735fillRect(unsigned short value, unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1) {
tftCSenable(); // chip select on
f4tftSetAddrWindow(x0, y0, x1, y1);
// 16 bit transfer mode
SPI1->CR1 &= ~SPI_CR1_SPE;
GPIOB->BSRR |= GPIO_BSRR_BS0; // PB0 HIGH
SPI1->CR1 |= SPI_CR1_DFF;
SPI1->CR1 |= SPI_CR1_SPE;
unsigned long countPix = (unsigned long)((x1-x0+1)*(y1-y0+1));
while (countPix--) {
while (!(SPI1->SR & SPI_SR_TXE)); // do not remark - its not good
*(volatile uint16_t *)&(SPI1->DR) = value;
}
// wait end transfer
while (!(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY));
// return 8bit transfer mode
SPI1->CR1 &= ~SPI_CR1_SPE;
tftCSdisable(); // chip select off
SPI1->CR1 &= ~SPI_CR1_DFF;
SPI1->CR1 |= SPI_CR1_SPE;
}
void f4st7735fillScreen(uint16_t value) {
f4st7735fillRect(value, 0, 0, st7735sizeX-1, st7735sizeY-1);
}
void f4st7735showRect(unsigned short * dataPoint, unsigned short x0, unsigned short y0, unsigned short x1, unsigned short y1) {
tftCSenable(); // chip select on
f4tftSetAddrWindow(x0, y0, x1, y1);
// 16 bit transfer mode
SPI1->CR1 &= ~SPI_CR1_SPE;
GPIOB->BSRR |= GPIO_BSRR_BS0; // PB0 HIGH
SPI1->CR1 |= SPI_CR1_DFF;
SPI1->CR1 |= SPI_CR1_SPE;
unsigned long countPix = (unsigned long)((x1-x0+1)*(y1-y0+1));
for (unsigned long i=0; i < countPix; i++) {
while (!(SPI1->SR & SPI_SR_TXE)); // do not remark - its not good
*(volatile uint16_t *)&(SPI1->DR) = *(dataPoint+i);
}
// wait end transfer
while (!(SPI1->SR & SPI_SR_TXE) || (SPI1->SR & SPI_SR_BSY));
// return 8bit transfer mode
SPI1->CR1 &= ~SPI_CR1_SPE;
tftCSdisable(); // chip select off
SPI1->CR1 &= ~SPI_CR1_DFF;
SPI1->CR1 |= SPI_CR1_SPE;
}
void f4st7735printOneChar(unsigned char inChar, unsigned short colChar, unsigned short colBackground, unsigned char sizeChar, unsigned char xChar, unsigned char yChar) {
unsigned char inSize = sizeChar & 0x03; // size 0...3
unsigned short locPosInBuf = 0; // абсолютная позиция в буфере где мы формируем картинку
unsigned short outColor;
for(unsigned char lineY = 0; lineY < fontSizeY[0]; ++lineY) { // цикл по строкам шрифта
for(unsigned char bitY = fontSizeX[0]; bitY > 0; --bitY) { // обратный цикл по горизонтальным битам строки шрифта
if (bitRead(frus08x08[inChar][lineY], (bitY-1))) outColor = colChar; else outColor = colBackground;
if (inSize == 0) { // самый маленький шрифт 8 на 8
oneCharBuf[locPosInBuf] = outColor;
++locPosInBuf;
} else { // необходимо масштабирование
unsigned char countHpoints; // количество точек по горизонтали
switch (inSize) {
case 1: {
if (bitRead(bitY, 0)) countHpoints = 1; else countHpoints = 2;
break;
}
case 2: {
if ((bitY == 7) || (bitY == 3)) countHpoints = 3; else countHpoints = 2;
break;
}
default: { // 3 size
countHpoints = 3;
}
}
for (unsigned char v = 0; v < countHpoints; ++v) { // сколько точек надо нарисовать в строке
for (unsigned char h = 0; h < (inSize+1); ++h) { // дублируем вниз точку на нужное количество увеличения шрифта
oneCharBuf[locPosInBuf + h * fontSizeX[inSize]] = outColor;
}
++locPosInBuf;
}
}
}
locPosInBuf += fontSizeX[inSize] * inSize;
}
f4st7735showRect((unsigned short *)&oneCharBuf, xChar, yChar, xChar+fontSizeX[inSize]-1, yChar+fontSizeY[inSize]-1);
nextSize = inSize;
nextColor = colChar;
nextBack = colBackground;
nextXchar = xChar+fontSizeX[inSize];
nextYchar = yChar;
if (nextXchar >= st7735sizeX) {
nextXchar = 0;
nextYchar += fontSizeY[inSize];
if (nextYchar >= st7735sizeY) nextYchar = 0;
}
}
void f4st7735printString(const unsigned char * inStr, unsigned short colChar, unsigned short colBackground, unsigned char sizeChar, unsigned char xChar, unsigned char yChar) {
unsigned char inSize = sizeChar & 0x03; // size 0...3
unsigned char posStr = 0;
unsigned char inChar;
while ((inChar = *(inStr + posStr)) > 0) {
f4st7735printOneChar(inChar, colChar, colBackground, inSize, xChar + fontSizeX[inSize] * posStr, yChar);
++posStr;
}
}
void f4st7735printUInt(unsigned long inVal, unsigned short colChar, unsigned short colBackground, unsigned char sizeChar, unsigned char xChar, unsigned char yChar) {
unsigned char outStr[32];
utoa(inVal, (char *)outStr, 10);
f4st7735printString((unsigned char *)&outStr, colChar, colBackground, sizeChar, xChar, yChar);
}
void f4st7735printHEX(unsigned long inVal, unsigned short colChar, unsigned short colBackground, unsigned char sizeChar, unsigned char xChar, unsigned char yChar) {
unsigned char outStr[32];
utoa(inVal, (char *)outStr, 16);
f4st7735printString((unsigned char *)&outStr, colChar, colBackground, sizeChar, xChar, yChar);
}
void f4st7735printText(const unsigned char * inText) {
unsigned char posStr = 0;
unsigned char inChar;
while ((inChar = *(inText + posStr)) > 0) {
f4st7735printOneChar(inChar, nextColor, nextBack, nextSize, nextXchar, nextYchar);
++posStr;
}
}
void f4st7735speedtest(void) {
unsigned short countPics = 0;
unsigned long timerSec =0UL;
while ((millis() - timerSec) < 1000UL) {
f4st7735fillScreen(0x55AA);
++countPics;
}
unsigned long speedSPI = st7735sizeX * st7735sizeY * 16 * countPics / 1000;
f4st7735printString((const unsigned char *)"Screens/sec", ST7735_WHITE, ST7735_BLACK, 0, 0, 0);
f4st7735printUInt(countPics, ST7735_WHITE, ST7735_BLACK, 0, 0, fontSizeY[0]);
f4st7735printString((const unsigned char *)"SPI speed (KHz)", ST7735_WHITE, ST7735_BLACK, 0, 0, fontSizeY[0] * 3);
f4st7735printUInt(speedSPI, ST7735_WHITE, ST7735_BLACK, 0, 0, fontSizeY[0] * 4);
f4st7735printString((const unsigned char *)"SPI1=APB2/2", ST7735_WHITE, ST7735_BLACK, 0, 0, fontSizeY[0] * 5);
delay_ms(10000UL);
}
Потому что не умеем еще писать сами ))
Десятки тысяч человек начинают освоение с написания кода для дисплея, мне кажется что силы расходуются понапрасну или так и есть? коммерция видимо влияет (для камней STM)
Я библиотеку адаптировал для использования с ардуино иде под STM ядро
Это должно быть реализовано как функция ротации картинки и, сразу непонятки откуда берутся эти константы, а в библиотеке всё прописано, а для особо разбирающихся ссылка на документ ну и так далее, поэтому я и топлю за библиотеки
И таки да, взял я чужую библиотеку, адаптировал, в нет кодов вне парадигмы Ардуино и она на STM32F103 умеет по SPI 36 мегагерц, это всё, на что он способен, видимо нет так плохи библиотеки для Ардуино от STM )))
Всё же отвечу:
Вот это будет работать на любом камне от STM без правки чего либо и на максимально возможной (для этого контроллера) скорости SPI
void TFT_ILI9341::writecommand(uint8_t c)
{
#if defined(SPI_HAS_TRANSACTION)
SPI.beginTransaction(ILI9341_SPI);
#endif
*rsport &= ~rspinmask;//low
*csport &= ~cspinmask;//low
spiwrite(c);
*csport |= cspinmask;//hi
#if defined(SPI_HAS_TRANSACTION)
SPI.endTransaction();
#endif
}
void TFT_ILI9341::writedata(uint8_t c)
{
#if defined(SPI_HAS_TRANSACTION)
SPI.beginTransaction(ILI9341_SPI);
#endif
*rsport |= rspinmask;//hi
*csport &= ~cspinmask;//low
spiwrite(c);
*csport |= cspinmask;//hi
#if defined(SPI_HAS_TRANSACTION)
SPI.endTransaction();
#endif
}
Зная HAL можно написать так:
static void ILI9341_WriteCommand(uint8_t cmd) {
HAL_GPIO_WritePin(ILI9341_DC_GPIO_Port, ILI9341_DC_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&ILI9341_SPI_PORT, &cmd, sizeof(cmd), HAL_MAX_DELAY);
}
static void ILI9341_WriteData(uint8_t* buff, size_t buff_size) {
HAL_GPIO_WritePin(ILI9341_DC_GPIO_Port, ILI9341_DC_Pin, GPIO_PIN_SET);
// split data in small chunks because HAL can't send more then 64K at once
while(buff_size > 0) {
uint16_t chunk_size = buff_size > 32768 ? 32768 : buff_size;
HAL_SPI_Transmit(&ILI9341_SPI_PORT, buff, chunk_size, HAL_MAX_DELAY);
buff += chunk_size;
buff_size -= chunk_size;
}
}
Как у тебя тоже можно, но вот если озвучишь смысл каждый раз переделывать код под другой контроллер, тратить драгоценное время, если ничего не выигрываешь по скорости?
Может собраться всем да написать универсальную библиотеку для основных применяемых сообществом дисплеев с ориентацией под STM Core?
Гы
А где натурные эксперименты с выводом статистики?
Остыньте уже, нравиться перебирать библиотеки и есть настроение - да пожалуйста.
не нравится, хотелось бы готовенького, нашел на arduino.cc такую тему, что дескать кто юзает Core от STM и нужны библиотеки для дисплеев, обращайтесь, помогу, только пост от 22 года и автор (из Англии) с тех пор ничего не постил
“хочешь сделать хорошо - сделай сам” (с) кто то сказал.
ЗЫ. Я ж очень даже не против библиотек, особенно чего то сложного, как правильно xDriver сказал, это я ещё до usb не добрался
Сунулся недавно, посмотрел и закрыл.
Ну а что то простое, типа таймеров в базовых режимах или вывод в шину spi графических примитивов или спрайтов на дисплей ну реально проще самостоятельно написать.
ссылку дать у кого посмотреть? он там много что интересного написал даже на предмет косяка в драйвере usbser от Мелкомягких )))