HAL_Project/Project -APP-V1.0/Hardware/SYSINIT/systeminit.c

141 lines
4.0 KiB
C
Raw Permalink Normal View History

2025-05-09 15:43:42 +08:00
#include "main.h"
/**
* @brief System Clock Configuration
* @retval None
*/
void systemClockInit(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** 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.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief <EFBFBD><EFBFBD>ȷ΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SysTick<EFBFBD><EFBFBD>
* @param us Ҫ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1\~65535<EFBFBD><EFBFBD>
* @note <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>72MHzϵͳʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD><EFBFBD>1us
*/
void delayUs(uint16_t us)
{
uint32_t start = SysTick->VAL;
uint32_t ticks = us * (SystemCoreClock / 1000000); // 72MHzʱticks=72*us
// <20><><EFBFBD><EFBFBD>SysTick<63><6B><EFBFBD><EFBFBD>ֵ<EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD>
if(start < ticks)
{
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(SysTick->VAL > start); // <20>ȴ<EFBFBD>VAL<41><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>start
while(SysTick->VAL < (SysTick->LOAD - (ticks - start)));
}
else
{
// <20><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
while((SysTick->VAL < start) && (SysTick->VAL >= (start - ticks)));
}
}
///**
// * @brief ΢<><EFBFBD><EBBCB6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
// * @param us ΢<><CEA2><EFBFBD><EFBFBD> (0\~65535)
// * @note <20><><EFBFBD><EFBFBD>SysTick<63><6B>ʱ<EFBFBD><CAB1>ʵ<EFBFBD>֣<EFBFBD>ϵͳʱ<CDB3><CAB1>72MHzʱ<7A><CAB1><EFBFBD><EFBFBD><1us
// */
//void delayUs(uint16_t us)
//{
// uint32_t ticks = us * (SystemCoreClock / 1000000);
// uint32_t start = DWT->CYCCNT;
//
// // <20><><EFBFBD><EFBFBD>DWT<57><54><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ʹ<EFBFBD><CAB9>SysTick
// if((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && DWT->CTRL & DWT_CTRL_CYCCNTENA_Msk)
// {
// while((DWT->CYCCNT - start) < ticks);
// }
// else
// {
// // <20><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>SysTickʵ<6B>֣<EFBFBD><D6A3><EFBFBD>Ҫ<EFBFBD>ȳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
// HAL_SYSTICK_Config(SystemCoreClock / 1000000); // <20><>װ<EFBFBD><D7B0>ֵ=72
// HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//
// for(; us > 0; us--)
// {
// SysTick->VAL = 0; // <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
// while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
// }
// }
//}
///**
// * @brief <20><>ʼ<EFBFBD><CABC>DWT(Data Watchpoint Trace)<29><><EFBFBD>ھ<EFBFBD>ȷ<EFBFBD><C8B7>ʱ
// * @retval None
// */
//void dwtInit(void)
//{
// if(!(CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk))
// {
// CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
// DWT->CYCCNT = 0;
// DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
// }
//}
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#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 CODE BEGIN 6 */
/* 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) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */