在“Template_0”文件夹下建立“Drivers”文件夹,用于存放驱动代码
在“Drivers”文件夹下新建“M429_SysTick.h”和"M429_SysTick.c" ,将"M429_SysTick.c"文件添加到“Drivers”分组中
打开“Options for Target ‘Target 1’” => C/C++,添加“..\Drivers”为包含目录
SystickInit函数定义:
1 int M429_SystickInit(uint32_t plln,uint32_t pllm,uint32_t pllp,uint32_t pllq) 2 { 3 HAL_StatusTypeDef ret = HAL_OK; 4 RCC_OscInitTypeDef RCC_OscInitStructure; 5 RCC_ClkInitTypeDef RCC_ClkInitStructure; 6 7 __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟 8 9 //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作 10 //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有, 11 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1 12 13 RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE 14 RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE 15 RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL 16 RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE 17 RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63. 18 RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432. 19 RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!) 20 RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15. 21 ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化 22 23 if(ret!=HAL_OK) while(1); 24 25 ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能 26 if(ret!=HAL_OK) while(1); 27 28 //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 29 RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2); 30 RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL 31 RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1 32 RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4 33 RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2 34 ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。 35 36 if(ret!=HAL_OK) while(1); 37 38 return ret; 39 }
使用 HAL 库配置 STM32F429 时钟系统的一般步骤:
1. 使能 PWR 时钟
1 __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
之所以要使能 PWR 时钟,是因为后面的步骤中“设置调节器输出电压级别”以及“开启 Over-Driver 功能”都是电源控制相关配置,所以必须开启 PWR 时钟 。
2. 设置调压器输出电压级别
1 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
调压器输出电压级别 VOS,它是由 PWR->CR 的位 15:14 来确定的:
如果希望系统时钟为180M,则需要设置电压级别1,且开启 Over-Driver 功能。
3. 初始化RCC振荡器
1 RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; //时钟源为HSE 2 RCC_OscInitStructure.HSEState=RCC_HSE_ON; //打开HSE 3 RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL 4 RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE 5 RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63. 6 RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432. 7 RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!) 8 RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15. 9 ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化 10 11 if(ret!=HAL_OK) while(1);
4. 选择开启 Over-Driver 功能。
1 ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能 2 if(ret!=HAL_OK) while(1);
5. 初始化CPU,AHB和APB总线时钟。
1 //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 2 RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2); 3 RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL 4 RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1 5 RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4 6 RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2 7 ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。 8 9 if(ret!=HAL_OK) while(1);