141 lines
4.0 KiB
C
141 lines
4.0 KiB
C
|
|
#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 */
|