Top.Mail.Ru
Уведомления
Очистить все

[Закреплено] STM32 для начинающих

Страница 7 / 17
(@aleksej-6)
Level 3

https://disk.yandex.ru/d/oo45QorV5BC5ow

(Новую сбросил, та не работает) 

ОтветитьЦитата
Размещено : 24.04.2023 12:48
(@eduard)
Level 4 Moderator

@aleksej-6 Какая плата у Вас и какое подключение?
Дисплей я надыбал.

ОтветитьЦитата
Размещено : 26.04.2023 06:33
(@aleksej-6)
Level 3

@eduard 

Эдуард, плата на контроллере STM32H743VIT6 (ссылка)

Экран (ссылка)

Подключения: шина spi2, выводы DC, RS и CS обозначены в файле (gc9a01a.h) 

Файл инициализации от контроллера экрана "gc9a01a", с ним работает. Инициализация spi в двух местах добавлены "костыли", чего они делают не знаю но без них не работает. 

 

ОтветитьЦитата
Размещено : 26.04.2023 09:23
(@aleksej-6)
Level 3

Криво, но заработало. Будет "прямо" если вызов "повесить" на прерывание, что бы время не тратить )

По разбирался немного с темой "Указатели на функции" )

Переделал подпрограмму вывода на экран (через DMA). "Засунуть" бы эту функцию в прерывания. Но не понимаю (по крайней мере пока) почему не получается указывать (да и вообще вызывать)  ScreenBuff из любой другой подпрограммы ? Даже если её указать, при прорисовке изображения экран чёрный, как будто буфер пустой ?  

void GC9A01A_Update()
{
	//static uint16_t ScreenBuff [GC9A01A_Height * GC9A01A_Width];
	//uint16_t *pBuff;

	GC9A01A_SetWindow(0, 0, GC9A01A_Width - 1, GC9A01A_Height - 1);

	DC_HIGH();
	CS_LOW();

	uint32_t len = GC9A01A_Width * GC9A01A_Height;

	//SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) ScreenBuff, len, SendPart2); // uint16_t
	// (uint8_t*) & ScreenBuff[240*130] - это начальная точка вывода массива

	//-----------------------------------
	/*
	// 240x260
	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[0], 240*130, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*65], 240*130, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*130], 240*130, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*195], 240*130, 0);
	//while(!dma_spi_fl) ; //dma_spi_fl = 1;
	//dma_spi_fl = 0;*/

	// 240x280
	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[0], 240*140, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*70+1], 240*140, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*140+1], 240*140, 0);
	while(!dma_spi_fl) ; //dma_spi_fl = 1;
	dma_spi_fl = 0;

	SPI_send_dma(GC9A01A_SPI_periph, 0, (uint8_t*) & ScreenBuff[240*210+1], 240*140, 0);
}
ОтветитьЦитата
Размещено : 26.04.2023 13:26
(@eduard)
Level 4 Moderator

@aleksej-6 Привет.

Посмотрел я код. Я ничем помочь в этом случае не могу.

Этот код с Narodstream. Я вам советую бежать от этого сайта как от огня.

Он выдаёт много инфы, зачастую неправильную. Его примеры, по большей части, работают только у него.

Делает много непростительных ляпов.

Я делаю драйвера для всего на классах. Так намного удобнее. На этот дисплей у меня есть драйвера.

Переписывать под HAL у меня нет времени.

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

Для этого МК ядра нет, но начать писать его не так и сложно.

ОтветитьЦитата
Размещено : 27.04.2023 20:48
(@aleksej-6)
Level 3

@eduard 

Эдуард хорошо, пока оставлю свою библиотеку в таком виде. Потихоньку попробую разбираться с "классами" 

ОтветитьЦитата
Размещено : 29.04.2023 01:08
(@eduard)
Level 4 Moderator

@aleksej-6 Обращайтесь, если что.

Буду ядро для STM32H7 писать.

У меня такая же платка лежит.

ОтветитьЦитата
Размещено : 29.04.2023 10:30
(@aleksej-6)
Level 3

@eduard 

Спасибо )

ОтветитьЦитата
Размещено : 29.04.2023 10:56
(@aleksej-6)
Level 3

Доброго времени !

Эдуард а вы не разбирались с spi на stm32h743 ? Через регистры передача у меня идёт, а на получение ничего не выходит (даже тактирование по sck нету на приём)...   

ОтветитьЦитата
Размещено : 02.05.2023 14:22
(@eduard)
Level 4 Moderator

@aleksej-6 Привет.
Нет ещё. Возьмите мой драйвер от F4xx.

Там практически всё одинаково.
Может только придётся некоторые регистры подправить. И тактирование там по другому сделано.
Написание дров по этот чип я только начал. Сейчас с тактированием RCC разбираюсь.

ОтветитьЦитата
Размещено : 02.05.2023 19:06
(@aleksej-6)
Level 3

На F4 у меня есть программа, на H7 названия регистров переправить то не проблема...

Второй день сижу, толку 0 

ОтветитьЦитата
Размещено : 03.05.2023 11:32
(@eduard)
Level 4 Moderator

@aleksej-6 Тактирование там сложное. Может в этом проблема.
Нужно под отладчиком смотреть. Все ли регистры правильно пишутся.

Шаги:

1. Подать тактирование на порт в котором используются выводы SPI.

2. Включить альтернативную функцию нужных выводов. Список смотрим в даташите.

3. Подать тактирование на SPI. Проверить под отладчиком, что тактирование подано. Это будет видно. Регистры SPI обнулены. При подаче тактирования, некоторые регистры будут изменены.

4. Включить SPI в нужный режим.

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

ОтветитьЦитата
Размещено : 03.05.2023 18:53
(@aleksej-6)
Level 3
while (!(SPI1->SR & SPI_SR_TXP));  // Ждать завершения передачи
*(volatile uint16_t *) &(SPI1->TXDR) = address;
while(!(SPI1->SR & SPI_SR_RXP));    // Ждать завершения приёма
rf_data = *(volatile uint16_t *) &(SPI1->RXDR);

Передача идёт, а с приёмом ерунда какая то. 

При такой записи ответ от ведомого устройства идёт но принимается не верно.

Не могу понять как выставить правильно "DSIZE", что бы настроить верное срабатывание RXP флага. Как настроить  FTHLV[3:0] в регистре SPI_CFG1 ...

Необходимо выставлять размеры отправляемых данных, что бы правильно срабатывал флаг RXP на приём данных..  

ОтветитьЦитата
Размещено : 04.05.2023 10:04
(@aleksej-6)
Level 3

Криво, но по крайней мере знаю что на H7 spi может "физически" работать )

Чтение и отправка идёт через буфер, надо понять как правильно его настроить...

// передача
while (!(SPI1->SR & SPI_SR_TXP));
*(volatile uint16_t *) &(SPI1->TXDR) = addres;

// приём
while (!(SPI1->SR & SPI_SR_RXP));  // Ждать завершения приёма
rf_data = *(volatile uint8_t *) &(SPI1->RXDR);
rf_data = *(volatile uint8_t *) &(SPI1->RXDR);
ОтветитьЦитата
Размещено : 04.05.2023 13:21
(@eduard)
Level 4 Moderator

Я ещё с тактированием разбираюсь.

Что то в этом коде глаз режет.
Почитайте статью. Может поможет.

Обратите внимание на ожидание приёма.

ОтветитьЦитата
Размещено : 04.05.2023 20:12
Страница 7 / 17
Поделиться: