You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
451 lines
13 KiB
451 lines
13 KiB
#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);
|
|
}
|
|
|