47SPI_HandleTypeDef hspi1;
49TIM_HandleTypeDef htim1;
50TIM_HandleTypeDef htim2;
52UART_HandleTypeDef huart1;
59void SystemClock_Config(
void);
60static void MX_GPIO_Init(
void);
61static void MX_SPI1_Init(
void);
62static void MX_TIM1_Init(
void);
63static void MX_TIM2_Init(
void);
64static void MX_USART1_UART_Init(
void);
73#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
77 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
83#ifdef TOUCH_CALIBRATION_ENABLE
106 if (HAL_UART_Receive_IT(huart, (uint8_t *)&
uartRxChar, 1) != HAL_OK)
121 if (HAL_UART_Receive_IT(huart, (uint8_t *)&
uartRxChar, 1) != HAL_OK)
151 SystemClock_Config();
162 MX_USART1_UART_Init();
165 printf(
"\x1b[2J\x1b[H");
166 printf(
"Starting Initialization Process\r\n");
177#ifdef TOUCH_CALIBRATION_ENABLE
182 printf(
"Calibration Complete\r\n");
197 printf(
"Start Tests\r\n");
214void SystemClock_Config(
void)
216 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
217 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
221 __HAL_RCC_PWR_CLK_ENABLE();
222 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
227 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
228 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
229 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
230 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
231 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
232 RCC_OscInitStruct.PLL.PLLM = 8;
233 RCC_OscInitStruct.PLL.PLLN = 180;
234 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
235 RCC_OscInitStruct.PLL.PLLQ = 4;
236 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
243 if (HAL_PWREx_EnableOverDrive() != HAL_OK)
250 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
251 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
252 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
253 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
254 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
255 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
257 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
268static void MX_SPI1_Init(
void)
279 hspi1.Instance = SPI1;
280 hspi1.Init.Mode = SPI_MODE_MASTER;
281 hspi1.Init.Direction = SPI_DIRECTION_2LINES;
282 hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
283 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
284 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
285 hspi1.Init.NSS = SPI_NSS_SOFT;
286 hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
287 hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
288 hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
289 hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
290 hspi1.Init.CRCPolynomial = 10;
291 if (HAL_SPI_Init(&hspi1) != HAL_OK)
306static void MX_TIM1_Init(
void)
313 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
314 TIM_MasterConfigTypeDef sMasterConfig = {0};
319 htim1.Instance = TIM1;
320 htim1.Init.Prescaler = 180-1;
321 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
322 htim1.Init.Period = 65535;
323 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
324 htim1.Init.RepetitionCounter = 0;
325 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
326 if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
330 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
331 if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
335 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
336 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
337 if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
352static void MX_TIM2_Init(
void)
359 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
360 TIM_MasterConfigTypeDef sMasterConfig = {0};
365 htim2.Instance = TIM2;
366 htim2.Init.Prescaler = 90-1;
367 htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
368 htim2.Init.Period = 4294967295;
369 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
370 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
371 if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
375 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
376 if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
380 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
381 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
382 if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
397static void MX_USART1_UART_Init(
void)
407 huart1.Instance = USART1;
408 huart1.Init.BaudRate = 19200;
409 huart1.Init.WordLength = UART_WORDLENGTH_8B;
410 huart1.Init.StopBits = UART_STOPBITS_1;
411 huart1.Init.Parity = UART_PARITY_NONE;
412 huart1.Init.Mode = UART_MODE_TX_RX;
413 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
414 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
415 if (HAL_UART_Init(&huart1) != HAL_OK)
430static void MX_GPIO_Init(
void)
432 GPIO_InitTypeDef GPIO_InitStruct = {0};
438 __HAL_RCC_GPIOC_CLK_ENABLE();
439 __HAL_RCC_GPIOH_CLK_ENABLE();
440 __HAL_RCC_GPIOA_CLK_ENABLE();
441 __HAL_RCC_GPIOB_CLK_ENABLE();
444 HAL_GPIO_WritePin(GPIOB, MB85RS64_CS_Pin|RA8875_CS_Pin, GPIO_PIN_SET);
447 HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_RESET);
450 GPIO_InitStruct.Pin = MB85RS64_CS_Pin|RA8875_CS_Pin;
451 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
452 GPIO_InitStruct.Pull = GPIO_PULLUP;
453 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
454 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
457 GPIO_InitStruct.Pin = LCD_RESET_Pin;
458 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
459 GPIO_InitStruct.Pull = GPIO_NOPULL;
460 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
461 HAL_GPIO_Init(LCD_RESET_GPIO_Port, &GPIO_InitStruct);
477void _Error_Handler(
const char *file,
int line)
481#ifdef REDIRECT_PRINTF
484 snprintf(buf,
sizeof(buf),
485 "Trapped in _Error_Handler(). Called from: %s, line: %d\r\n",
499#ifdef USE_FULL_ASSERT
507void assert_failed(uint8_t *file, uint32_t line)
518#ifdef REDIRECT_PRINTF
522 snprintf(buf,
sizeof(buf),
523 "assert_param failed: file %s, line %lu\r\n",
524 (
char *)file, (
unsigned long)line);
C-callable entry points into the C++ RA8875 display code.
bool initTouchCalibration(void)
Reads the touch calibration stored in the FRAM and reports it on the redirected USART.
void testFRAM(void)
Shows that the FRAM keeps its data, then does a write and read-back test.
void testLCD(bool buildTest)
Runs one of the two display demonstrations.
void initTest(SPI_HandleTypeDef *halSPI)
Creates the display object and starts the RA8875 controller.
void initFRAM(SPI_HandleTypeDef *halSPI)
Creates the FRAM driver object and checks that the chip answers.
void testTouch(UART_HandleTypeDef *huart)
Enables touch, runs the three-point calibration and shows the result.
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
UART error callback (overrun, noise, framing or parity error).
volatile uint8_t uartRxChar
The one character the interrupt receive is currently waiting for.
volatile uint8_t uartKeyPressed
Set by HAL_UART_RxCpltCallback(): 0 = no key yet, otherwise ' ' (space) or 0x1B (Esc).
int main(void)
The application entry point.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
UART receive-complete callback, called by the HAL from the USART interrupt.
: Header for main.c file. This file contains the common defines of the application.