|
|
@ -2,6 +2,7 @@ |
|
|
|
#include "cmsis_os.h" |
|
|
|
#include "cppmain.h" |
|
|
|
#include "usb_device.h" |
|
|
|
#include "stm32f4xx_hal_cortex.h" |
|
|
|
|
|
|
|
DAC_HandleTypeDef hdac1; |
|
|
|
DMA_HandleTypeDef hdma_dac1; |
|
|
@ -13,7 +14,7 @@ RNG_HandleTypeDef hrng; |
|
|
|
extern PCD_HandleTypeDef hpcd_USB_OTG_FS; |
|
|
|
|
|
|
|
|
|
|
|
void SystemClock_Config(void) |
|
|
|
void sysclk_init(void) |
|
|
|
{ |
|
|
|
RCC_OscInitTypeDef RCC_OscInitStruct = { 0 }; |
|
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 }; |
|
|
@ -165,60 +166,56 @@ void OTG_FS_IRQHandler(void) |
|
|
|
// Peripheral init
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void MX_GPIO_Init(void) |
|
|
|
void gpio_init(void) |
|
|
|
{ |
|
|
|
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET); |
|
|
|
|
|
|
|
{ |
|
|
|
GPIO_InitTypeDef GPIO_InitStruct = { 0 }; |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
|
|
|
|
GPIO_InitStruct.Pin = GPIO_PIN_0; |
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; |
|
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
|
|
|
conf.Pin = GPIO_PIN_0; |
|
|
|
conf.Mode = GPIO_MODE_IT_RISING; |
|
|
|
conf.Pull = GPIO_NOPULL; |
|
|
|
HAL_GPIO_Init(GPIOA, &conf); |
|
|
|
} |
|
|
|
|
|
|
|
{ |
|
|
|
GPIO_InitTypeDef GPIO_InitStruct = { 0 }; |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
|
|
|
|
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); |
|
|
|
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 GPIO_InitStruct = { 0 }; |
|
|
|
GPIO_InitStruct.Pin = GPIO_PIN_4; |
|
|
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; |
|
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
|
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
|
|
|
} |
|
|
|
GPIO_InitTypeDef conf = { 0 }; |
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); |
|
|
|
HAL_NVIC_EnableIRQ(EXTI0_IRQn); |
|
|
|
conf.Pin = GPIO_PIN_4; |
|
|
|
conf.Mode = GPIO_MODE_ANALOG; |
|
|
|
conf.Pull = GPIO_NOPULL; |
|
|
|
HAL_GPIO_Init(GPIOA, &conf); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
// Peripheral init
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void MX_DAC_Init(void) |
|
|
|
void dac_init(void) |
|
|
|
{ |
|
|
|
DAC_ChannelConfTypeDef conf = { 0 }; |
|
|
|
hdac1.Instance = DAC1; |
|
|
|
if (HAL_DAC_Init(&hdac1) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
DAC_ChannelConfTypeDef conf = { 0 }; |
|
|
|
conf.DAC_Trigger = DAC_TRIGGER_T6_TRGO; |
|
|
|
conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; |
|
|
|
if (HAL_DAC_ConfigChannel(&hdac1, &conf, DAC_CHANNEL_1) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void dma_init(void) |
|
|
|
{ |
|
|
|
hdma_dac1.Instance = DMA1_Stream5; |
|
|
|
hdma_dac1.Init.Channel = DMA_CHANNEL_7; |
|
|
|
hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH; |
|
|
@ -233,41 +230,20 @@ void MX_DAC_Init(void) |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
__HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1); |
|
|
|
} |
|
|
|
|
|
|
|
void HAL_DAC_MspDeInit(DAC_HandleTypeDef *dacHandle) |
|
|
|
{ |
|
|
|
if (dacHandle->Instance == DAC1) { |
|
|
|
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5); |
|
|
|
HAL_DMA_DeInit(dacHandle->DMA_Handle1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
// Peripheral init
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
// Originally that was:
|
|
|
|
// __HAL_LINKDMA(&hdac1, DMA_Handle1, hdma_dac1);
|
|
|
|
// Exapanded to:
|
|
|
|
// hdma_dac1.Parent = &hdac1;
|
|
|
|
hdac1.DMA_Handle1 = &hdma_dac1; |
|
|
|
|
|
|
|
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) |
|
|
|
void tim2_init(void) |
|
|
|
{ |
|
|
|
TIM_ClockConfigTypeDef sClockSourceConfig = { 0 }; |
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
|
|
|
|
htim2.Instance = TIM2; |
|
|
|
htim2.Init.Prescaler = 0; |
|
|
|
htim2.Init.CounterMode = TIM_COUNTERMODE_UP; |
|
|
@ -277,10 +253,14 @@ void MX_TIM2_Init(void) |
|
|
|
if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_ClockConfigTypeDef sClockSourceConfig = { 0 }; |
|
|
|
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; |
|
|
|
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != 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) { |
|
|
@ -288,10 +268,8 @@ void MX_TIM2_Init(void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void MX_TIM6_Init(void) |
|
|
|
void tim6_init(void) |
|
|
|
{ |
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
|
|
|
|
htim6.Instance = TIM6; |
|
|
|
htim6.Init.Prescaler = 0; |
|
|
|
htim6.Init.CounterMode = TIM_COUNTERMODE_UP; |
|
|
@ -300,6 +278,8 @@ void MX_TIM6_Init(void) |
|
|
|
if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; |
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { |
|
|
@ -307,10 +287,8 @@ void MX_TIM6_Init(void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void MX_TIM7_Init(void) |
|
|
|
void tim7_init(void) |
|
|
|
{ |
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
|
|
|
|
htim7.Instance = TIM7; |
|
|
|
htim7.Init.Prescaler = 10000; |
|
|
|
htim7.Init.CounterMode = TIM_COUNTERMODE_UP; |
|
|
@ -319,6 +297,8 @@ void MX_TIM7_Init(void) |
|
|
|
if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { |
|
|
|
Error_Handler(); |
|
|
|
} |
|
|
|
|
|
|
|
TIM_MasterConfigTypeDef sMasterConfig = { 0 }; |
|
|
|
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; |
|
|
|
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; |
|
|
|
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { |
|
|
@ -326,37 +306,29 @@ void MX_TIM7_Init(void) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *tim_baseHandle) |
|
|
|
void irq_init() |
|
|
|
{ |
|
|
|
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); |
|
|
|
} |
|
|
|
} |
|
|
|
// This is for RTOS i guess
|
|
|
|
// HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
|
|
|
|
|
|
|
|
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); |
|
|
|
} |
|
|
|
} |
|
|
|
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 1, 0); |
|
|
|
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); |
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(TIM2_IRQn, 5, 0); |
|
|
|
HAL_NVIC_EnableIRQ(TIM2_IRQn); |
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); |
|
|
|
HAL_NVIC_EnableIRQ(TIM7_IRQn); |
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); |
|
|
|
HAL_NVIC_EnableIRQ(EXTI0_IRQn); |
|
|
|
} |
|
|
|
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
// Random Number Generator (RNG)
|
|
|
|
// --------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void MX_RNG_Init(void) |
|
|
|
void rng_init(void) |
|
|
|
{ |
|
|
|
hrng.Instance = RNG; |
|
|
|
if (HAL_RNG_Init(&hrng) != HAL_OK) { |
|
|
@ -371,7 +343,6 @@ void Error_Handler(void) |
|
|
|
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. |
|
|
@ -384,47 +355,41 @@ 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) |
|
|
|
void rtos_default_task(void *argument) |
|
|
|
{ |
|
|
|
MX_USB_DEVICE_Init(); |
|
|
|
heck_cppmain(); |
|
|
|
} |
|
|
|
|
|
|
|
void MX_FREERTOS_Init(void) |
|
|
|
void rtos_init(void) |
|
|
|
{ |
|
|
|
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); |
|
|
|
const osThreadAttr_t defaultTask_attributes = { |
|
|
|
.name = "defaultTask", |
|
|
|
.stack_size = 128 * 4, |
|
|
|
.priority = (osPriority_t)osPriorityNormal, |
|
|
|
}; |
|
|
|
osThreadId_t defaultTaskHandle; |
|
|
|
defaultTaskHandle = osThreadNew(rtos_default_task, 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(); |
|
|
|
sysclk_init(); |
|
|
|
|
|
|
|
MX_USB_DEVICE_Init(); // USB first, for logging over serial port
|
|
|
|
gpio_init(); |
|
|
|
dac_init(); |
|
|
|
tim2_init(); |
|
|
|
tim6_init(); |
|
|
|
tim7_init(); |
|
|
|
rng_init(); |
|
|
|
irq_init(); |
|
|
|
dma_init(); |
|
|
|
|
|
|
|
osKernelInitialize(); |
|
|
|
MX_FREERTOS_Init(); |
|
|
|
osKernelStart(); |
|
|
|
} |
|
|
|
|
|
|
|
void HAL_MspInit(void) |
|
|
|
{ |
|
|
|
|
|
|
|
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); |
|
|
|
rtos_init(); |
|
|
|
osKernelStart(); |
|
|
|
} |
|
|
|