First working code

This commit is contained in:
Clément Grennerat
2025-09-13 22:21:56 +02:00
parent 3bd65d37a5
commit 81c4eb79c4
9 changed files with 334 additions and 619 deletions
+208 -318
View File
@@ -33,267 +33,156 @@ volatile uint16_t LCD_HEIGHT = LCD_SCREEN_HEIGHT;
volatile uint16_t LCD_WIDTH = LCD_SCREEN_WIDTH;
/* SPI3 & GPIOs init function */
void LCD_SPI_Init(void) {
//__HAL_RCC_SPI3_CLK_ENABLE();
RCC->APB1ENR1 |= RCC_APB1ENR1_SPI3EN;// SPI3 clock enable
RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;// GPIOC clock enable
/** CS & DC GPIO signals configuration
PC8 ------> LCD_CS_PIN
PC11 ------> LCD_DC_PIN
*/
GPIOC->BSRR = LCD_CS_PIN | (LCD_DC_PIN << 16);//CS à 1 et DC à 0
GPIOC->MODER |= (1 << 16) | (1 << 22);//GPIO out
GPIOC->MODER &= ~((1 << 17) | (1 << 23));//mise à 0
GPIOC->OTYPER &= (GPIO_OTYPER_OT8 | GPIO_OTYPER_OT11);//PC8 & 11 en PP
GPIOC->OSPEEDR |= (3 << 16) | (3 << 22);//High speed
/**SPI3 GPIO Configuration
PC10 ------> SPI3_SCK
PC12 ------> SPI3_MOSI */
GPIOC->AFR[1] |= (6 << 8) | (6 << 16);//PC10 en AF6 : SPI3_SCK, PC12 en AF6 : SPI3_MOSI
GPIOC->AFR[1] &= 0xFFF6F6FF;//Mise à 0
GPIOC->MODER |= (2 << 20) | (2 << 24);//MODE AF
GPIOC->MODER &= 0xFEEFFFFF;//Mise à 0
GPIOC->OTYPER &= (GPIO_OTYPER_OT10 | GPIO_OTYPER_OT12);//PC10 & 12 en PP
GPIOC->OSPEEDR |= (3 << 24) | (3 << 20);//High speed
/*Configure module SPI3*/
SPI3->CR1 = SPI_CR1_SSM | SPI_CR1_SSI;//CS soft, SSI à 1 sinon decl. mode fault
SPI3->CR1 |= SPI_CR1_MSTR;// 0 sauf SPE et mode Master, BR = 0 => /2=> Fsck=40M
SPI3->CR2 = 0x0700 | SPI_CR2_FRXTH;// | SPI_CR2_NSSP; //mode 8 bits, ITs disabled, no DMA, FRXTH doit être à 1 en 8 bits
SPI3->CR1 |= SPI_CR1_SPE;
}
//void LCD_SPI_Init(void) {
////__HAL_RCC_SPI3_CLK_ENABLE();
// RCC->APB1ENR1 |= RCC_APB1ENR1_SPI3EN;// SPI3 clock enable
// RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;// GPIOC clock enable
//
// /** CS & DC GPIO signals configuration
// PC8 ------> LCD_CS_PIN
// PC11 ------> LCD_DC_PIN
// */
// GPIOC->BSRR = LCD_CS_PIN | (LCD_DC_PIN << 16);//CS à 1 et DC à 0
// GPIOC->MODER |= (1 << 16) | (1 << 22);//GPIO out
// GPIOC->MODER &= ~((1 << 17) | (1 << 23));//mise à 0
// GPIOC->OTYPER &= (GPIO_OTYPER_OT8 | GPIO_OTYPER_OT11);//PC8 & 11 en PP
// GPIOC->OSPEEDR |= (3 << 16) | (3 << 22);//High speed
//
// /**SPI3 GPIO Configuration
// PC10 ------> SPI3_SCK
// PC12 ------> SPI3_MOSI */
// GPIOC->AFR[1] |= (6 << 8) | (6 << 16);//PC10 en AF6 : SPI3_SCK, PC12 en AF6 : SPI3_MOSI
// GPIOC->AFR[1] &= 0xFFF6F6FF;//Mise à 0
// GPIOC->MODER |= (2 << 20) | (2 << 24);//MODE AF
// GPIOC->MODER &= 0xFEEFFFFF;//Mise à 0
// GPIOC->OTYPER &= (GPIO_OTYPER_OT10 | GPIO_OTYPER_OT12);//PC10 & 12 en PP
// GPIOC->OSPEEDR |= (3 << 24) | (3 << 20);//High speed
//
// /*Configure module SPI3*/
// SPI3->CR1 = SPI_CR1_SSM | SPI_CR1_SSI;//CS soft, SSI à 1 sinon decl. mode fault
// SPI3->CR1 |= SPI_CR1_MSTR;// 0 sauf SPE et mode Master, BR = 0 => /2=> Fsck=40M
// SPI3->CR2 = 0x0700 | SPI_CR2_FRXTH;// | SPI_CR2_NSSP; //mode 8 bits, ITs disabled, no DMA, FRXTH doit être à 1 en 8 bits
// SPI3->CR1 |= SPI_CR1_SPE;
//
//}
/* Send command (char) to LCD via SPI bus */
void LCD_Write_Command(uint8_t Command) {
CMD
;
//CS_ON;
while ((SPI1->SR & SPI_SR_TXE) != 0);// Waiting for TX register to be available.
*(uint8_t*) (SPI1_DR_ADR) = Command;// Cast sur pointeur, pour ecriture 8 bits. Sinon l'acces 16 bits provoque un tfert 16 bits
while ((SPI1->SR & SPI_SR_TXE) == 0);// Waiting for TX register to be available.
SPI1->DR = Command;// Cast sur pointeur, pour ecriture 8 bits. Sinon l'acces 16 bits provoque un tfert 16 bits
//while ((SPI1->SR & SPI_SR_BSY) != 0); //Attendre fin envoi trame (cf RM P1289)
//CS_OFF;
}
/* Send Data (char) to LCD via SPI bus */
void LCD_Write_Data(uint8_t Data) {
DATA
;
//CS_ON;
while ((SPI1->SR & SPI_SR_TXE) != 0);// Waiting for TX register to be available.
*(uint8_t*) (SPI1_DR_ADR) = Data;
while ((SPI1->SR & SPI_SR_TXE) == 0);// Waiting for TX register to be available.
SPI1->DR = Data;
//while ((SPI1->SR & SPI_SR_BSY) != 0); //Attendre fin envoi trame (cf RM P1289)
//CS_OFF;
}
/* Send Data (char) to LCD via SPI bus */
void LCD_Write_Data16(uint16_t Data) {
DATA
;
//CS_ON;
while ((SPI1->SR & SPI_SR_TXE) == 0);// Waiting for TX register to be available.
SPI1->DR = Data;
//while ((SPI1->SR & SPI_SR_BSY) != 0); //Attendre fin envoi trame (cf RM P1289)
//CS_OFF;
}
/* Set the frame to draw into and sends a write into frame command */
void LCD_Set_Address(uint16_t X1, uint16_t Y1, uint16_t X2, uint16_t Y2) {
LCD_Write_Command(0x2A);
LCD_Write_Data(X1 >> 8);
LCD_Write_Data(X1);
LCD_Write_Data(X2 >> 8);
LCD_Write_Data(X2);
LCD_Write_Command(0x2B);
LCD_Write_Data(Y1 >> 8);
LCD_Write_Data(Y1);
LCD_Write_Data(Y2 >> 8);
LCD_Write_Data(Y2);
LCD_Write_Command(0x2C);
}
/*HARDWARE RESET*/
//Reset n'est pas cable sur aff ADA1983
// void LCD_Reset(void)
// {
// HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET);
// HAL_Delay(200);
// CS_ON;
// HAL_Delay(200);
// HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET);
// }
/*Ser rotation of the screen - changes x0 and y0*/
void LCD_Set_Rotation(uint8_t Rotation) {
//void LCD_Set_Rotation(uint8_t Rotation) {
//
// uint8_t screen_rotation = Rotation;
//
// LCD_Write_Command(0x36);
//
// switch (screen_rotation)
// case SCREEN_VERTICAL_1:
// LCD_Write_Data(0x40 | 0x08);
// LCD_WIDTH = 240;
// LCD_HEIGHT = 320;
// break;
// case SCREEN_HORIZONTAL_1:
// LCD_Write_Data(0x20 | 0x08);
// LCD_WIDTH = 320;
// LCD_HEIGHT = 240;
// break;
// case SCREEN_VERTICAL_2:
// LCD_Write_Data(0x80 | 0x08);
// LCD_WIDTH = 240;
// LCD_HEIGHT = 320;
// break;
// case SCREEN_HORIZONTAL_2:
// LCD_Write_Data(0x40 | 0x80 | 0x20 | 0x08);
// LCD_WIDTH = 320;
// LCD_HEIGHT = 240;
// break;
// default:
// break;
//}
uint8_t screen_rotation = Rotation;
LCD_Write_Command(0x36);
for (volatile uint32_t i = 0; i < TEMPO1MS_80M; i++);//~1ms attente
switch (screen_rotation) {
case SCREEN_VERTICAL_1:
LCD_Write_Data(0x40 | 0x08);
LCD_WIDTH = 240;
LCD_HEIGHT = 320;
break;
case SCREEN_HORIZONTAL_1:
LCD_Write_Data(0x20 | 0x08);
LCD_WIDTH = 320;
LCD_HEIGHT = 240;
break;
case SCREEN_VERTICAL_2:
LCD_Write_Data(0x80 | 0x08);
LCD_WIDTH = 240;
LCD_HEIGHT = 320;
break;
case SCREEN_HORIZONTAL_2:
LCD_Write_Data(0x40 | 0x80 | 0x20 | 0x08);
LCD_WIDTH = 320;
LCD_HEIGHT = 240;
break;
default:
//EXIT IF SCREEN ROTATION NOT VALID!
break;
}
void LCD_HardwareReset() {
HAL_GPIO_WritePin(DRESET_GPIO_Port, DRESET_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(DRESET_GPIO_Port, DRESET_Pin, GPIO_PIN_RESET);
HAL_Delay(20);
HAL_GPIO_WritePin(DRESET_GPIO_Port, DRESET_Pin, GPIO_PIN_SET);
HAL_Delay(150);
}
/*Enable LCD display*/
//Reset n'est pas cable sur aff ADA1983
// void LCD_Enable(void)
// {
// HAL_GPIO_WritePin(LCD_RST_PORT, LCD_RST_PIN, GPIO_PIN_SET);
// }
/*Initialize LCD display*/
void LCD_Init(void) {
volatile uint32_t i;//Boucle att
//Reset n'est pas cable sur aff ADA1983
//LCD_Enable();
LCD_SPI_Init();
//LCD_Reset();
//LCD_SPI_Init();
//SOFTWARE RESET
LCD_HardwareReset();
// enable spi1
SPI1->CR1 |= SPI_CR1_SPE; // NSS (CS) pin is automatically pulled low
HAL_Delay(300);
// Software reset
LCD_Write_Command(0x01);
for (i = 0; i < (1000 * TEMPO1MS_80M); i++);// ~1s sleep @80M
HAL_Delay(150);
//POWER CONTROL A -- command not existing
// LCD_Write_Command(0xCB);
// LCD_Write_Data(0x39);
// LCD_Write_Data(0x2C);
// LCD_Write_Data(0x00);
// LCD_Write_Data(0x34);
// LCD_Write_Data(0x02);
//POWER CONTROL B -- command not existing
// LCD_Write_Command(0xCF);
// LCD_Write_Data(0x00);
// LCD_Write_Data(0xC1);
// LCD_Write_Data(0x30);
//DRIVER TIMING CONTROL A -- Display Output Ctrl Adjust
LCD_Write_Command(0xE8);
LCD_Write_Data(0x85);
LCD_Write_Data(0x00);
LCD_Write_Data(0x78);
//DRIVER TIMING CONTROL B -- command not existing
// LCD_Write_Command(0xEA);
// LCD_Write_Data(0x00);
// LCD_Write_Data(0x00);
//POWER ON SEQUENCE CONTROL -- command not existing
// LCD_Write_Command(0xED);
// LCD_Write_Data(0x64);
// LCD_Write_Data(0x03);
// LCD_Write_Data(0x12);
// LCD_Write_Data(0x81);
//PUMP RATIO CONTROL -- command not existing
// LCD_Write_Command(0xF7);
// LCD_Write_Data(0x20);
//POWER CONTROL,VRH[5:0] -- Power Control 1
LCD_Write_Command(0xC0);
LCD_Write_Data(0x23);
//POWER CONTROL,SAP[2:0];BT[3:0] -- Power Control 2
LCD_Write_Command(0xC1);
LCD_Write_Data(0x10);
//VCM CONTROL -- VCOM Control
LCD_Write_Command(0xC5);
LCD_Write_Data(0x3E);
LCD_Write_Data(0x28);
//VCM CONTROL 2
LCD_Write_Command(0xC7);
LCD_Write_Data(0x86);
//MEMORY ACCESS CONTROL
LCD_Write_Command(0x36);
LCD_Write_Data(0x48);
//PIXEL FORMAT
// Color mode: 16bit/pixels
LCD_Write_Command(0x3A);
LCD_Write_Data(0x55);
HAL_Delay(150);
//FRAME RATIO CONTROL, STANDARD RGB COLOR
LCD_Write_Command(0xB1);
LCD_Write_Data(0x00);
LCD_Write_Data(0x18);
//DISPLAY FUNCTION CONTROL
LCD_Write_Command(0xB6);
LCD_Write_Data(0x08);
LCD_Write_Data(0x82);
LCD_Write_Data(0x27);
//3GAMMA FUNCTION DISABLE
LCD_Write_Command(0xF2);
LCD_Write_Data(0x00);
//GAMMA CURVE SELECTED
LCD_Write_Command(0x26);
LCD_Write_Data(0x01);
//POSITIVE GAMMA CORRECTION
LCD_Write_Command(0xE0);
LCD_Write_Data(0x0F);
LCD_Write_Data(0x31);
LCD_Write_Data(0x2B);
LCD_Write_Data(0x0C);
LCD_Write_Data(0x0E);
LCD_Write_Data(0x08);
LCD_Write_Data(0x4E);
LCD_Write_Data(0xF1);
LCD_Write_Data(0x37);
LCD_Write_Data(0x07);
LCD_Write_Data(0x10);
LCD_Write_Data(0x03);
LCD_Write_Data(0x0E);
LCD_Write_Data(0x09);
LCD_Write_Data(0x00);
//NEGATIVE GAMMA CORRECTION
LCD_Write_Command(0xE1);
LCD_Write_Data(0x00);
LCD_Write_Data(0x0E);
LCD_Write_Data(0x14);
LCD_Write_Data(0x03);
LCD_Write_Data(0x11);
LCD_Write_Data(0x07);
LCD_Write_Data(0x31);
LCD_Write_Data(0xC1);
LCD_Write_Data(0x48);
LCD_Write_Data(0x08);
LCD_Write_Data(0x0F);
LCD_Write_Data(0x0C);
LCD_Write_Data(0x31);
LCD_Write_Data(0x36);
LCD_Write_Data(0x0F);
//EXIT SLEEP
// Exit sleep
LCD_Write_Command(0x11);
for (i = 0; i < (120 / TEMPO1MS_80M); i++); // ~120ms sleep
HAL_Delay(150);
//TURN ON DISPLAY
// Turn on display
LCD_Write_Command(0x29);
HAL_Delay(400);
//STARTING ROTATION
LCD_Set_Rotation(SCREEN_HORIZONTAL_1);
LCD_Fill_Screen(WHITE);
//LCD_Draw_Rectangle(0, 0, 10, 10, RED);
// STARTING ROTATION
//LCD_Set_Rotation(SCREEN_HORIZONTAL_1);
}
//INTERNAL FUNCTION OF LIBRARY
@@ -305,13 +194,14 @@ void LCD_Draw_Colour_Burst(uint16_t Colour, uint32_t Size) {
bufColour |= Colour << 8;// en mode 8 bits, il faut inverser les octets MSB/LSB
DATA
;
CS_ON;
//CS_ON;
for (uint32_t j = 0; j < Size; j++) {
while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
SPI3->DR = bufColour;
while ((SPI1->SR & SPI_SR_TXE) == 0);// Waiting for TX register to be available.
//while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
SPI1->DR = Colour; //bufColour;
}
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
//while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
//CS_OFF;
}
//FILL THE ENTIRE SCREEN WITH SELECTED COLOUR (either #define-d ones or custom 16bit)
@@ -327,45 +217,45 @@ void LCD_Fill_Screen(uint16_t Colour) {
//Using pixels to draw big simple structures is not recommended as it is really slow
//Try using either rectangles or lines if possible
//
void LCD_Draw_Pixel(uint16_t X, uint16_t Y, uint16_t Colour) {
if ((X >= LCD_WIDTH) || (Y >= LCD_HEIGHT)) return;//OUT OF BOUNDS!
//ADDRESS
LCD_Write_Command(0x2A);
//XDATA
DATA
;
CS_ON;
SPI3->DR = (X >> 8) | (X << 8);//inversion MSB / LSB pour envoi des 2 mots 8 bits en 1W 16bits
//Pas d'att si FIFO full (TX buffer Empty=0) car juste 2 écriture 16 bits tiennent dans FIFO
SPI3->DR = ((X + 1) >> 8) | ((X + 1) << 8);
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
//ADDRESS
LCD_Write_Command(0x2B);
//YDATA
DATA
;
CS_ON;
SPI3->DR = (Y >> 8) | (Y << 8);
SPI3->DR = ((Y + 1) >> 8) | ((Y + 1) << 8);
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
//ADDRESS
LCD_Write_Command(0x2C);
//COLOUR
DATA
;
CS_ON;
SPI3->DR = (Colour >> 8) | (Colour << 8);
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
}
//void LCD_Draw_Pixel(uint16_t X, uint16_t Y, uint16_t Colour) {
// if ((X >= LCD_WIDTH) || (Y >= LCD_HEIGHT)) return;//OUT OF BOUNDS!
//
////ADDRESS
// LCD_Write_Command(0x2A);
//
////XDATA
// DATA
// ;
// CS_ON;
// SPI3->DR = (X >> 8) | (X << 8);//inversion MSB / LSB pour envoi des 2 mots 8 bits en 1W 16bits
////Pas d'att si FIFO full (TX buffer Empty=0) car juste 2 écriture 16 bits tiennent dans FIFO
// SPI3->DR = ((X + 1) >> 8) | ((X + 1) << 8);
// while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
// CS_OFF;
//
////ADDRESS
// LCD_Write_Command(0x2B);
//
////YDATA
// DATA
// ;
// CS_ON;
// SPI3->DR = (Y >> 8) | (Y << 8);
// SPI3->DR = ((Y + 1) >> 8) | ((Y + 1) << 8);
// while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
// CS_OFF;
//
////ADDRESS
// LCD_Write_Command(0x2C);
//
////COLOUR
// DATA
// ;
// CS_ON;
// SPI3->DR = (Colour >> 8) | (Colour << 8);
// while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
// CS_OFF;
//}
//DRAW RECTANGLE OF SET SIZE AND HEIGTH AT X and Y POSITION WITH CUSTOM COLOUR
//
@@ -639,67 +529,67 @@ void LCD_Draw_Text(
/*Dessine une image dans une zone de l'ecran, aux coordonnées X et Y*/
//CONVERTISSEUR: http://www.digole.com/tools/PicturetoC_Hex_converter.php
//65K colour (2Bytes / Pixel)
void LCD_Draw_Image_XY(
const char *Image_Array,
uint16_t X,
uint16_t Y,
uint16_t Width,
uint16_t Height) {
LCD_Set_Address(X, Y, X + Width - 1, Y + Height - 1);
DATA
;
CS_ON;
for (uint32_t i = 0; i < Width * Height * 2; i += 2) {
while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
// on utilise l'ecriture 16 bits dans DR, pour des envois 8 bits
// Le LSB doit etre place ds le MSB :
SPI3->DR = ((short) Image_Array[i + 1]) << 8 | Image_Array[i];
}
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
}
//void LCD_Draw_Image_XY(
// const char *Image_Array,
// uint16_t X,
// uint16_t Y,
// uint16_t Width,
// uint16_t Height) {
// LCD_Set_Address(X, Y, X + Width - 1, Y + Height - 1);
//
// DATA
// ;
// CS_ON;
//
// for (uint32_t i = 0; i < Width * Height * 2; i += 2) {
// while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
//// on utilise l'ecriture 16 bits dans DR, pour des envois 8 bits
//// Le LSB doit etre place ds le MSB :
// SPI3->DR = ((short) Image_Array[i + 1]) << 8 | Image_Array[i];
// }
//
// while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
// CS_OFF;
//}
/*Draws a full screen picture from flash. Image converted from RGB .jpeg/other to C array using online converter*/
//USING CONVERTER: http://www.digole.com/tools/PicturetoC_Hex_converter.php
//65K colour (2Bytes / Pixel)
void LCD_Draw_Image_Full(const char *Image_Array, uint8_t Orientation) {
switch (Orientation) {
case SCREEN_HORIZONTAL_1:
LCD_Set_Rotation(SCREEN_HORIZONTAL_1);
LCD_Set_Address(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);
break;
case SCREEN_HORIZONTAL_2:
LCD_Set_Rotation(SCREEN_HORIZONTAL_2);
LCD_Set_Address(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);
break;
case SCREEN_VERTICAL_1:
LCD_Set_Rotation(SCREEN_VERTICAL_1);
LCD_Set_Address(0, 0, LCD_SCREEN_HEIGHT, LCD_SCREEN_WIDTH);
break;
case SCREEN_VERTICAL_2:
LCD_Set_Rotation(SCREEN_VERTICAL_2);
LCD_Set_Address(0, 0, LCD_SCREEN_HEIGHT, LCD_SCREEN_WIDTH);
break;
}
DATA
;
CS_ON;
for (uint32_t i = 0; i < LCD_SCREEN_WIDTH * LCD_SCREEN_HEIGHT * 2; i += 2) {
while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
// on utilise l'ecriture 16 bits dans DR, pour des envois 8 bits
// Le LSB doit etre place ds le MSB :
SPI3->DR = ((short) Image_Array[i + 1]) << 8 | Image_Array[i];
}
while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
CS_OFF;
}
//void LCD_Draw_Image_Full(const char *Image_Array, uint8_t Orientation) {
// switch (Orientation) {
// case SCREEN_HORIZONTAL_1:
// LCD_Set_Rotation(SCREEN_HORIZONTAL_1);
// LCD_Set_Address(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);
// break;
//
// case SCREEN_HORIZONTAL_2:
// LCD_Set_Rotation(SCREEN_HORIZONTAL_2);
// LCD_Set_Address(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);
// break;
//
// case SCREEN_VERTICAL_1:
// LCD_Set_Rotation(SCREEN_VERTICAL_1);
// LCD_Set_Address(0, 0, LCD_SCREEN_HEIGHT, LCD_SCREEN_WIDTH);
// break;
//
// case SCREEN_VERTICAL_2:
// LCD_Set_Rotation(SCREEN_VERTICAL_2);
// LCD_Set_Address(0, 0, LCD_SCREEN_HEIGHT, LCD_SCREEN_WIDTH);
// break;
// }
//
// DATA
// ;
// CS_ON;
//
// for (uint32_t i = 0; i < LCD_SCREEN_WIDTH * LCD_SCREEN_HEIGHT * 2; i += 2) {
// while ((SPI3->SR & SPI_SR_TXE) == 0);//Si FIFO full (TX buffer Empty=0), on attend
//// on utilise l'ecriture 16 bits dans DR, pour des envois 8 bits
//// Le LSB doit etre place ds le MSB :
// SPI3->DR = ((short) Image_Array[i + 1]) << 8 | Image_Array[i];
// }
//
// while ((SPI3->SR & SPI_SR_BSY) != 0);//Attendre fin envoi trame
// CS_OFF;
//}
+71 -87
View File
@@ -1,4 +1,4 @@
/* USER CODE BEGIN */
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
@@ -15,55 +15,54 @@
*
******************************************************************************
*/
/* USER CODE END */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "LCD_driver.h"
#include "5x5_font.h"
#include "LogoIUT.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN */
/* USER CODE END */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN */
/* USER CODE BEGIN PTD */
/* USER CODE END */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN */
/* USER CODE BEGIN PD */
/* USER CODE END */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN */
/* USER CODE BEGIN PM */
/* USER CODE END */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi1;
UART_HandleTypeDef huart1;
/* USER CODE BEGIN */
/* USER CODE BEGIN PV */
/* USER CODE END */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI1_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN */
/* USER CODE BEGIN PFP */
/* USER CODE END */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN */
/* USER CODE BEGIN 0 */
/* USER CODE END */
/* USER CODE END 0 */
/**
* @brief The application entry point.
@@ -72,48 +71,47 @@ static void MX_USART1_UART_Init(void);
int main(void)
{
/* USER CODE BEGIN */
/* USER CODE BEGIN 1 */
/* USER CODE END */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN */
/* USER CODE BEGIN Init */
/* USER CODE END */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN */
/* USER CODE END */
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN */
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_Fill_Screen(PURPLE);
/* USER CODE END */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN */
/* USER CODE BEGIN WHILE */
while (1) {
/* USER CODE END */
/* USER CODE BEGIN */
HAL_Delay(1000);
LCD_Init();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END */
/* USER CODE END 3 */
}
/**
@@ -162,22 +160,22 @@ void SystemClock_Config(void)
static void MX_SPI1_Init(void)
{
/* USER CODE BEGIN */
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END */
/* USER CODE END SPI1_Init 1 */
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
@@ -186,9 +184,9 @@ static void MX_SPI1_Init(void)
{
Error_Handler();
}
/* USER CODE BEGIN */
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END */
/* USER CODE END SPI1_Init 2 */
}
@@ -200,13 +198,13 @@ static void MX_SPI1_Init(void)
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN */
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
@@ -219,9 +217,9 @@ static void MX_USART1_UART_Init(void)
{
Error_Handler();
}
/* USER CODE BEGIN */
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END */
/* USER CODE END USART1_Init 2 */
}
@@ -233,9 +231,9 @@ static void MX_USART1_UART_Init(void)
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN */
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
@@ -250,13 +248,18 @@ static void MX_GPIO_Init(void)
HAL_GPIO_WritePin(GPIOD, DB4_Pin|DB2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, DB0_Pin|DRESET_Pin|DCX_Pin|IM2_Pin
|IM1_Pin|PB14_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, DB0_Pin|DRESET_Pin|DCX_Pin|PB14_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, DB1_Pin|DB3_Pin|DB5_Pin|DB7_Pin
|DB9_Pin|DB11_Pin|DB13_Pin|DB15_Pin
|IM0_Pin|DRDX_Pin|DB12_Pin, GPIO_PIN_RESET);
|DRDX_Pin|DB12_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(IM0_GPIO_Port, IM0_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, IM2_Pin|IM1_Pin, GPIO_PIN_SET);
/*Configure GPIO pins : DB10_Pin DB8_Pin DB6_Pin */
GPIO_InitStruct.Pin = DB10_Pin|DB8_Pin|DB6_Pin;
@@ -273,19 +276,19 @@ static void MX_GPIO_Init(void)
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : DB0_Pin DRESET_Pin DCX_Pin IM2_Pin
PB14_Pin */
IM1_Pin PB14_Pin */
GPIO_InitStruct.Pin = DB0_Pin|DRESET_Pin|DCX_Pin|IM2_Pin
|PB14_Pin;
|IM1_Pin|PB14_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : DTE_Pin */
GPIO_InitStruct.Pin = DTE_Pin;
/*Configure GPIO pins : DTE_Pin A11_Pin A12_Pin */
GPIO_InitStruct.Pin = DTE_Pin|A11_Pin|A12_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(DTE_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : DB1_Pin DB3_Pin DB5_Pin DB7_Pin
DB9_Pin DB11_Pin DB13_Pin DB15_Pin
@@ -298,36 +301,17 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pin : IM1_Pin */
GPIO_InitStruct.Pin = IM1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(IM1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PA11 */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA12 */
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure peripheral I/O remapping */
__HAL_AFIO_REMAP_PD01_ENABLE();
/* USER CODE BEGIN */
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN */
/* USER CODE BEGIN 4 */
/* USER CODE END */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
@@ -335,12 +319,12 @@ static void MX_GPIO_Init(void)
*/
void Error_Handler(void)
{
/* USER CODE BEGIN */
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1) {
}
/* USER CODE END */
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
@@ -350,11 +334,11 @@ void Error_Handler(void)
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed( uint8_t * file , uint32_t line)
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN */
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
+1 -1
View File
@@ -74,7 +74,7 @@ void HAL_MspInit(void)
/** DISABLE: JTAG-DP Disabled and SW-DP Disabled
*/
__HAL_AFIO_REMAP_SWJ_DISABLE();
//__HAL_AFIO_REMAP_SWJ_DISABLE();
/* USER CODE BEGIN MspInit 1 */