Browse Source

Transfer GPIO Init to board module.

Vladimir N. Shilov 3 years ago
parent
commit
aa77a90926
4 changed files with 98 additions and 50 deletions
  1. 3 0
      Inc/board.h
  2. 88 10
      Src/board.c
  3. 2 33
      Src/main.c
  4. 5 7
      Src/stm32g0xx_it.c

+ 3 - 0
Inc/board.h

@@ -108,6 +108,9 @@
 #define UART_ST_Pin GPIO_PIN_15
 
 /* Variables */
+#ifndef __ARMCC_VERSION
+uint32_t SystemCoreClock;
+#endif
 
 /* Expoted funcions */
 void SystemClock_Config(void);

+ 88 - 10
Src/board.c

@@ -4,6 +4,8 @@
 #include "stm32g0xx_ll_gpio.h"
 #include "stm32g0xx_ll_usart.h"
 
+/* private variables */
+
 /* private functions */
 static void TIM1_Init(void);
 static void TIM3_Init(void);
@@ -11,15 +13,35 @@ static void TIM14_Init(void);
 static void TIM16_Init(void);
 static void TIM17_Init(void);
 static void USART1_UART_Init(void);
+static void GPIO_Init(void);
 
 /* Board perephireal Configuration  */
 void Board_Init(void)
 {
+  RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;
+  RCC->APBENR1 |= RCC_APBENR1_PWREN;
+
+  /* Peripheral interrupt init*/
+  /* RCC_IRQn interrupt configuration */
+  NVIC_SetPriority(RCC_IRQn, 0);
+  NVIC_EnableIRQ(RCC_IRQn);
+
+  /* Configure the system clock */
+  SystemClock_Config();
+
+  /* Processor uses sleep as its low power mode */
+  SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
+  /* DisableSleepOnExit */
+  SCB->SCR &= ~((uint32_t)SCB_SCR_SLEEPONEXIT_Msk);
+
+  /* Initialize all configured peripherals */
+  GPIO_Init();
+
   /* Start RGB & Tube Power PWM */
-	TIM1_Init();
+  TIM1_Init();
   TIM3_Init();
 
-	//TIM14_Init();
+  //TIM14_Init();
 
   //TIM16_Init();
   //TIM17_Init();
@@ -63,14 +85,6 @@ void SystemClock_Config(void)
   //RCC->CFGR &= RCC_CFGR_PPRE;
   //RCC->CFGR |= 0x00000000U;
 
-#ifdef USES_SYSTICK
-  /* Configure the SysTick to have interrupt in 1ms time base */
-  SysTick->LOAD  = (uint32_t)((24000000 / 1000) - 1UL);  /* set reload register */
-  SysTick->VAL   = 0UL;                                  /* Load the SysTick Counter Value */
-  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
-                   SysTick_CTRL_ENABLE_Msk;              /* Enable the Systick Timer */
-#endif
-
   /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
   SystemCoreClock = 24000000;
 
@@ -79,6 +93,70 @@ void SystemClock_Config(void)
   RCC->CCIPR |= RCC_CCIPR_I2C1SEL_1;
 }
 
+/**
+  * @brief GPIO Initialization Function
+  * @param None
+  * @retval None
+  */
+static void GPIO_Init(void)
+{
+  /* GPIO Ports Clock Enable */
+	RCC->IOPENR |= (RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN | RCC_IOPENR_GPIOCEN);
+
+  /* EXTI Line: falling, no pull, input */
+  // mode
+  EXTI->EMR1 &= ~(EXTI_IMR1_IM14);
+  EXTI->EMR1 |= EXTI_IMR1_IM14;
+  // TRIGGER FALLING
+  EXTI->FTSR1 &= ~(EXTI_IMR1_IM14);
+  EXTI->FTSR1 |= EXTI_IMR1_IM14;
+  // ?
+  EXTI->FTSR1 |= EXTI_IMR1_IM14;
+
+  /* EXTI interrupt init*/
+  NVIC_SetPriority(EXTI4_15_IRQn, 0);
+  NVIC_EnableIRQ(EXTI4_15_IRQn);
+
+  /* L0, L1, L2, L3 - IN-15 symbols control, PP out, high speed, pull down */
+  GPIO_SetPinMode(LC0_GPIO_Port, LC0_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinSpeed(LC0_GPIO_Port, LC0_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(LC0_GPIO_Port, LC0_Pin, GPIO_PUPDR_DW);
+
+  GPIO_SetPinMode(LC1_GPIO_Port, LC1_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinSpeed(LC1_GPIO_Port, LC1_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(LC1_GPIO_Port, LC1_Pin, GPIO_PUPDR_DW);
+
+  GPIO_SetPinMode(LC2_GPIO_Port, LC2_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinSpeed(LC2_GPIO_Port, LC2_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(LC2_GPIO_Port, LC2_Pin, GPIO_PUPDR_DW);
+
+  GPIO_SetPinMode(LC3_GPIO_Port, LC3_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinSpeed(LC3_GPIO_Port, LC3_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(LC3_GPIO_Port, LC3_Pin, GPIO_PUPDR_DW);
+
+  /* Pwer Shutdown: PP out, high speed, pull down */
+  GPIO_SetPinMode(SHDN_GPIO_Port, SHDN_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinSpeed(SHDN_GPIO_Port, SHDN_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(SHDN_GPIO_Port, SHDN_Pin, GPIO_PUPDR_DW);
+
+  /* SPI Latch: OD out, high speed, no pull */
+  GPIO_SetPinMode(Latch_GPIO_Port, Latch_Pin, GPIO_MODE_OUT);
+  GPIO_SetPinOutputType(Latch_GPIO_Port, Latch_Pin, GPIO_OTYPE_OD);
+  GPIO_SetPinSpeed(Latch_GPIO_Port, Latch_Pin, GPIO_OSPEED_HI);
+
+  /* UART_Enable: PP out, low speed, no pull*/
+  GPIO_SetPinMode(UART_EN_GPIO_Port, UART_EN_Pin, GPIO_MODE_OUT);
+
+  /* UART_State: input, pull up */
+  GPIO_SetPinPull(UART_ST_GPIO_Port, UART_ST_Pin, GPIO_PUPDR_UP);
+
+  /* BTN1, BTN2, BTN3, BTN4: input, pull up */
+  GPIO_SetPinPull(BTN1_GPIO_Port, BTN1_Pin, GPIO_PUPDR_UP);
+  GPIO_SetPinPull(BTN2_GPIO_Port, BTN2_Pin, GPIO_PUPDR_UP);
+  GPIO_SetPinPull(BTN3_GPIO_Port, BTN3_Pin, GPIO_PUPDR_UP);
+  GPIO_SetPinPull(BTN4_GPIO_Port, BTN4_Pin, GPIO_PUPDR_UP);
+}
+
 /**
   * @brief TIM1 Initialization Function
   * @param None

+ 2 - 33
Src/main.c

@@ -114,36 +114,8 @@ static void Color_RGB(uint8_t r, uint8_t g, uint8_t b);
   */
 int main(void)
 {
-  /* USER CODE BEGIN 1 */
-
-  /* USER CODE END 1 */
-
-  /* MCU Configuration--------------------------------------------------------*/
-
-  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
-
-  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
-  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
-
-  /* System interrupt init*/
-
-  /* Peripheral interrupt init*/
-  /* RCC_IRQn interrupt configuration */
-  NVIC_SetPriority(RCC_IRQn, 0);
-  NVIC_EnableIRQ(RCC_IRQn);
-
-  /* USER CODE BEGIN Init */
-
-  /* USER CODE END Init */
-
-  /* Configure the system clock */
-  SystemClock_Config();
-
-  /* USER CODE BEGIN SysInit */
-  LL_LPM_EnableSleep();
-  LL_LPM_DisableSleepOnExit();
-//  LL_RCC_GetSystemClocksFreq(&rcc_clocks);
-  /* USER CODE END SysInit */
+  /* Initialize onBoard Hardware */
+  Board_Init();
 
   /* Initialize all configured peripherals */
   MX_GPIO_Init();
@@ -151,9 +123,6 @@ int main(void)
   MX_I2C1_Init();
   MX_SPI1_Init();
   /* USER CODE BEGIN 2 */
-  /* Initialize onBoard Hardware */
-  Board_Init();
-
   /* Initialize Scheduler */
   RTOS_Init();
 

+ 5 - 7
Src/stm32g0xx_it.c

@@ -146,16 +146,14 @@ void SysTick_Handler(void)
 /**
   * @brief This function handles EXTI line 4 to 15 interrupts.
   */
-void EXTI4_15_IRQHandler(void)
+void __attribute__((optimize("O0"))) EXTI4_15_IRQHandler(void)
 {
   /* USER CODE BEGIN EXTI4_15_IRQn 0 */
-  //if ((EXTI->RPR1 & 1<<14) != 0)
-  /* USER CODE END EXTI4_15_IRQn 0 */
-  if (LL_EXTI_IsActiveRisingFlag_0_31(LL_EXTI_LINE_14) != RESET)
+  if ((EXTI->FPR1 & EXTI_IMR1_IM14) != 0)
   {
-    LL_EXTI_ClearRisingFlag_0_31(LL_EXTI_LINE_14);
-    /* USER CODE BEGIN LL_EXTI_LINE_14_RISING */
-    //EXTI->RPR1 = 1<<14;
+  /* USER CODE END EXTI4_15_IRQn 0 */
+    /* USER CODE BEGIN LL_EXTI_LINE_14_FALING */
+    EXTI->FPR1 = EXTI_IMR1_IM14;
     Flag.RTC_IRQ = 1;
 
     ES_PlaceEvent(evNewSecond);