#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; }