/* USER CODE BEGIN header */
/**
  ******************************************************************************
  * @file    main.c  
  * @author  YSPRING Application Team
  * @version 1.0.0
  * @date    2023.3.20
  * @brief   Main program
  ******************************************************************************
  * @attention
  ******************************************************************************
  */
/* USER CODE END header */
#include "ys32f030.h"
#include "main.h"
#include "delay.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN includes */

/* USER CODE END includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN typedef */

/* USER CODE END typedef */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN macro */

/* USER CODE END macro */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN variables */

/* USER CODE END variables */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN prototypes */

/* USER CODE END prototypes */

/* Private user code ---------------------------------------------------------*/
// RCC initialization configuration
void RCC_Configuration(void)
{
  FLASH_SetLatency(FLASH_Latency_3);
  // Enable LSI
  RCC_LSICmd(ENABLE);
  RCC_HSI_CLK(RCC_HSI_24M, RCC_HSI_CLK_Div1);
  while( RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);

  // HCLK = 24 MHz
  RCC_HCLKConfig(RCC_SYSCLK_Div1);

  RCC_SYSCLKConfig(RCC_SOURCE_HSI);
  while (RCC_GetSYSCLKSource() != RCC_SOURCE_HSI);

  FLASH_SetLatency(FLASH_Latency_1);

  // PCLK = 24 MHz
  RCC_PCLKConfig(RCC_HCLK_Div1);

  // SYSCLK = 24 MHz
  SystemCoreClockUpdate();
}

// GPIO 初始化配置
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_StructInit(&GPIO_InitStructure);

  GPIO_DeInit(GPIOA);
  GPIO_DeInit(GPIOB);

  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, ENABLE);

  // LED0
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED1
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED2
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED3
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED4
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED5
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED6
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED7
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // LED8
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_7);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_VeryHigh;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// LED 初始化配置
void LED_Configuration(void)
{
  LED_InitTypeDef LED_InitStruct;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_LED, ENABLE);

  LED_DeInit();
  LED_StructInit(&LED_InitStruct);
  
  LED_InitStruct.LED_ClkDiv =0;
  LED_InitStruct.LED_OnTime1 =10;
  LED_InitStruct.LED_OnTime0 =255;
  LED_InitStruct.LED_ScanFirst = LED_ScanFirst_0;
  LED_Init(&LED_InitStruct);
  LED_ScanModeConfig(LED_ScanMode_LOOP); 
  LED_ArrayModeConfig(LED_ArrayMode_8X8);
  LED_SetOnPeriodTime(0xFFFFFFFF, 0xFFFFFFFF);
  LED_SetOnArray(0xFFFFFFFF, 0xFFFFFFFF);
  LED_Cmd(ENABLE);
}


/* USER CODE BEGIN 0 */
volatile const uint32_t g_mode __attribute__((at(0x08000200))) = LED_ArrayMode_8X8; 
volatile const uint8_t g_bright __attribute((section(".ARM.__AT_0x08000204"))) = 1;  // 0~255
/* USER CODE END 0 */

int main(void)
{
  RCC_Configuration();
  GPIO_Configuration();
  LED_Configuration();

  /* USER CODE BEGIN 1 */
  uint32_t current_mode = LED_ArrayMode_8X8;
  uint32_t current_bright = 0;
  /* USER CODE END 1 */

  while(1)
  {
    /* USER CODE BEGIN while */
    if(current_mode != g_mode)
    {
      LED_ArrayModeConfig(g_mode);
      LED_Cmd(ENABLE);
      
      current_mode = g_mode;
    }

    if(current_bright != g_bright)
    {
      uint32_t LED_OnTime1 = g_bright;
      uint32_t LED_OnTime0 = 255 - g_bright;
      
      LED->OTCR = (LED_OnTime1 << 8) | LED_OnTime0;
      LED_Cmd(ENABLE);
      
      current_bright = g_bright;
    }
    /* USER CODE END while */
  }
}

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */
