#include "main.h" #include "cmsis_os.h" #include "cppmain.h" #include "usb_device.h" DAC_HandleTypeDef hdac_global; DMA_HandleTypeDef hdma_dac1; TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim6; TIM_HandleTypeDef htim7; RNG_HandleTypeDef hrng; extern PCD_HandleTypeDef hpcd_USB_OTG_FS; void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; // Enable ALL the clocks __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); // ALL GPIO Ports __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); // ALL Timers __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_TIM4_CLK_ENABLE(); __HAL_RCC_TIM5_CLK_ENABLE(); __HAL_RCC_TIM6_CLK_ENABLE(); __HAL_RCC_TIM7_CLK_ENABLE(); __HAL_RCC_TIM8_CLK_ENABLE(); __HAL_RCC_TIM9_CLK_ENABLE(); __HAL_RCC_TIM10_CLK_ENABLE(); __HAL_RCC_TIM11_CLK_ENABLE(); __HAL_RCC_TIM12_CLK_ENABLE(); __HAL_RCC_TIM13_CLK_ENABLE(); __HAL_RCC_TIM14_CLK_ENABLE(); // ALL DMA Controllers __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); // The DAC __HAL_RCC_DAC_CLK_ENABLE(); // The RNG __HAL_RCC_RNG_CLK_ENABLE(); // Configure the main internal regulator output voltage __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } // -------------------------------------------------------------------------------------------------- // Exception and Interrupt handler // -------------------------------------------------------------------------------------------------- void NMI_Handler(void) { while (1) {} } void HardFault_Handler(void) { while (1) {} } void MemManage_Handler(void) { while (1) {} } void BusFault_Handler(void) { while (1) {} } void UsageFault_Handler(void) { while (1) {} } void DebugMon_Handler(void) {} void SysTick_Handler(void) { HAL_IncTick(); #if (INCLUDE_xTaskGetSchedulerState == 1) if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { #endif /* INCLUDE_xTaskGetSchedulerState */ xPortSysTickHandler(); #if (INCLUDE_xTaskGetSchedulerState == 1) } #endif /* INCLUDE_xTaskGetSchedulerState */ } void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void DMA1_Stream5_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_dac1); } void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); } void TIM7_IRQHandler(void) { HAL_TIM_IRQHandler(&htim7); } void OTG_FS_IRQHandler(void) { HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); } // -------------------------------------------------------------------------------------------------- // Peripheral init // -------------------------------------------------------------------------------------------------- void MX_GPIO_Init(void) { HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); { GPIO_InitTypeDef GPIO_InitStruct; memset(&GPIO_InitStruct, 0, sizeof GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } { GPIO_InitTypeDef GPIO_InitStruct; memset(&GPIO_InitStruct, 0, sizeof GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } /* EXTI interrupt init*/ HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } // -------------------------------------------------------------------------------------------------- // Peripheral init // -------------------------------------------------------------------------------------------------- void MX_DAC_Init(void) { DAC_ChannelConfTypeDef sConfig = { 0 }; hdac_global.Instance = DAC; if (HAL_DAC_Init(&hdac_global) != HAL_OK) { Error_Handler(); } // DAC channel OUT1 config*/ sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac_global, &sConfig, DAC_CHANNEL_1) != HAL_OK) { Error_Handler(); } // DAC channel OUT2 config sConfig.DAC_Trigger = DAC_TRIGGER_NONE; if (HAL_DAC_ConfigChannel(&hdac_global, &sConfig, DAC_CHANNEL_2) != HAL_OK) { Error_Handler(); } } void HAL_DAC_MspInit(DAC_HandleTypeDef *dacHandle) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; if (dacHandle->Instance == DAC) { /* DAC clock enable */ /**DAC GPIO Configuration PA4 ------> DAC_OUT1 PA5 ------> DAC_OUT2 */ GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* DAC DMA Init */ /* DAC1 Init */ hdma_dac1.Instance = DMA1_Stream5; hdma_dac1.Init.Channel = DMA_CHANNEL_7; hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_dac1.Init.MemInc = DMA_MINC_ENABLE; hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_dac1.Init.Mode = DMA_NORMAL; hdma_dac1.Init.Priority = DMA_PRIORITY_LOW; hdma_dac1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_dac1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(dacHandle, DMA_Handle1, hdma_dac1); } } void HAL_DAC_MspDeInit(DAC_HandleTypeDef *dacHandle) { if (dacHandle->Instance == DAC) { HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5); HAL_DMA_DeInit(dacHandle->DMA_Handle1); } } // -------------------------------------------------------------------------------------------------- // Peripheral init // -------------------------------------------------------------------------------------------------- void MX_DMA_Init(void) { /* DMA interrupt init */ /* DMA1_Stream5_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); } // -------------------------------------------------------------------------------------------------- // Timers // -------------------------------------------------------------------------------------------------- void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = { 0 }; TIM_MasterConfigTypeDef sMasterConfig = { 0 }; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 42949000; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } } void MX_TIM6_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = { 0 }; htim6.Instance = TIM6; htim6.Init.Prescaler = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 1904; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } } void MX_TIM7_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = { 0 }; htim7.Instance = TIM7; htim7.Init.Prescaler = 10000; htim7.Init.CounterMode = TIM_COUNTERMODE_UP; htim7.Init.Period = 429490000; htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { Error_Handler(); } } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *tim_baseHandle) { if (tim_baseHandle->Instance == TIM2) { /* TIM2 interrupt Init */ HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); } else if (tim_baseHandle->Instance == TIM6) { } else if (tim_baseHandle->Instance == TIM7) { /* TIM7 interrupt Init */ HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); HAL_NVIC_EnableIRQ(TIM7_IRQn); } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *tim_baseHandle) { if (tim_baseHandle->Instance == TIM2) { HAL_NVIC_DisableIRQ(TIM2_IRQn); } else if (tim_baseHandle->Instance == TIM6) { } else if (tim_baseHandle->Instance == TIM7) { HAL_NVIC_DisableIRQ(TIM7_IRQn); } } // -------------------------------------------------------------------------------------------------- // Random Number Generator (RNG) // -------------------------------------------------------------------------------------------------- void MX_RNG_Init(void) { hrng.Instance = RNG; if (HAL_RNG_Init(&hrng) != HAL_OK) { Error_Handler(); } } void Error_Handler(void) { heck_error_handler(); __disable_irq(); while (1) {} } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ } #endif /* USE_FULL_ASSERT */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", .stack_size = 128 * 4, .priority = (osPriority_t)osPriorityNormal, }; void StartDefaultTask(void *argument) { MX_USB_DEVICE_Init(); heck_cppmain(); } void MX_FREERTOS_Init(void) { defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_DAC_Init(); MX_TIM2_Init(); MX_TIM6_Init(); MX_TIM7_Init(); MX_RNG_Init(); osKernelInitialize(); MX_FREERTOS_Init(); osKernelStart(); } void HAL_MspInit(void) { HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); }