From 3351a83cbc32f3e8dad7e45ff12b72c187878569 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Fri, 14 Feb 2025 00:01:01 +0200 Subject: [PATCH] initial driver test --- Core/Src/main.c | 397 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 397 insertions(+) create mode 100644 Core/Src/main.c diff --git a/Core/Src/main.c b/Core/Src/main.c new file mode 100644 index 0000000..58195ee --- /dev/null +++ b/Core/Src/main.c @@ -0,0 +1,397 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +#define DISPLAY_RS ((uint16_t) (0x1U << 7)) +#define DISPLAY_RW ((uint16_t) (0x1U << 10)) +#define DISPLAY_ENA ((uint16_t) (0x1U << 11)) + +#define UPDATE_STATUS GPIOD->ODR = ((GPIOE->ODR & DISPLAY_ENA) << 1) | ((GPIOE->ODR & DISPLAY_RS) << 6) +#define DISPLAY_CHAR_DELAY 1 // character +#define DISPLAY_COMM_DELAY 60 // command + +#define DISPLAY_INSTRUCT_BYTE(byte) \ + do { \ + GPIOE->ODR = ((((uint16_t)(byte)) << 8) & 0xF000); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + GPIOE->BSRR = DISPLAY_ENA; \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + GPIOE->BSRR = (DISPLAY_ENA << 16); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + \ + GPIOE->ODR = ((((uint16_t)(byte)) << 12) & 0xF000); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + GPIOE->BSRR = DISPLAY_ENA; \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + GPIOE->BSRR = (DISPLAY_ENA << 16); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_COMM_DELAY); \ + } while (0) + +#define DISPLAY_DATA_BYTE(byte) \ + do { \ + GPIOE->ODR = (((((uint16_t)(byte)) << 8) & 0xF000) | DISPLAY_RS); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + GPIOE->BSRR = DISPLAY_ENA; \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + GPIOE->BSRR = (DISPLAY_ENA << 16); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + \ + GPIOE->ODR = (((((uint16_t)(byte)) << 12) & 0xF000) | DISPLAY_RS); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + GPIOE->BSRR = DISPLAY_ENA; \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + GPIOE->BSRR = (DISPLAY_ENA << 16); \ + UPDATE_STATUS; \ + HAL_Delay(DISPLAY_CHAR_DELAY); \ + } while (0) + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + /* USER CODE BEGIN 2 */ + DISPLAY_INSTRUCT_BYTE(0x01); + + GPIOD->ODR = 0xF000; + HAL_Delay(1000); + + //HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET); + + uint8_t display_status = 0x0; + int attempts_left; + + while (1) { + GPIOE->MODER &= 0x00FFFFFFU; + attempts_left = 10; + + do { + if (GPIOE->MODER & 0xFF000000U) { + // port didn't switch mode + GPIOD->ODR = 0x4000U; + while (1) {} + } else { + GPIOD->ODR = 0x0U; + } + + GPIOE->BSRR = DISPLAY_RW | (DISPLAY_RS << 16); + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(20); + display_status = (GPIOE->IDR & 0xF000) >> 8; + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(20); + + + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(20); + display_status |= (GPIOE->IDR & 0xF000) >> 12; + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(20); + + + GPIOD->ODR = ((display_status & 0xF0) << 8); + + HAL_Delay(50); + } while (((display_status & 0x80) || ((display_status & 0x7F) != 0)) && attempts_left--); + + if (!((display_status & 0x80) || ((display_status & 0x7F) != 0))) + break; + + GPIOD->ODR = 0x0U; + GPIOE->ODR = 0x0U; + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(20); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(20); + + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(20); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(20); + + GPIOE->MODER |= 0x55000000U; + + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(20); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(20); + + DISPLAY_INSTRUCT_BYTE(0x01); + + HAL_Delay(500); + } + + GPIOD->ODR = 0x0U; + + GPIOE->ODR = 0x0U; + + /* + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(1); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(1); + + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(1); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(1); + */ + + GPIOE->MODER |= 0x55000000U; + + + + // init display + /* + GPIOE->BSRR = DISPLAY_ENA; + HAL_Delay(1); + GPIOE->BSRR = (DISPLAY_ENA << 16); + HAL_Delay(1); + */ + + + // reset (supposedly) + DISPLAY_INSTRUCT_BYTE(0x01); + + // switch to 4-bit 2-line mode + DISPLAY_INSTRUCT_BYTE(0x28); + + // write characters + char a[] = "Well, hi there!"; + for (int i = 0; i < sizeof(a)-1; i++) { + DISPLAY_DATA_BYTE(a[i]); + } + + // next line + DISPLAY_INSTRUCT_BYTE(0xC0); + + // write more characters + char b[] = "I'm doing it!"; + for (int i = 0; i < sizeof(b)-1; i++) { + DISPLAY_DATA_BYTE(b[i]); + } + + GPIOE->ODR = 0x0U; + UPDATE_STATUS; + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; +/* USER CODE BEGIN MX_GPIO_Init_1 */ +/* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12 + |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET); + + /*Configure GPIO pins : PE7 PE10 PE11 PE12 + PE13 PE14 PE15 */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12 + |GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /*Configure GPIO pins : PD12 PD13 PD14 PD15 */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + +/* USER CODE BEGIN MX_GPIO_Init_2 */ +/* USER CODE END MX_GPIO_Init_2 */ +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* 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 Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* 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 6 */ +} +#endif /* USE_FULL_ASSERT */