Пн фев 29, 2016 22:16:31
Ср мар 02, 2016 03:18:59
void GUI_FILL_RECT(uint16_t X1, uint16_t X2, uint16_t Y1, uint16_t Y2, uint16_t COLOR)
{
uint32_t COUNT_PIXEL = 0;
DMA_InitTypeDef DMA_INI;
DMA_DeInit(DMA1_Channel3);
DMA_INI.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR); //Адрес регистра записи для периферии SPI1
DMA_INI.DMA_MemoryBaseAddr = (uint32_t)&COLOR; //Указатель на буфер с цветом
DMA_INI.DMA_DIR = DMA_DIR_PeripheralDST; //Направление: Периферия принимает.
COUNT_PIXEL = (X2 - X1 + 1) * (Y2 - Y1 + 1);
if (COUNT_PIXEL > 65535)
DMA_INI.DMA_BufferSize = 65535; //Количество байт для передачи
else
DMA_INI.DMA_BufferSize = COUNT_PIXEL; //Количество байт для передачи
DMA_INI.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //Автоинкремент периферии выключен, у нас фиксированный адрес
DMA_INI.DMA_MemoryInc = DMA_MemoryInc_Disable; //Аналогично предыдущему.
DMA_INI.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //Ширина SPI 16 бит
DMA_INI.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //Ширина буфера 16 бит
DMA_INI.DMA_Mode = DMA_Mode_Normal; //Нормальный режим DMA
DMA_INI.DMA_Priority = DMA_Priority_VeryHigh; //Приоритет
DMA_INI.DMA_M2M = DMA_M2M_Disable; //Память-память выключено.
DMA_Init(DMA1_Channel3, &DMA_INI);
TFT_AREA(X1, X2, Y1, Y2); //Установка области заливки
TFT_DC_HIGH; //Погнали данные
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); //Разрешаем запросы DMA от SPI1
SPI_DataSizeConfig(SPI1, SPI_DataSize_16b); //Переводим SPI в 16 бит
DMA_Cmd(DMA1_Channel3, ENABLE); // СТАРТ ЗАЛИВКИ
//С использованием программного опроса флага
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //Первая половина экрана окрашена
DMA1->IFCR = DMA1_FLAG_TC3;
if (COUNT_PIXEL > 65535)
{
DMA_Cmd(DMA1_Channel3, DISABLE);
DMA1_Channel3->CNDTR = COUNT_PIXEL - 65535;
DMA_Cmd(DMA1_Channel3, ENABLE);
while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //Остальная часть экрана окрашена
DMA1->IFCR = DMA1_FLAG_TC3;
};
DMA_Cmd(DMA1_Channel3, DISABLE); //Выключаем все.
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, DISABLE);
SPI_DataSizeConfig(SPI1, SPI_DataSize_8b);
}
#define TFT_WIDTH 239
#define TFT_HEIGHT 319
GUI_FILL_RECT(0, TFT_WIDTH, 0, TFT_HEIGHT, color);
Ср мар 02, 2016 05:23:13
Ср мар 02, 2016 06:46:13
Ср мар 02, 2016 07:15:24
Ср мар 02, 2016 12:57:34
Ср мар 02, 2016 13:08:29
Ср мар 02, 2016 13:11:52
Ср мар 02, 2016 16:25:35
Ср мар 02, 2016 19:17:00
Ср мар 02, 2016 20:16:08
Ср мар 02, 2016 21:35:03
uint16_t TFT_SPI_SEND(uint16_t Data)
{
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET);
if (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == SET)
{ return SPI_I2S_ReceiveData(SPI1); } else return 0;
}
Чт мар 03, 2016 16:09:08
Чт мар 03, 2016 17:49:28
fagci писал(а):Только конструкция с if не будет полезна -> что-то здесь не так=)
Вс мар 06, 2016 08:24:16
#define dmaWait() while(SPI_I2S_GetFlagStatus(SPI_MASTER,SPI_I2S_FLAG_BSY) == SET);
Вт авг 13, 2019 15:21:03
Сб авг 17, 2019 05:03:01
Пт сен 03, 2021 07:21:43