#include "apphal.hpp" #include "uappbase\appcfg\appcfg.hpp" using namespace iflytop; void AppHal::MX_TIM6_Init(void) { __HAL_RCC_TIM6_CLK_ENABLE(); TIM_MasterConfigTypeDef sMasterConfig = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 71; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 65535; htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { Error_Handler(); } /* TIM6 interrupt Init */ HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0); HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); } /* TIM7 init function */ void AppHal::MX_TIM7_Init(void) { __HAL_RCC_TIM7_CLK_ENABLE(); TIM_MasterConfigTypeDef sMasterConfig = {0}; htim7.Instance = TIM7; htim7.Init.Prescaler = 81; htim7.Init.CounterMode = TIM_COUNTERMODE_UP; htim7.Init.Period = 65535; htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; 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(); } /* TIM7 interrupt Init */ HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); HAL_NVIC_EnableIRQ(TIM7_IRQn); } #define EARLY_ASSERT(exptr) \ if (!(exptr)) { \ while (true) { \ } \ } void AppHal::DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate) { #if (DEBUG_UART_INDEX == 1) GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); if (tx == PA9 && rx == PA10) { GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } else if (tx == PB6 && rx == PB7) { GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } else { EARLY_ASSERT(false); } huart1.Instance = USART1; huart1.Init.BaudRate = baudrate; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); hdma2_stream2.Instance = DMA2_Stream2; hdma2_stream2.Init.Channel = DMA_CHANNEL_4; hdma2_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma2_stream2.Init.PeriphInc = DMA_PINC_DISABLE; hdma2_stream2.Init.MemInc = DMA_MINC_ENABLE; hdma2_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma2_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma2_stream2.Init.Mode = DMA_NORMAL; hdma2_stream2.Init.Priority = DMA_PRIORITY_LOW; hdma2_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma2_stream2) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&huart1, hdmarx, hdma2_stream2); HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART1_IRQn); #else #error "DEBUG_UART_INDEX not supported" #endif } void AppHal::MX_IWDG_Init(void) { hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = IWDG_PRESCALER_64; hiwdg.Init.Reload = 4095; if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); } } void AppHal::UART3_Init(Pin_t tx, Pin_t rx, int32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_USART3_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); huart3.Instance = USART3; huart3.Init.BaudRate = baudrate; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } if (tx == PB10 && rx == PB11) { __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } else if (tx == PD8 && rx == PD9) { __HAL_RCC_GPIOD_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART3; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); } else { ASSERT(false, "UART3 NOT SUPPORT PIN"); } hdma1_stream1.Instance = DMA1_Stream1; hdma1_stream1.Init.Channel = DMA_CHANNEL_4; hdma1_stream1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma1_stream1.Init.PeriphInc = DMA_PINC_DISABLE; hdma1_stream1.Init.MemInc = DMA_MINC_ENABLE; hdma1_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma1_stream1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma1_stream1.Init.Mode = DMA_NORMAL; hdma1_stream1.Init.Priority = DMA_PRIORITY_LOW; hdma1_stream1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma1_stream1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&huart3, hdmarx, hdma1_stream1); hdma1_stream3.Instance = DMA1_Stream3; hdma1_stream3.Init.Channel = DMA_CHANNEL_4; hdma1_stream3.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma1_stream3.Init.PeriphInc = DMA_PINC_DISABLE; hdma1_stream3.Init.MemInc = DMA_MINC_ENABLE; hdma1_stream3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma1_stream3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma1_stream3.Init.Mode = DMA_NORMAL; hdma1_stream3.Init.Priority = DMA_PRIORITY_LOW; hdma1_stream3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma1_stream3) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&huart3, hdmatx, hdma1_stream3); HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); HAL_NVIC_EnableIRQ(USART3_IRQn); } /** * @brief */ void AppHal::UART4_Init(Pin_t tx, Pin_t rx, int32_t baudrate) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_UART4_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); huart4.Instance = UART4; huart4.Init.BaudRate = baudrate; // 256000 huart4.Init.WordLength = UART_WORDLENGTH_8B; huart4.Init.StopBits = UART_STOPBITS_1; huart4.Init.Parity = UART_PARITY_NONE; huart4.Init.Mode = UART_MODE_TX_RX; huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart4.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart4) != HAL_OK) { Error_Handler(); } /**UART4 GPIO Configuration PC10 ------> UART4_TX PC11 ------> UART4_RX */ if (tx == PC10 && rx == PC11) { GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF8_UART4; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } else { ASSERT(false, "UART4 NOT SUPPORT PIN"); } /* UART4 interrupt Init */ HAL_NVIC_SetPriority(UART4_IRQn, 5, 0); HAL_NVIC_EnableIRQ(UART4_IRQn); /*********************************************************************************************************************** * DMA_INIT * ***********************************************************************************************************************/ /* UART4 DMA Init */ /* UART4_RX Init */ hdma1_stream2.Instance = DMA1_Stream2; hdma1_stream2.Init.Channel = DMA_CHANNEL_4; hdma1_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma1_stream2.Init.PeriphInc = DMA_PINC_DISABLE; hdma1_stream2.Init.MemInc = DMA_MINC_ENABLE; hdma1_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma1_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma1_stream2.Init.Mode = DMA_NORMAL; hdma1_stream2.Init.Priority = DMA_PRIORITY_LOW; hdma1_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma1_stream2) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&huart4, hdmarx, hdma1_stream2); /* UART4_TX Init */ hdma1_stream4.Instance = DMA1_Stream4; hdma1_stream4.Init.Channel = DMA_CHANNEL_4; hdma1_stream4.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma1_stream4.Init.PeriphInc = DMA_PINC_DISABLE; hdma1_stream4.Init.MemInc = DMA_MINC_ENABLE; hdma1_stream4.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma1_stream4.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma1_stream4.Init.Mode = DMA_NORMAL; hdma1_stream4.Init.Priority = DMA_PRIORITY_LOW; hdma1_stream4.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma1_stream4) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&huart4, hdmatx, hdma1_stream4); } void AppHal::MX_I2C1_Init(void) { __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; // hi2c1.Init.ClockSpeed = 1000000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; // hi2c1.Instance = I2C1; // hi2c1.Init.ClockSpeed = 1000000; // 1MHz // hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // hi2c1.Init.OwnAddress1 = 0; // hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; // hi2c1.Init.OwnAddress2 = 0; // hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; // hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } GPIO_InitTypeDef GPIO_InitStruct = {0}; /**I2C1 GPIO Configuration PB8 ------> I2C1_SCL PB9 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void AppHal::tmc_spi_init() { #if (MOTOR_SPI_INDEX == 1) __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); static_assert(&MOTOR_SPI_INS == &hspi1); hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } static_assert(MOTOR_SPI_SCK == PA5); static_assert(MOTOR_SPI_SDO == PA6); static_assert(MOTOR_SPI_SDI == PA7); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); #else #error "MOTOR_SPI_INDEX not supported" #endif } void AppHal::rtc_init() { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } __HAL_RCC_RTC_ENABLE(); /** Initialize RTC Only */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } // /** Initialize RTC and set the Time and Date // */ // sTime.Hours = 0x0; // sTime.Minutes = 0x0; // sTime.Seconds = 0x0; // sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; // sTime.StoreOperation = RTC_STOREOPERATION_RESET; // if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { // Error_Handler(); // } // sDate.WeekDay = 0x01; // sDate.Month = 0x1; // sDate.Date = 0x1; // sDate.Year = 24; // if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { // Error_Handler(); // } } void AppHal::rtc_get(zdate_t* date) { RTC_DateTypeDef GetData; RTC_TimeTypeDef GetTime; /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); date->year = 1900 + GetData.Year; date->month = GetData.Month; date->day = GetData.Date; date->hours = GetTime.Hours; date->minutes = GetTime.Minutes; date->seconds = GetTime.Seconds; // /* Display date Format : yy/mm/dd */ // ZLOGI("", "%02d/%02d/%02d\r\n", 1900 + GetData.Year, GetData.Month, GetData.Date); // /* Display time Format : hh:mm:ss */ // ZLOGI("", "%02d:%02d:%02d\r\n", GetTime.Hours, GetTime.Minutes, GetTime.Seconds); } void AppHal::rtc_set(zdate_t* date) { RTC_DateTypeDef sDate = {0}; RTC_TimeTypeDef sTime = {0}; HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); sTime.Hours = date->hours; sTime.Minutes = date->minutes; sTime.Seconds = date->seconds; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } sDate.WeekDay = 0x01; sDate.Month = date->month; sDate.Date = date->day; sDate.Year = date->year - 1900; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } } void AppHal::usb_init() { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /**USB_OTG_FS GPIO Configuration PA11 ------> USB_OTG_FS_DM PA12 ------> USB_OTG_FS_DP */ GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); hhcd_USB_OTG_FS.Instance = USB_OTG_FS; hhcd_USB_OTG_FS.Init.Host_channels = 8; hhcd_USB_OTG_FS.Init.speed = HCD_SPEED_FULL; hhcd_USB_OTG_FS.Init.dma_enable = DISABLE; hhcd_USB_OTG_FS.Init.phy_itface = HCD_PHY_EMBEDDED; hhcd_USB_OTG_FS.Init.Sof_enable = DISABLE; if (HAL_HCD_Init(&hhcd_USB_OTG_FS) != HAL_OK) { Error_Handler(); } #if 0 __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); /**USB_OTG_FS GPIO Configuration PA11 ------> USB_OTG_FS_DM PA12 ------> USB_OTG_FS_DP */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); #endif }