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

141 lines
4.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 精确微秒延时函数基于SysTick
* @param us 要延时的微秒数1\~65535
* @note 适用于72MHz系统时钟误差<±1us
*/
void delayUs(uint16_t us)
{
uint32_t start = SysTick->VAL;
uint32_t ticks = us * (SystemCoreClock / 1000000); // 72MHz时ticks=72*us
// 处理SysTick重载值边界情况
if(start < ticks)
{
// 需要跨过重载点的情况
while(SysTick->VAL > start); // 等待VAL从重载值递减到start
while(SysTick->VAL < (SysTick->LOAD - (ticks - start)));
}
else
{
// 普通情况
while((SysTick->VAL < start) && (SysTick->VAL >= (start - ticks)));
}
}
///**
// * @brief 微秒级延时函数
// * @param us 微秒数 (0\~65535)
// * @note 基于SysTick定时器实现系统时钟72MHz时误差<1us
// */
//void delayUs(uint16_t us)
//{
// uint32_t ticks = us * (SystemCoreClock / 1000000);
// uint32_t start = DWT->CYCCNT;
//
// // 如果DWT不可用则使用SysTick
// if((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && DWT->CTRL & DWT_CTRL_CYCCNTENA_Msk)
// {
// while((DWT->CYCCNT - start) < ticks);
// }
// else
// {
// // 备用方案SysTick实现需要先初始化
// HAL_SYSTICK_Config(SystemCoreClock / 1000000); // 重装载值=72
// HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
//
// for(; us > 0; us--)
// {
// SysTick->VAL = 0; // 清空计数器
// while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
// }
// }
//}
///**
// * @brief 初始化DWT(Data Watchpoint Trace)用于精确计时
// * @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 */