|
|
@ -4,6 +4,8 @@ |
|
|
|
#include "usb_device.h" |
|
|
|
#include "stm32f4xx_hal_cortex.h" |
|
|
|
|
|
|
|
extern PCD_HandleTypeDef hpcd_USB_OTG_FS; |
|
|
|
|
|
|
|
DAC_HandleTypeDef hdac1; |
|
|
|
DMA_HandleTypeDef hdma_dac1; |
|
|
|
TIM_HandleTypeDef htim2; |
|
|
@ -11,14 +13,9 @@ TIM_HandleTypeDef htim6; |
|
|
|
TIM_HandleTypeDef htim7; |
|
|
|
RNG_HandleTypeDef hrng; |
|
|
|
|
|
|
|
extern PCD_HandleTypeDef hpcd_USB_OTG_FS; |
|
|
|
|
|
|
|
|
|
|
|
void sysclk_init(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(); |
|
|
@ -63,32 +60,39 @@ void sysclk_init(void) |
|
|
|
// 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; |
|
|
|
{ |
|
|
|
// Initializes the RCC Oscillators according to the specified parameters
|
|
|
|
// in the RCC_OscInitTypeDef structure.
|
|
|
|
RCC_OscInitTypeDef conf = { |
|
|
|
.OscillatorType = RCC_OSCILLATORTYPE_HSE, |
|
|
|
.HSEState = RCC_HSE_ON, |
|
|
|
.PLL.PLLState = RCC_PLL_ON, |
|
|
|
.PLL.PLLSource = RCC_PLLSOURCE_HSE, |
|
|
|
.PLL.PLLM = 4, |
|
|
|
.PLL.PLLN = 168, |
|
|
|
.PLL.PLLP = RCC_PLLP_DIV2, |
|
|
|
.PLL.PLLQ = 7, |
|
|
|
}; |
|
|
|
|
|
|
|
if (HAL_RCC_OscConfig(&conf) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
{ |
|
|
|
// Initializes the CPU, AHB and APB buses clocks
|
|
|
|
RCC_ClkInitTypeDef conf = { |
|
|
|
.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | |
|
|
|
RCC_CLOCKTYPE_PCLK2, |
|
|
|
.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK, |
|
|
|
.AHBCLKDivider = RCC_SYSCLK_DIV1, |
|
|
|
.APB1CLKDivider = RCC_HCLK_DIV4, |
|
|
|
.APB2CLKDivider = RCC_HCLK_DIV2, |
|
|
|
}; |
|
|
|
if (HAL_RCC_ClockConfig(&conf, FLASH_LATENCY_5) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -171,30 +175,37 @@ void gpio_init(void) |
|
|
|
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); |
|
|
|
|
|
|
|
{ |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
|
|
|
|
conf.Pin = GPIO_PIN_0; |
|
|
|
conf.Mode = GPIO_MODE_IT_RISING; |
|
|
|
conf.Pull = GPIO_NOPULL; |
|
|
|
// Button Blue
|
|
|
|
GPIO_InitTypeDef conf = { |
|
|
|
.Pin = GPIO_PIN_0, |
|
|
|
.Mode = GPIO_MODE_IT_RISING, |
|
|
|
.Pull = GPIO_NOPULL, |
|
|
|
.Speed = GPIO_SPEED_LOW, |
|
|
|
}; |
|
|
|
HAL_GPIO_Init(GPIOA, &conf); |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
// LED Green
|
|
|
|
GPIO_InitTypeDef conf = { |
|
|
|
.Pin = GPIO_PIN_12, |
|
|
|
.Mode = GPIO_MODE_OUTPUT_PP, |
|
|
|
.Pull = GPIO_NOPULL, |
|
|
|
.Speed = GPIO_SPEED_FREQ_LOW, |
|
|
|
}; |
|
|
|
|
|
|
|
conf.Pin = GPIO_PIN_12; |
|
|
|
conf.Mode = GPIO_MODE_OUTPUT_PP; |
|
|
|
conf.Pull = GPIO_NOPULL; |
|
|
|
conf.Speed = GPIO_SPEED_FREQ_LOW; |
|
|
|
HAL_GPIO_Init(GPIOD, &conf); |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
// DAC1
|
|
|
|
GPIO_InitTypeDef conf = { |
|
|
|
.Pin = GPIO_PIN_4, |
|
|
|
.Mode = GPIO_MODE_ANALOG, |
|
|
|
.Pull = GPIO_NOPULL, |
|
|
|
.Speed = GPIO_SPEED_FREQ_HIGH, |
|
|
|
}; |
|
|
|
|
|
|
|
conf.Pin = GPIO_PIN_4; |
|
|
|
conf.Mode = GPIO_MODE_ANALOG; |
|
|
|
conf.Pull = GPIO_NOPULL; |
|
|
|
HAL_GPIO_Init(GPIOA, &conf); |
|
|
|
} |
|
|
|
} |
|
|
@ -206,9 +217,10 @@ void dac_init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
DAC_ChannelConfTypeDef conf = { 0 }; |
|
|
|
conf.DAC_Trigger = DAC_TRIGGER_T6_TRGO; |
|
|
|
conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; |
|
|
|
DAC_ChannelConfTypeDef conf = { |
|
|
|
.DAC_Trigger = DAC_TRIGGER_T6_TRGO, |
|
|
|
.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE, |
|
|
|
}; |
|
|
|
if (HAL_DAC_ConfigChannel(&hdac1, &conf, DAC_CHANNEL_1) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
@ -230,12 +242,11 @@ void dma_init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
// Originally that was:
|
|
|
|
// __HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1);
|
|
|
|
// Exapanded to:
|
|
|
|
// hdma_dac1.Parent = &hdac1;
|
|
|
|
// Originally that was:
|
|
|
|
// __HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1);
|
|
|
|
// Exapanded to:
|
|
|
|
// hdma_dac1.Parent = &hdac1;
|
|
|
|
hdac1.DMA_Handle1 = &hdma_dac1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
@ -254,17 +265,23 @@ void tim2_init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_ClockConfigTypeDef sClockSourceConfig = { 0 }; |
|
|
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; |
|
|
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
{ |
|
|
|
TIM_ClockConfigTypeDef conf = { |
|
|
|
.ClockSource = TIM_CLOCKSOURCE_INTERNAL, |
|
|
|
}; |
|
|
|
if (HAL_TIM_ConfigClockSource(&htim2, &conf) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; |
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
{ |
|
|
|
TIM_MasterConfigTypeDef conf = { |
|
|
|
.MasterOutputTrigger = TIM_TRGO_RESET, |
|
|
|
.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE, |
|
|
|
}; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &conf) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -279,11 +296,14 @@ void tim6_init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; |
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
{ |
|
|
|
TIM_MasterConfigTypeDef conf = { |
|
|
|
.MasterOutputTrigger = TIM_TRGO_UPDATE, |
|
|
|
.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE, |
|
|
|
}; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &conf) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -298,11 +318,14 @@ void tim7_init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; |
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
{ |
|
|
|
TIM_MasterConfigTypeDef conf = { |
|
|
|
.MasterOutputTrigger = TIM_TRGO_RESET, |
|
|
|
.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE, |
|
|
|
}; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &conf) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -324,10 +347,6 @@ void irq_init() |
|
|
|
HAL_NVIC_EnableIRQ(EXTI0_IRQn); |
|
|
|
} |
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
// Random Number Generator (RNG)
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void rng_init(void) |
|
|
|
{ |
|
|
|
hrng.Instance = RNG; |
|
|
@ -364,13 +383,15 @@ void rtos_default_task(void *argument) |
|
|
|
|
|
|
|
void rtos_init(void) |
|
|
|
{ |
|
|
|
const osThreadAttr_t defaultTask_attributes = { |
|
|
|
osKernelInitialize(); |
|
|
|
const osThreadAttr_t conf = { |
|
|
|
.name = "defaultTask", |
|
|
|
.stack_size = 128 * 4, |
|
|
|
.priority = (osPriority_t)osPriorityNormal, |
|
|
|
}; |
|
|
|
osThreadId_t defaultTaskHandle; |
|
|
|
defaultTaskHandle = osThreadNew(rtos_default_task, NULL, &defaultTask_attributes); |
|
|
|
defaultTaskHandle = osThreadNew(rtos_default_task, NULL, &conf); |
|
|
|
osKernelStart(); |
|
|
|
} |
|
|
|
|
|
|
|
int main(void) |
|
|
@ -388,8 +409,6 @@ int main(void) |
|
|
|
irq_init(); |
|
|
|
dma_init(); |
|
|
|
|
|
|
|
osKernelInitialize(); |
|
|
|
|
|
|
|
rtos_init(); |
|
|
|
osKernelStart(); |
|
|
|
} |
|
|
|