Подключение монохромного дисплея на ST7565 к STM32

Попался мне в руки SafeTouch , вещь для меня бесполезная , но товарищ который притащил его , уверял что подрубил другой такой же к китайскому «Тестеру компонентов».

Только всё отображается зеркально.
Разобрав дисплей наткнулся на на 32 битный микроконтроллер atmel , мк для меня оказался бесполезным . т.к. построен он был не на cortex , а изучить 1 мк , который никогда больше не используешь , мне показалось глупостью. И тут я совершил фатальную ошибку , решил снять микроконтроллер используя паяльный фен. Дисплей был перегрет , и в некоторых местах появились пятна.
Сняв мк , и поняв что я тот ещё рукожоп . Принялся искать документацию на китайский «Тестер компонентов» , найдя нужную документацию и узнав что в дисплее стоит контроллер ST7565.

Я решил проверить не сдох ли дисплей . подрубил к ардуино нашёл библиотеку . Загрузил код , и на дисплее появилось .

Отлично, дисплей жив.
Т.к. дуни уже давно стали у меня только средством проверки разных модулей, то нужно перетащить дисплей на мк , которые я использую повсеместно , а именно STM32F103C8 .
Немного порывшись в интернете , конкретно под мой случай , я ни черта не нашёл. Вернее , даже под другие микроконтроллеры мало кто подрубает дисплеи ST7565 , возможно это связанно с ценой , т.к. на али они стоят зачастую дороже своих цветных собратьев.
Но всё же несколько примеров было . А т.к. «My English is very bad» , то как исходником я воспользовался статьей https://cxem.net/mc/mc162.php «Подключение LCD-дисплея ST7565 к микроконтроллеру MSP430» 

Я в глаза не видел микроконтроллеры MSP, но исходный код всё же глянул. Т.к. раньше я программировал avr , то было не трудно понять исходный код 

 #define LCDPORT P1OUT #define GND BIT0 #define VCC BIT1 #define A0    BIT2 #define CS   BIT3 #define SCK BIT4 #define SDA BIT5 #define RST BIT6 void main(void) {    WDTCTL = WDTPW + WDTHOLD;   // Stop WDT    P1DIR = 0xFF;    LCDPORT &= ~GND;    LCDPORT |= VCC;    LCDPORT &= ~RST;    __delay_cycles(1000);    LCDPORT |= RST;    LCDPORT &=~A0;    LCDPORT &=~CS;    doSPI(CMD_SET_BIAS_7);    doSPI(CMD_SET_ADC_NORMAL);    doSPI(CMD_SET_COM_NORMAL);    doSPI(CMD_SET_DISP_START_LINE);    doSPI(CMD_SET_POWER_CONTROL | 0x4 );    __delay_cycles(1000);    doSPI(CMD_SET_POWER_CONTROL | 0x7);    __delay_cycles(1000); 

немного изменив его я получил

  lcd_reset();    lcd_dc(0);    HAL_Delay(1);    doSPI(CMD_SET_BIAS_9);    doSPI(CMD_SET_ADC_REVERSE);    doSPI(CMD_SET_COM_NORMAL);    doSPI(CMD_SET_DISP_START_LINE);    doSPI(CMD_SET_POWER_CONTROL | 0x4 );    HAL_Delay(1);    doSPI(CMD_SET_POWER_CONTROL | 0x7);    HAL_Delay(1);     doSPI(CMD_DISPLAY_ON);    doSPI(CMD_SET_ALLPTS_NORMAL); 

Как видите в принципе я ничего не изменил , только __delay_cycles(1000); на HAL_Delay(1); , и LCDPORT &= ~RST;  LCDPORT |= RST; на lcd_reset(); , и  LCDPORT &=~A0; на lcd_dc(0); . А LCDPORT &=~CS;  поставил на аппаратное передёргивание .
В целом , перекопировал всё из исходника в свой проект , немного изменил. 

Теперь время настроить сам проект. Открываем куб и настраиваем там нужный spi и выводы reset , dc , cs. У STM32F103C8 2SPI , я выбрал 1,  но заменить его на 2 не составит труда.

Частоту установил на 72МГц , но изначально проверял на 8. 

Я использую TrueStudio , спасибо компании ST , за то что выкупила её и модифицирует под свои камни.

Вот  изменённая функция передачи данных , благодаря библиотеке HAl , можно спокойно перенести на 2 SPI если предварительно настроить в кубе SPI2 , то в коде нужно будет заменить HAL_SPI_Transmit(&hspi1,(uint8_t*)aTxBuffer, 1, 5000); на HAL_SPI_Transmit(&hspi2,(uint8_t*)aTxBuffer, 1, 5000);

  1.  void doSPI(uint8_t d) {     aTxBuffer[0]=d;     HAL_SPI_Transmit(&hspi1,(uint8_t*)aTxBuffer, 1, 5000); HAL_Delay(1);    }

Собственно всё , загружаю код и вижу :

Зеркальность, ну хотя бы загрузился и прошёл инициализацию. Спасибо А.Касьянову , он в своём проекте всё предусмотрел.
замена строчки
doSPI(CMD_SET_ADC_NORMAL);

на
doSPI(CMD_SET_ADC_REVERSE);

Убрало зеркальное отображение.

Собственно и всё . На фото видно как я повредил дисплей перегревом. Неравномерная яркость пикселей . и пару белых пятен.
Исходный проект в CubeMX и TrueStudio прилагаю.