Browse Source

Begin create board module.

Vladimir N. Shilov 3 years ago
parent
commit
b4b765b6cf
9 changed files with 620 additions and 144 deletions
  1. 119 0
      Inc/board.h
  2. 83 27
      Inc/gpio.h
  3. 1 74
      Inc/main.h
  4. 35 11
      MDK-ARM/MNC-IN12x5.uvoptx
  5. 10 0
      MDK-ARM/MNC-IN12x5.uvprojx
  6. 11 0
      MNC-IN12x5.cbp
  7. 1 0
      Makefile
  8. 350 0
      Src/board.c
  9. 10 32
      Src/stm32g0xx_it.c

+ 119 - 0
Inc/board.h

@@ -0,0 +1,119 @@
+#pragma once
+
+#ifndef _BOARD_H
+#define _BOARD_H
+
+/* Includes */
+#include "stm32g0xx.h"
+#include "gpio.h"
+
+/* Exported macros */
+#define LATCH_DOWN    GPIOC->BRR = 0x40
+#define LATCH_UP      GPIOC->BSRR = 0x40
+
+#define TUBE_PWR_ON   GPIOA->BRR = 0x10
+#define TUBE_PWR_OFF  GPIOA->BSRR = 0x10
+
+#define TUBE_A_ON     TIM1->CCER |= (TIM_CCER_CC1E)
+#define TUBE_B_ON     TIM3->CCER |= (TIM_CCER_CC4E)
+#define TUBE_C_ON     TIM3->CCER |= (TIM_CCER_CC3E)
+#define TUBE_D_ON     TIM3->CCER |= (TIM_CCER_CC2E)
+#define TUBE_E_ON     TIM3->CCER |= (TIM_CCER_CC1E)
+#define TUBE_BCDE_ON	 TIM3->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)
+#define TUBE_ALL_ON		 TUBE_A_ON; TUBE_BCDE_ON
+
+#define TUBE_A_OFF    TIM1->CCER &= ~(TIM_CCER_CC1E)
+#define TUBE_B_OFF    TIM3->CCER &= ~(TIM_CCER_CC4E)
+#define TUBE_C_OFF    TIM3->CCER &= ~(TIM_CCER_CC3E)
+#define TUBE_D_OFF    TIM3->CCER &= ~(TIM_CCER_CC2E)
+#define TUBE_E_OFF    TIM3->CCER &= ~(TIM_CCER_CC1E)
+
+#define IN15_P        GPIOA->BSRR = 0x1
+#define IN15_Plus     GPIOA->BSRR = 0x2
+#define IN15_Minus    GPIOA->BSRR = 0x4
+#define IN15_Percent  GPIOA->BSRR = 0x8
+#define IN15_OFF      GPIOA->BRR = 0xF
+
+#define COLOR_R(x)    TIM1->CCR2 = x
+#define COLOR_G(x)    TIM1->CCR3 = x
+#define COLOR_B(x)    TIM1->CCR4 = x
+
+/* Constants */
+#define PWM_LED_INIT_VAL    500
+#define PWM_TUBE_INIT_VAL   500
+
+#define TIM1_PSC            (120 - 1)
+#define TIM1_ARR            (1000 - 1)
+
+#define TIM3_PSC            (120 - 1)
+#define TIM3_ARR            (1000 - 1)
+
+#define TIM14_PSC            (24000 - 1)
+#define TIM14_ARR            (1000 - 1)
+#define TIM14_PULSE_VAL       750
+
+#define TIM16_PSC            (24 - 1)
+#define TIM16_ARR            (1000 - 1)
+
+#define TIM17_PSC            (24 - 1)
+#define TIM17_ARR            (1000 - 1)
+
+/* Defines */
+#define BTN1_GPIO_Port GPIOB
+#define BTN1_Pin GPIO_PIN_2
+#define BTN2_GPIO_Port GPIOA
+#define BTN2_Pin GPIO_PIN_12
+#define BTN3_GPIO_Port GPIOB
+#define BTN3_Pin GPIO_PIN_4
+#define BTN4_GPIO_Port GPIOA
+#define BTN4_Pin GPIO_PIN_5
+#define IRQ_EXTI_IRQn EXTI4_15_IRQn
+#define IRQ_GPIO_Port GPIOC
+#define IRQ_Pin GPIO_PIN_14
+#define Latch_GPIO_Port GPIOC
+#define Latch_Pin GPIO_PIN_6
+#define LC0_GPIO_Port GPIOA
+#define LC0_Pin GPIO_PIN_0
+#define LC1_GPIO_Port GPIOA
+#define LC1_Pin GPIO_PIN_1
+#define LC2_GPIO_Port GPIOA
+#define LC2_Pin GPIO_PIN_2
+#define LC3_GPIO_Port GPIOA
+#define LC3_Pin GPIO_PIN_3
+#define PWM_1_GPIO_Port GPIOA
+#define PWM_1_Pin GPIO_PIN_8
+#define PWM_2_GPIO_Port GPIOB
+#define PWM_2_Pin GPIO_PIN_1
+#define PWM_3_GPIO_Port GPIOB
+#define PWM_3_Pin GPIO_PIN_0
+#define PWM_4_GPIO_Port GPIOA
+#define PWM_4_Pin GPIO_PIN_7
+#define PWM_5_GPIO_Port GPIOA
+#define PWM_5_Pin GPIO_PIN_6
+#define PWM_B_GPIO_Port GPIOA
+#define PWM_B_Pin GPIO_PIN_10
+#define PWM_G_GPIO_Port GPIOA
+#define PWM_G_Pin GPIO_PIN_11
+#define PWM_R_GPIO_Port GPIOA
+#define PWM_R_Pin GPIO_PIN_9
+#define SHDN_GPIO_Port GPIOA
+#define SHDN_Pin GPIO_PIN_4
+#define SWCLK_GPIO_Port GPIOA
+#define SWCLK_Pin GPIO_PIN_14
+#define SWDIO_GPIO_Port GPIOA
+#define SWDIO_Pin GPIO_PIN_13
+#define UART_EN_GPIO_Port GPIOC
+#define UART_EN_Pin GPIO_PIN_15
+#define UART_ST_GPIO_Port GPIOA
+#define UART_ST_Pin GPIO_PIN_15
+
+/* Variables */
+uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
+
+/* Expoted funcions */
+void SystemClock_Config(void);
+void Board_Init();
+void Blink_Start(void);
+void Blink_Stop(void);
+
+#endif

+ 83 - 27
Inc/gpio.h

@@ -3,6 +3,8 @@
 #ifndef _GPIO_H
 #ifndef _GPIO_H
 #define _GPIO_H
 #define _GPIO_H
 
 
+#include "stm32g0xx.h"
+
 /* x = A to F */
 /* x = A to F */
 
 
 /* GPIO port mode register (GPIOx_MODER) */
 /* GPIO port mode register (GPIOx_MODER) */
@@ -22,10 +24,10 @@
 #define GPIO_OSPEED_VH  0x3
 #define GPIO_OSPEED_VH  0x3
 
 
 /* GPIO port pull-up/pull-down register (GPIOx_PUPDR) */
 /* GPIO port pull-up/pull-down register (GPIOx_PUPDR) */
-#define GPIO_PUPD_NO    0x0
-#define GPIO_PUPD_UP    0x1
-#define GPIO_PUPD_DW    0x2
-#define GPIO_PUPD_NN    0x3
+#define GPIO_PUPDR_NO   0x0
+#define GPIO_PUPDR_UP   0x1
+#define GPIO_PUPDR_DW   0x2
+#define GPIO_PUPDR_NN   0x3
 
 
 /* GPIO port input data register (GPIOx_IDR) */
 /* GPIO port input data register (GPIOx_IDR) */
 
 
@@ -37,28 +39,82 @@
 
 
 /* GPIO port configuration lock register (GPIOx_LCKR) */
 /* GPIO port configuration lock register (GPIOx_LCKR) */
 
 
-/* GPIO alternate function low register (GPIOx_AFRL) for pin 0..7 */
-#define GPIO_AFRL_AF0   0x0
-#define GPIO_AFRL_AF1   0x1
-#define GPIO_AFRL_AF2   0x2
-#define GPIO_AFRL_AF3   0x3
-#define GPIO_AFRL_AF4   0x4
-#define GPIO_AFRL_AF5   0x5
-#define GPIO_AFRL_AF6   0x6
-#define GPIO_AFRL_AF7   0x7
-
-/* GPIO alternate function high register (GPIOx_AFRH) for pin 0..7 */
-#define GPIO_AFRH_AF0   0x0
-#define GPIO_AFRH_AF1   0x1
-#define GPIO_AFRH_AF2   0x2
-#define GPIO_AFRH_AF3   0x3
-#define GPIO_AFRH_AF4   0x4
-#define GPIO_AFRH_AF5   0x5
-#define GPIO_AFRH_AF6   0x6
-#define GPIO_AFRH_AF7   0x7
-
-/* PORT = GPIOA..GPIOF, PIN = 0..15 */
-#define GPIO_PIN_SET(PORT, PIN)    PORT->BSRR = (1<<PIN)
-#define GPIO_PIN_RES(PORT, PIN)    PORT->BRR = (1<<PIN)
+/* GPIO alternate function high/low register (GPIOx_AFRL/GPIOx_AFRH) for pin 0..7/8..15 */
+#define GPIO_AF_0   	0x0
+#define GPIO_AF_1   	0x1
+#define GPIO_AF_2   	0x2
+#define GPIO_AF_3   	0x3
+#define GPIO_AF_4   	0x4
+#define GPIO_AF_5   	0x5
+#define GPIO_AF_6   	0x6
+#define GPIO_AF_7   	0x7
+
+/* PORT = GPIOA..GPIOF, PIN = (1<<0..15) */
+#define GPIO_PIN_SET(PORT, PIN)    ((PORT->BSRR) = (PIN))
+#define GPIO_PIN_RES(PORT, PIN)    ((PORT->BRR) = (PIN))
+
+/* Bits definition for GPIO PINs */
+#define GPIO_PIN_0    0x0001
+#define GPIO_PIN_1    0x0002
+#define GPIO_PIN_2    0x0004
+#define GPIO_PIN_3    0x0008
+#define GPIO_PIN_4    0x0010
+#define GPIO_PIN_5    0x0020
+#define GPIO_PIN_6    0x0040
+#define GPIO_PIN_7    0x0080
+#define GPIO_PIN_8    0x0100
+#define GPIO_PIN_9    0x0200
+#define GPIO_PIN_10   0x0400
+#define GPIO_PIN_11   0x0800
+#define GPIO_PIN_12   0x1000
+#define GPIO_PIN_13   0x2000
+#define GPIO_PIN_14   0x4000
+#define GPIO_PIN_15   0x8000
+
+/* Bits definition for x32 GPIO PINs */
+#define GPIO32_PIN_0    0x00000001
+#define GPIO32_PIN_1    0x00000004
+#define GPIO32_PIN_2    0x00000010
+#define GPIO32_PIN_3    0x00000040
+#define GPIO32_PIN_4    0x00000100
+#define GPIO32_PIN_5    0x00000400
+#define GPIO32_PIN_6    0x00001000
+#define GPIO32_PIN_7    0x00004000
+#define GPIO32_PIN_8    0x00010000
+#define GPIO32_PIN_9    0x00040000
+#define GPIO32_PIN_10   0x00100000
+#define GPIO32_PIN_11   0x00400000
+#define GPIO32_PIN_12   0x01000000
+#define GPIO32_PIN_13   0x04000000
+#define GPIO32_PIN_14   0x10000000
+#define GPIO32_PIN_15   0x40000000
+
+
+/* functions from stm32g0xx_ll_gpio.h */
+static inline void GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) {
+  MODIFY_REG(GPIOx->MODER, ((Pin * Pin) * GPIO_MODER_MODE0), ((Pin * Pin) * Mode));
+}
+
+static inline void GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) {
+  MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType));
+}
+
+static inline void GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t  Speed) {
+  MODIFY_REG(GPIOx->OSPEEDR, ((Pin * Pin) * GPIO_OSPEEDR_OSPEED0), ((Pin * Pin) * Speed));
+}
+
+static inline void GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) {
+  MODIFY_REG(GPIOx->PUPDR, ((Pin * Pin) * GPIO_PUPDR_PUPD0), ((Pin * Pin) * Pull));
+}
+
+static inline void GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) {
+  MODIFY_REG(GPIOx->AFR[0], ((((Pin * Pin) * Pin) * Pin) * GPIO_AFRL_AFSEL0),
+             ((((Pin * Pin) * Pin) * Pin) * Alternate));
+}
+
+static inline void GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) {
+  MODIFY_REG(GPIOx->AFR[1], (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * GPIO_AFRH_AFSEL8),
+             (((((Pin >> 8U) * (Pin >> 8U)) * (Pin >> 8U)) * (Pin >> 8U)) * Alternate));
+}
 
 
 #endif
 #endif

+ 1 - 74
Inc/main.h

@@ -49,6 +49,7 @@ extern "C" {
 
 
 /* Private includes ----------------------------------------------------------*/
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
 /* USER CODE BEGIN Includes */
+#include "board.h"
 #include "gpio.h"
 #include "gpio.h"
 #include "i2c.h"
 #include "i2c.h"
 #include "ds3231.h"
 #include "ds3231.h"
@@ -124,33 +125,6 @@ typedef union {
 
 
 /* Exported macro ------------------------------------------------------------*/
 /* Exported macro ------------------------------------------------------------*/
 /* USER CODE BEGIN EM */
 /* USER CODE BEGIN EM */
-#define LATCH_DOWN    GPIOC->BRR = 0x40
-#define LATCH_UP      GPIOC->BSRR = 0x40
-
-#define TUBE_PWR_ON   GPIOA->BRR = 0x10
-#define TUBE_PWR_OFF  GPIOA->BSRR = 0x10
-
-#define TUBE_A_ON     TIM1->CCER |= (TIM_CCER_CC1E)
-#define TUBE_B_ON     TIM3->CCER |= (TIM_CCER_CC4E)
-#define TUBE_C_ON     TIM3->CCER |= (TIM_CCER_CC3E)
-#define TUBE_D_ON     TIM3->CCER |= (TIM_CCER_CC2E)
-#define TUBE_E_ON     TIM3->CCER |= (TIM_CCER_CC1E)
-
-#define TUBE_A_OFF    TIM1->CCER &= ~(TIM_CCER_CC1E)
-#define TUBE_B_OFF    TIM3->CCER &= ~(TIM_CCER_CC4E)
-#define TUBE_C_OFF    TIM3->CCER &= ~(TIM_CCER_CC3E)
-#define TUBE_D_OFF    TIM3->CCER &= ~(TIM_CCER_CC2E)
-#define TUBE_E_OFF    TIM3->CCER &= ~(TIM_CCER_CC1E)
-
-#define IN15_P        GPIOA->BSRR = 0x1
-#define IN15_Plus     GPIOA->BSRR = 0x2
-#define IN15_Minus    GPIOA->BSRR = 0x4
-#define IN15_Percent  GPIOA->BSRR = 0x8
-#define IN15_OFF      GPIOA->BRR = 0xF
-
-#define COLOR_R(x)    TIM1->CCR2 = x
-#define COLOR_G(x)    TIM1->CCR3 = x
-#define COLOR_B(x)    TIM1->CCR4 = x
 
 
 /* USER CODE END EM */
 /* USER CODE END EM */
 
 
@@ -162,53 +136,6 @@ void Error_Handler(void);
 /* USER CODE END EFP */
 /* USER CODE END EFP */
 
 
 /* Private defines -----------------------------------------------------------*/
 /* Private defines -----------------------------------------------------------*/
-#define BTN1_GPIO_Port GPIOB
-#define BTN1_Pin LL_GPIO_PIN_2
-#define BTN2_GPIO_Port GPIOA
-#define BTN2_Pin LL_GPIO_PIN_12
-#define BTN3_GPIO_Port GPIOB
-#define BTN3_Pin LL_GPIO_PIN_4
-#define BTN4_GPIO_Port GPIOA
-#define BTN4_Pin LL_GPIO_PIN_5
-#define IRQ_EXTI_IRQn EXTI4_15_IRQn
-#define IRQ_GPIO_Port GPIOC
-#define IRQ_Pin LL_GPIO_PIN_14
-#define Latch_GPIO_Port GPIOC
-#define Latch_Pin LL_GPIO_PIN_6
-#define LC0_GPIO_Port GPIOA
-#define LC0_Pin LL_GPIO_PIN_0
-#define LC1_GPIO_Port GPIOA
-#define LC1_Pin LL_GPIO_PIN_1
-#define LC2_GPIO_Port GPIOA
-#define LC2_Pin LL_GPIO_PIN_2
-#define LC3_GPIO_Port GPIOA
-#define LC3_Pin LL_GPIO_PIN_3
-#define PWM_1_GPIO_Port GPIOA
-#define PWM_1_Pin LL_GPIO_PIN_8
-#define PWM_2_GPIO_Port GPIOB
-#define PWM_2_Pin LL_GPIO_PIN_1
-#define PWM_3_GPIO_Port GPIOB
-#define PWM_3_Pin LL_GPIO_PIN_0
-#define PWM_4_GPIO_Port GPIOA
-#define PWM_4_Pin LL_GPIO_PIN_7
-#define PWM_5_GPIO_Port GPIOA
-#define PWM_5_Pin LL_GPIO_PIN_6
-#define PWM_B_GPIO_Port GPIOA
-#define PWM_B_Pin LL_GPIO_PIN_10
-#define PWM_G_GPIO_Port GPIOA
-#define PWM_G_Pin LL_GPIO_PIN_11
-#define PWM_R_GPIO_Port GPIOA
-#define PWM_R_Pin LL_GPIO_PIN_9
-#define SHDN_GPIO_Port GPIOA
-#define SHDN_Pin LL_GPIO_PIN_4
-#define SWCLK_GPIO_Port GPIOA
-#define SWCLK_Pin LL_GPIO_PIN_14
-#define SWDIO_GPIO_Port GPIOA
-#define SWDIO_Pin LL_GPIO_PIN_13
-#define UART_EN_GPIO_Port GPIOC
-#define UART_EN_Pin LL_GPIO_PIN_15
-#define UART_ST_GPIO_Port GPIOA
-#define UART_ST_Pin LL_GPIO_PIN_15
 /* USER CODE BEGIN Private defines */
 /* USER CODE BEGIN Private defines */
 
 
 /* BTNs */
 /* BTNs */

+ 35 - 11
MDK-ARM/MNC-IN12x5.uvoptx

@@ -454,6 +454,30 @@
       <RteFlg>0</RteFlg>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
       <bShared>0</bShared>
     </File>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>20</FileNumber>
+      <FileType>5</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Inc\board.h</PathWithFileName>
+      <FilenameWithoutPath>board.h</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>21</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Src\board.c</PathWithFileName>
+      <FilenameWithoutPath>board.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
   </Group>
 
 
   <Group>
   <Group>
@@ -464,7 +488,7 @@
     <RteFlg>0</RteFlg>
     <RteFlg>0</RteFlg>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -476,7 +500,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -488,7 +512,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -500,7 +524,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -512,7 +536,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -524,7 +548,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -536,7 +560,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -548,7 +572,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -560,7 +584,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -572,7 +596,7 @@
     </File>
     </File>
     <File>
     <File>
       <GroupNumber>3</GroupNumber>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -592,7 +616,7 @@
     <RteFlg>0</RteFlg>
     <RteFlg>0</RteFlg>
     <File>
     <File>
       <GroupNumber>4</GroupNumber>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 10 - 0
MDK-ARM/MNC-IN12x5.uvprojx

@@ -483,6 +483,16 @@
               <FileType>5</FileType>
               <FileType>5</FileType>
               <FilePath>..\Inc\rtos.h</FilePath>
               <FilePath>..\Inc\rtos.h</FilePath>
             </File>
             </File>
+            <File>
+              <FileName>board.h</FileName>
+              <FileType>5</FileType>
+              <FilePath>..\Inc\board.h</FilePath>
+            </File>
+            <File>
+              <FileName>board.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Src\board.c</FilePath>
+            </File>
           </Files>
           </Files>
         </Group>
         </Group>
         <Group>
         <Group>

+ 11 - 0
MNC-IN12x5.cbp

@@ -106,6 +106,7 @@
 		<Unit filename="Drivers/startup_stm32g030xx.s" />
 		<Unit filename="Drivers/startup_stm32g030xx.s" />
 		<Unit filename="Inc/bme280.h" />
 		<Unit filename="Inc/bme280.h" />
 		<Unit filename="Inc/bme280_defs.h" />
 		<Unit filename="Inc/bme280_defs.h" />
+		<Unit filename="Inc/board.h" />
 		<Unit filename="Inc/ds3231.h" />
 		<Unit filename="Inc/ds3231.h" />
 		<Unit filename="Inc/event-system.h" />
 		<Unit filename="Inc/event-system.h" />
 		<Unit filename="Inc/gpio.h" />
 		<Unit filename="Inc/gpio.h" />
@@ -120,6 +121,9 @@
 		<Unit filename="Src/bme280.c">
 		<Unit filename="Src/bme280.c">
 			<Option compilerVar="CC" />
 			<Option compilerVar="CC" />
 		</Unit>
 		</Unit>
+		<Unit filename="Src/board.c">
+			<Option compilerVar="CC" />
+		</Unit>
 		<Unit filename="Src/ds3231.c">
 		<Unit filename="Src/ds3231.c">
 			<Option compilerVar="CC" />
 			<Option compilerVar="CC" />
 		</Unit>
 		</Unit>
@@ -142,6 +146,13 @@
 			<Option compilerVar="CC" />
 			<Option compilerVar="CC" />
 		</Unit>
 		</Unit>
 		<Extensions>
 		<Extensions>
+			<code_completion>
+				<search_path add="Inc" />
+				<search_path add="Drivers\STM32G0xx_HAL_Driver\Inc" />
+				<search_path add="Drivers\STM32G0xx_HAL_Driver\Src" />
+				<search_path add="Drivers\CMSIS\Include" />
+				<search_path add="Drivers\CMSIS\Device\ST\STM32G0xx\Include" />
+			</code_completion>
 			<lib_finder disable_auto="1" />
 			<lib_finder disable_auto="1" />
 		</Extensions>
 		</Extensions>
 	</Project>
 	</Project>

+ 1 - 0
Makefile

@@ -40,6 +40,7 @@ BUILD_DIR = build
 # C sources
 # C sources
 C_SOURCES =  \
 C_SOURCES =  \
 Src/main.c \
 Src/main.c \
+Src/board.c \
 Src/stm32g0xx_it.c \
 Src/stm32g0xx_it.c \
 Src/i2c.c \
 Src/i2c.c \
 Src/ds3231.c \
 Src/ds3231.c \

+ 350 - 0
Src/board.c

@@ -0,0 +1,350 @@
+#include "board.h"
+
+/* private functions */
+static void TIM1_Init(void);
+static void TIM3_Init(void);
+static void TIM14_Init(void);
+static void TIM16_Init(void);
+static void TIM17_Init(void);
+
+/* Board perephireal Configuration  */
+void Board_Init(void)
+{
+  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+  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);
+
+  /* в дейтвительности нигде не используеться? */
+  //LL_RCC_GetSystemClocksFreq(&rcc_clocks); :::
+  /* Get SYSCLK frequency */
+  ///RCC_Clocks->SYSCLK_Frequency = RCC_GetSystemClockFreq();
+  /* HCLK clock frequency */
+  ///RCC_Clocks->HCLK_Frequency   = RCC_GetHCLKClockFreq(RCC_Clocks->SYSCLK_Frequency);
+  /* PCLK1 clock frequency */
+  ///RCC_Clocks->PCLK1_Frequency  = RCC_GetPCLK1ClockFreq(RCC_Clocks->HCLK_Frequency);
+
+  /* Initialize all configured peripherals */
+
+  /* Start RGB & Tube Power PWM */
+	TIM1_Init();
+  TIM3_Init();
+
+	TIM14_Init();
+
+  TIM16_Init();
+  TIM17_Init();
+}
+
+/**
+  * @brief System Clock Configuration
+  * @retval None
+  */
+void SystemClock_Config(void)
+{
+  /* HSI configuration and activation */
+  RCC->CR |= RCC_CR_HSIKERON; // Enable HSI even in stop mode
+  while((RCC->CR & RCC_CR_HSIRDY) == 0)
+  {
+  }
+
+  /* Main PLL configuration and activation */
+  RCC->PLLCFGR &= ~(RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR);
+  RCC->PLLCFGR |= (RCC_PLLCFGR_PLLSRC_HSI | RCC_PLLCFGR_PLLM_0 | (9 << RCC_PLLCFGR_PLLN_Pos) | RCC_PLLCFGR_PLLM_1);
+  RCC->CR |= RCC_CR_PLLON; // RCC_PLL_Enable
+  RCC->PLLCFGR |= RCC_PLLCFGR_PLLREN; // RCC_PLL_EnableDomain_SYS
+  while((RCC->CR & RCC_CR_PLLRDY) == 0)
+  {
+  }
+
+  /* Set AHB prescaler*/
+  RCC->CFGR &= ~(RCC_CFGR_HPRE);
+  RCC->CFGR |= 0x00000000U;
+
+  /* Sysclk activation on the main PLL */
+  RCC->CFGR &= RCC_CFGR_SW;
+  RCC->CFGR |= RCC_CFGR_SW_1;
+  while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1)
+  {
+  }
+
+  /* Set APB1 prescaler*/
+  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;
+
+  /* SetI2CClockSource */
+  RCC->CCIPR &= ~(((RCC_CCIPR_I2C1SEL << 16U) | RCC_CCIPR_I2C1SEL_1) >> 16U);
+  RCC->CCIPR |= (((RCC_CCIPR_I2C1SEL << 16U) | RCC_CCIPR_I2C1SEL_1) & 0x0000FFFFU);
+}
+
+/**
+  * @brief TIM1 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void TIM1_Init(void)
+{
+  /* Peripheral clock TIM1 enable */
+	RCC->APBENR2 |= RCC_APBENR2_TIM1EN;
+  /* Peripheral clock GPIOA enable */
+	RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
+
+  /* target clock - 200 Hz */
+  TIM1->PSC = TIM1_PSC; // prescaler
+  TIM1->ARR = TIM1_ARR; // auto reload value
+  TIM1->CR1 = TIM_CR1_ARPE;
+  // initial pwm value
+  TIM1->CCR1 = PWM_TUBE_INIT_VAL;
+  TIM1->CCR2 = PWM_LED_INIT_VAL;
+  TIM1->CCR3 = PWM_LED_INIT_VAL;
+  TIM1->CCR4 = PWM_LED_INIT_VAL;
+  // pwm mode 1 for 4 chanels
+  TIM1->CCMR1 = (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2PE);
+  TIM1->CCMR2 = (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC3PE | TIM_CCMR2_OC4PE);
+  // reset int flag - not needed, int unused
+  //TIM1->SR |= TIM_SR_UIF;
+  TIM1->BDTR = TIM_BDTR_MOE; // enable main output
+  TIM1->EGR = TIM_EGR_UG; // force timer update
+  /* TIM1 CC_EnableChannel */
+  TIM1->CCER = (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E);
+  /* TIM_EnableCounter */
+  TIM1->CR1 |= TIM_CR1_CEN;
+
+
+  /** TIM1 GPIO Configuration
+		PA8 ------> TIM1_CH1
+		PA9 ------> TIM1_CH2
+		PA10 ------> TIM1_CH3
+		PA11 [PA9] ------> TIM1_CH4
+  */
+  GPIO_SetPinMode(PWM_1_GPIO_Port, PWM_1_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_1_GPIO_Port, PWM_1_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_1_GPIO_Port, PWM_1_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_8_15(PWM_1_GPIO_Port, PWM_1_Pin, GPIO_AF_2);
+
+  GPIO_SetPinMode(PWM_R_GPIO_Port, PWM_R_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_R_GPIO_Port, PWM_R_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_R_GPIO_Port, PWM_R_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_8_15(PWM_R_GPIO_Port, PWM_R_Pin, GPIO_AF_2);
+
+  GPIO_SetPinMode(PWM_B_GPIO_Port, PWM_B_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_B_GPIO_Port, PWM_B_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_B_GPIO_Port, PWM_B_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_8_15(PWM_B_GPIO_Port, PWM_B_Pin, GPIO_AF_2);
+
+  GPIO_SetPinMode(PWM_G_GPIO_Port, PWM_B_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_G_GPIO_Port, PWM_B_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_G_GPIO_Port, PWM_B_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_8_15(PWM_G_GPIO_Port, PWM_B_Pin, GPIO_AF_2);
+}
+
+/**
+  * @brief TIM3 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void TIM3_Init(void)
+{
+  /* Peripheral clock TIM1 enable */
+	RCC->APBENR1 |= RCC_APBENR1_TIM3EN;
+  /* Peripheral clock GPIOA and GPIOB enable */
+	RCC->IOPENR |= (RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN);
+
+  /* target clock - 200 Hz */
+  TIM3->PSC = TIM3_PSC; // prescaler
+  TIM3->ARR = TIM3_ARR; // auto reload value
+  TIM3->CR1 = TIM_CR1_ARPE;
+  // initial pwm value
+  TIM3->CCR1 = PWM_TUBE_INIT_VAL;
+  TIM3->CCR2 = PWM_TUBE_INIT_VAL;
+  TIM3->CCR3 = PWM_TUBE_INIT_VAL;
+  TIM3->CCR4 = PWM_TUBE_INIT_VAL;
+  // pwm mode 1 for 4 chanels
+  TIM3->CCMR1 = (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2PE);
+  TIM3->CCMR2 = (TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC3PE | TIM_CCMR2_OC4PE);
+  // launch timer
+  TIM3->EGR = TIM_EGR_UG; // force timer update
+  /* TIM3 TIM_CC_EnableChannel */
+  TIM3->CCER = (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E);
+  /* TIM3 enable */
+  TIM3->CR1 |= TIM_CR1_CEN;
+
+  /**TIM3 GPIO Configuration
+  PA6   ------> TIM3_CH1
+  PA7   ------> TIM3_CH2
+  PB0   ------> TIM3_CH3
+  PB1   ------> TIM3_CH4
+  */
+  GPIO_SetPinMode(PWM_5_GPIO_Port, PWM_5_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_5_GPIO_Port, PWM_5_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_5_GPIO_Port, PWM_5_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_0_7(PWM_5_GPIO_Port, PWM_5_Pin, GPIO_AF_1);
+
+  GPIO_SetPinMode(PWM_4_GPIO_Port, PWM_4_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_4_GPIO_Port, PWM_4_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_4_GPIO_Port, PWM_4_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_0_7(PWM_4_GPIO_Port, PWM_4_Pin, GPIO_AF_1);
+
+  GPIO_SetPinMode(PWM_3_GPIO_Port, PWM_3_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_3_GPIO_Port, PWM_3_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_3_GPIO_Port, PWM_3_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_0_7(PWM_3_GPIO_Port, PWM_3_Pin, GPIO_AF_1);
+
+  GPIO_SetPinMode(PWM_2_GPIO_Port, PWM_2_Pin, GPIO_MODE_AFF);
+  GPIO_SetPinSpeed(PWM_2_GPIO_Port, PWM_2_Pin, GPIO_OSPEED_HI);
+  GPIO_SetPinPull(PWM_2_GPIO_Port, PWM_2_Pin, GPIO_PUPDR_DW);
+  GPIO_SetAFPin_0_7(PWM_2_GPIO_Port, PWM_2_Pin, GPIO_AF_1);
+}
+
+/**
+  * @brief TIM14 Initialization Function
+  * @param None
+  * @retval None
+  * @desc   "Блинкование" разрядами - 0,75/0,25 сек вкл/выкл.
+  */
+static void TIM14_Init(void)
+{
+  /* Peripheral clock enable */
+  RCC->APBENR2 |= RCC_APBENR2_TIM14EN;
+
+  /* TIM14 interrupt Init */
+  NVIC_SetPriority(TIM14_IRQn, 0);
+  NVIC_EnableIRQ(TIM14_IRQn);
+
+  /* Set TIM14 for 1 sec period  */
+  TIM14->PSC = TIM14_PSC;
+  TIM14->ARR = TIM14_ARR;
+
+  /* Enable:  Auto-reload preload, One-pulse mode, */
+  TIM14->CR1 = (TIM_CR1_ARPE | TIM_CR1_OPM);
+
+  /* OC or PWM? (for pwm - (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) ) , Output compare 1 preload */
+  TIM14->CCMR1 = (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE);
+
+  /* Enable Channel_1 or no needed ??? */
+  TIM14->CCER = TIM_CCER_CC1E;
+
+  /* Impulse value in msek */
+  TIM14->CCR1 = TIM14_PULSE_VAL;
+
+  /* Enable IRQ for Update end CaptureCompare envents or only CC ??? */
+  //TIM14->DIER = (TIM_DIER_UIE | TIM_DIER_CC1IE);
+  TIM14->DIER = TIM_DIER_CC1IE;
+}
+
+/**
+ * На старте активируем все каналы, при совпадении отключаем (не)нужные.
+ */
+void Blink_Start(void)
+{
+	/* enable all channels */
+	TUBE_ALL_ON;
+
+	/* clear IRQ flag */
+  TIM14->SR |= TIM_SR_CC1IF;
+
+  /* clear counter value */
+  TIM14->CNT = 0;
+
+  /* enable timer */
+  TIM14->CR1 |= TIM_CR1_CEN;
+}
+
+void Blink_Stop(void)
+{
+  /* disable timer */
+  TIM14->CR1 &= ~(TIM_CR1_CEN);
+  /* On all tubes */
+  TUBE_ALL_ON;
+}
+
+/**
+  * @brief TIM16 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void TIM16_Init(void)
+{
+  /* Peripheral clock enable */
+  RCC->APBENR2 |= RCC_APBENR2_TIM16EN;
+
+  /* TIM16 interrupt Init */
+  NVIC_SetPriority(TIM16_IRQn, 0);
+  NVIC_EnableIRQ(TIM16_IRQn);
+
+  /* setup clock */
+  TIM16->PSC = TIM16_PSC; // prescaler
+  TIM16->ARR = TIM16_ARR; // auto reload value
+  TIM16->CR1 = TIM_CR1_ARPE;
+  // initial pwm value
+  //TIM16->CCR1 = TIM16_PWM_VAL;
+  // pwm mode 1 for 1 chanel
+  TIM16->CCMR1 = (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE);
+  // reset int flag
+  TIM16->SR |= TIM_SR_UIF;
+  TIM16->BDTR = TIM_BDTR_MOE; // enable main output
+  TIM16->EGR = TIM_EGR_UG; // force timer update
+  /* TIM16 CC_EnableChannel */
+  TIM16->CCER = TIM_CCER_CC1E;
+  /* TIM_EnableCounter */
+  TIM16->CR1 |= TIM_CR1_CEN;
+  /* Enable IRQ */
+  TIM16->DIER = TIM_DIER_UIE;
+}
+
+/**
+  * @brief TIM17 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void TIM17_Init(void)
+{
+  /* Peripheral clock enable */
+  RCC->APBENR2 |= RCC_APBENR2_TIM17EN;
+
+  /* TIM17 interrupt Init */
+  NVIC_SetPriority(TIM17_IRQn, 0);
+  NVIC_EnableIRQ(TIM17_IRQn);
+
+  /* setup clock */
+  TIM17->PSC = TIM17_PSC; // prescaler
+  TIM17->ARR = TIM17_ARR; // auto reload value
+  TIM17->CR1 = TIM_CR1_ARPE;
+  // initial pwm value
+  //TIM17->CCR1 = TIM17_PWM_VAL;
+  // pwm mode 1 for 1 chanel
+  TIM17->CCMR1 = (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1PE);
+  // reset int flag
+  TIM17->SR |= TIM_SR_UIF;
+  TIM17->BDTR = TIM_BDTR_MOE; // enable main output
+  TIM17->EGR = TIM_EGR_UG; // force timer update
+  /* TIM17 CC_EnableChannel */
+  TIM17->CCER = TIM_CCER_CC1E;
+  /* TIM_EnableCounter */
+  TIM17->CR1 |= TIM_CR1_CEN;
+  /* Enable IRQ */
+  TIM17->DIER = TIM_DIER_UIE;
+}

+ 10 - 32
Src/stm32g0xx_it.c

@@ -234,37 +234,13 @@ void DMA1_Channel2_3_IRQHandler(void)
 
 
 /**
 /**
   * @brief This function handles TIM14 global interrupt.
   * @brief This function handles TIM14 global interrupt.
-  * Ïðè ïåðåïîëíåíèè àêòèâèðóåì âñå êàíàëû, ïðè ñîâïàäåíèè îòêëþ÷àåì íóæíûå.
   */
   */
 void TIM14_IRQHandler(void)
 void TIM14_IRQHandler(void)
 {
 {
   /* USER CODE BEGIN TIM14_IRQn 0 */
   /* USER CODE BEGIN TIM14_IRQn 0 */
-  static uint32_t _flg = 0;
   if ((TIM14->SR & TIM_SR_UIF) != 0) {
   if ((TIM14->SR & TIM_SR_UIF) != 0) {
-    /* Update interrupt */
+    /* Update interrupt flag */
     TIM14->SR |= TIM_SR_UIF;
     TIM14->SR |= TIM_SR_UIF;
-
-    /* enable channels */
-    if ((_flg & 0x1) != 0) {
-      TUBE_A_ON;
-      _flg &= ~0x1;
-    }
-    if ((_flg & 0x2) != 0) {
-      TUBE_B_ON;
-      _flg &= ~0x2;
-    }
-    if ((_flg & 0x4) != 0) {
-      TUBE_C_ON;
-      _flg &= ~0x4;
-    }
-    if ((_flg & 0x8) != 0) {
-      TUBE_D_ON;
-      _flg &= ~0x8;
-    }
-    if ((_flg & 0x10) != 0) {
-      TUBE_E_ON;
-      _flg &= ~0x10;
-    }
   }
   }
   /* USER CODE END TIM14_IRQn 0 */
   /* USER CODE END TIM14_IRQn 0 */
   /* USER CODE BEGIN TIM14_IRQn 1 */
   /* USER CODE BEGIN TIM14_IRQn 1 */
@@ -272,26 +248,21 @@ void TIM14_IRQHandler(void)
     /* Capture/Compare Interrupt */
     /* Capture/Compare Interrupt */
     TIM14->SR |= TIM_SR_CC1IF;
     TIM14->SR |= TIM_SR_CC1IF;
 
 
-    /* disable needed channel */
+    /* disable unneeded channel */
     if (Flag.Blink_1 != 0) {
     if (Flag.Blink_1 != 0) {
       TUBE_A_OFF;
       TUBE_A_OFF;
-      _flg |= 0x1;
     }
     }
     if (Flag.Blink_2 != 0) {
     if (Flag.Blink_2 != 0) {
       TUBE_B_OFF;
       TUBE_B_OFF;
-      _flg |= 0x2;
     }
     }
     if (Flag.Blink_3 != 0) {
     if (Flag.Blink_3 != 0) {
       TUBE_C_OFF;
       TUBE_C_OFF;
-      _flg |= 0x4;
     }
     }
     if (Flag.Blink_4 != 0) {
     if (Flag.Blink_4 != 0) {
       TUBE_D_OFF;
       TUBE_D_OFF;
-      _flg |= 0x8;
     }
     }
     if (Flag.Blink_5 != 0) {
     if (Flag.Blink_5 != 0) {
       TUBE_E_OFF;
       TUBE_E_OFF;
-      _flg |= 0x10;
     }
     }
   }
   }
   /* USER CODE END TIM14_IRQn 1 */
   /* USER CODE END TIM14_IRQn 1 */
@@ -303,7 +274,10 @@ void TIM14_IRQHandler(void)
 void TIM16_IRQHandler(void)
 void TIM16_IRQHandler(void)
 {
 {
   /* USER CODE BEGIN TIM16_IRQn 0 */
   /* USER CODE BEGIN TIM16_IRQn 0 */
-
+  if ((TIM16->SR & TIM_SR_UIF) != 0) {
+    /* Update interrupt flag */
+    TIM16->SR |= TIM_SR_UIF;
+  }
   /* USER CODE END TIM16_IRQn 0 */
   /* USER CODE END TIM16_IRQn 0 */
   /* USER CODE BEGIN TIM16_IRQn 1 */
   /* USER CODE BEGIN TIM16_IRQn 1 */
 
 
@@ -316,6 +290,10 @@ void TIM16_IRQHandler(void)
 void TIM17_IRQHandler(void)
 void TIM17_IRQHandler(void)
 {
 {
   /* USER CODE BEGIN TIM17_IRQn 0 */
   /* USER CODE BEGIN TIM17_IRQn 0 */
+  if ((TIM17->SR & TIM_SR_UIF) != 0) {
+    /* Update interrupt flag */
+    TIM17->SR |= TIM_SR_UIF;
+  }
   /* USER CODE END TIM17_IRQn 0 */
   /* USER CODE END TIM17_IRQn 0 */
   /* USER CODE BEGIN TIM17_IRQn 1 */
   /* USER CODE BEGIN TIM17_IRQn 1 */