You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

254 lines
9.3 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
******************************************************************************
* @file main.c
* @author MCU Application Team
* @brief Main program body
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2023 Puya Semiconductor Co.
* All rights reserved.</center></h2>
*
* This software component is licensed by Puya under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
ADC_HandleTypeDef AdcHandle;
TIM_HandleTypeDef TimHandle;
TIM_MasterConfigTypeDef sMasterConfig;
ADC_AnalogWDGConfTypeDef ADCAnalogWDGConfig;
/* Private user code ---------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
static void APP_SystemClockConfig(void);
static void APP_AdcConfig(void);
static void APP_TimConfig(void);
/**
* @brief Main program.
* @retval int
*/
int main(void)
{
/* Reset of all peripherals, Initializes the Systick. */
HAL_Init();
/* System clock configuration */
APP_SystemClockConfig();
/* Initialize LED */
BSP_LED_Init(LED_GREEN);
/* Initialize UART */
BSP_USART_Config();
/* Configure ADC */
APP_AdcConfig();
/* ADC Calibrate */
if (HAL_ADCEx_Calibration_Start(&AdcHandle) != HAL_OK)
{
APP_ErrorHandler();
}
/* ADC Start */
HAL_ADC_Start(&AdcHandle);
/* TIM Config */
APP_TimConfig();
while(1)
{
}
}
/**
* @brief Adc WatchDog Callback
* @param hadcADC handle
* @retval None
*/
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
{
BSP_LED_On(LED_GREEN);
}
/**
* @brief ADC configuration function
* @param None
* @retval None
*/
static void APP_AdcConfig(void)
{
ADC_ChannelConfTypeDef sConfig={0};
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit={0};
__HAL_RCC_ADC1_CLK_ENABLE();
RCC_PeriphCLKInit.PeriphClockSelection= RCC_PERIPHCLK_ADC;
RCC_PeriphCLKInit.AdcClockSelection = RCC_ADCPCLK2_DIV8;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);
AdcHandle.Instance = ADC1;
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit resolution for converted data */
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Right-alignment for converted data */
AdcHandle.Init.ScanConvMode = ADC_SCAN_DISABLE; /* Scan Mode Disable */
AdcHandle.Init.ContinuousConvMode = DISABLE; /* Single Conversion */
AdcHandle.Init.NbrOfConversion = 1; /* Conversion Number 1 */
AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Discontinuous Mode Disable */
AdcHandle.Init.NbrOfDiscConversion = 1; /* Discontinuous Conversion Number 1 */
AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_EXT_IT11; /* TIM8 TRGO */
if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
{
APP_ErrorHandler();
}
__HAL_AFIO_REMAP_ADC1_ETRGREG_ENABLE(); /* Remap TIM8 TRGO */
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
{
APP_ErrorHandler();
}
ADCAnalogWDGConfig.Channel=ADC_CHANNEL_4; /* AnalogWDG Channel:channel4 */
ADCAnalogWDGConfig.HighThreshold=0x800; /* High Threshold0x0800 */
ADCAnalogWDGConfig.ITMode=ENABLE; /* Enable AnalogWDG Interrupt */
ADCAnalogWDGConfig.LowThreshold=0x0; /* Low Threshold0x0 */
ADCAnalogWDGConfig.WatchdogMode=ADC_ANALOGWATCHDOG_SINGLE_REG;
if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &ADCAnalogWDGConfig) != HAL_OK)
{
APP_ErrorHandler();
}
}
/**
* @brief TIM configuration function
* @param None
* @retval None
*/
static void APP_TimConfig(void)
{
__HAL_RCC_TIM8_CLK_ENABLE(); /* Enable TIM8 Clock */
TimHandle.Instance = TIM8; /* TIM8 */
TimHandle.Init.Period = 8000 - 1; /* Period = 8000-1 */
TimHandle.Init.Prescaler = 1000 - 1; /* Prescaler = 1000-1 */
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; /* ClockDivision = 0 */
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; /* Counter Direction = up */
TimHandle.Init.RepetitionCounter = 0; /* Repetition = 0 */
TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; /* Auto-Reload register not buffered */
if (HAL_TIM_Base_Init(&TimHandle) != HAL_OK) /* Initialize TIM8 */
{
APP_ErrorHandler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; /* Select Update Event as Trigger Source */
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; /* Disable Master/Slave Mode */
HAL_TIMEx_MasterConfigSynchronization(&TimHandle, &sMasterConfig); /* Configure TIM8 */
if (HAL_TIM_Base_Start(&TimHandle) != HAL_OK) /* TIM8 Start */
{
APP_ErrorHandler();
}
}
/**
* @brief System clock configuration function.
* @param None
* @retval None
*/
static void APP_SystemClockConfig(void)
{
RCC_OscInitTypeDef OscInitstruct = {0};
RCC_ClkInitTypeDef ClkInitstruct = {0};
OscInitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE |
RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSI48M;
OscInitstruct.HSEState = RCC_HSE_OFF; /* Disable HSE */
/* OscInitstruct.HSEFreq = RCC_HSE_16_32MHz; */ /* HSE frequency range 16~32M */
OscInitstruct.HSI48MState = RCC_HSI48M_OFF; /* Disable HSI48M */
OscInitstruct.HSIState = RCC_HSI_ON; /* Enable HSI */
OscInitstruct.LSEState = RCC_LSE_OFF; /* Disable LSE */
/* OscInitstruct.LSEDriver = RCC_LSEDRIVE_HIGH; */ /* LSEDrive High */
OscInitstruct.LSIState = RCC_LSI_OFF; /* Disable LSI */
OscInitstruct.PLL.PLLState = RCC_PLL_OFF; /* Disable PLL */
/* OscInitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; */ /* PLL clock source selection HSE */
/* OscInitstruct.PLL.PLLMUL = RCC_PLL_MUL6; */ /* PLL clock source 6-fold frequency */
/* Configure oscillator */
if(HAL_RCC_OscConfig(&OscInitstruct) != HAL_OK)
{
APP_ErrorHandler();
}
ClkInitstruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
ClkInitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; /* Select HSI as system clock */
ClkInitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB clock 1 division */
ClkInitstruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB clock 1 division */
ClkInitstruct.APB2CLKDivider = RCC_HCLK_DIV1; /* APB2 clock 1 division */
/* Configure clock source */
if(HAL_RCC_ClockConfig(&ClkInitstruct, FLASH_LATENCY_0) != HAL_OK)
{
APP_ErrorHandler();
}
}
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void APP_ErrorHandler(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.
* @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) */
/* Infinite loop */
while (1)
{
}
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT Puya *****END OF FILE******************/