stm32h750/bootloader/main.c

136 lines
4.2 KiB
C

#include "led.h"
#include "uart_log.h"
#include "ltimer.h"
#include "qspi_flash.h"
#include "stdio.h"
void system_init(void)
{
/* Enable I-Cache */
SCB_EnableICache();
/* Enable D-Cache */
SCB_EnableDCache();
/* STM32H7xx HAL library initialization:
- Configure the Systick to generate an interrupt each 1 msec
- Set NVIC Group Priority to 4
- Low Level Initialization
*/
HAL_Init();
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitTypeDef RCC_OscInitStruct;
HAL_StatusTypeDef ret = HAL_OK;
/*!< Supply configuration update enable */
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /* PWR set to LDO for the STM32H750B-DISCO board */
/* The voltage scaling allows optimizing the power consumption when the device is
clocked below the maximum system frequency, to update the voltage scaling value
regarding system frequency refer to product datasheet. */
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/* Enable HSE Oscillator and activate PLL with HSE as source */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5;
RCC_OscInitStruct.PLL.PLLN = 160;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLQ = 4;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
if(ret != HAL_OK) {
while(1);
}
/* Select PLL as system clock source and configure bus clocks dividers */
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \
RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
if(ret != HAL_OK) {
while(1);
}
led_init(LED_PIN);
uart_log_init();
ltimer_init();
qspi_flash_init(3); /* 200MHz / (3 + 1) = 50MHz */
}
void led_blink(void)
{
led_on(LED_PIN);
led_off(LED_PIN);
}
uint8_t data[256];
int main(void)
{
uint32_t ret;
system_init();
printf("Run start ...\r\n");
printf("SystemCoreClock = %ld\r\n", SystemCoreClock);
printf("SystemD2Clock = %ld\r\n", SystemD2Clock);
ret = qspi_flash_erase_4kbytes(0);
if (ret) {
printf("qspi_flash_erase_4k error: 0x%08lX\r\n", ret);
} else {
printf("qspi_flash_erase_4k ok\r\n");
}
for (uint32_t i = 0; i < sizeof(data); i++) {
data[i] = (uint8_t)(i & 0xFF);
}
ret = qspi_flash_write(0, data, sizeof(data));
if (ret) {
printf("qspi_flash_write error: 0x%08lX\r\n", ret);
} else {
printf("qspi_flash_write ok\r\n");
}
while (1) {
uint64_t ms;
ms = ltimer_get_ms();
printf("Hello World, ms = %llu, tick = %ld\r\n", ms, HAL_GetTick());
ret = qspi_flash_read(0, data, 30);
if (ret) {
printf("qspi_flash_read error: 0x%08lX\r\n", ret);
} else {
printf("qspi_flash_read ok\r\n");
for (uint32_t i = 0; i < sizeof(data); i++) {
if (i % 16 == 0) {
printf("\r\n");
}
printf("%02X ", data[i]);
}
}
led_blink();
ltimer_delay_ms(1000);
}
return 0;
}