#include "stm32f10x.h"
/* RCC时钟配置 */
void RCC_config()
{
ErrorStatus HSEStartUpStatus;
/* RCC寄存器设置为默认配置 */
RCC_DeInit();
/* 打开外部高速时钟 */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待外部高速时钟稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* 设置HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 设置PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 设置PCLK1 = HCLK / 2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置FLASH代码延时 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能预取址缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 设置PLL时钟源为HSE倍频9 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 设置PLL为系统时钟源 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待系统时钟源切换到PLL */
while(RCC_GetSYSCLKSource() != 0x08);
}
}
/* 系统节拍器配置 */
uint32_t SysTick_config(uint32_t ticks)
{
/* 不能超过24位 */
if((ticks - 1) > SysTick_LOAD_RELOAD_Msk)
return 1;
/* 重载值 */
SysTick->LOAD = (uint32_t)(ticks - 1);
/* 中断优先级最低 */
NVIC_SetPriority(SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1);
/* 当前值清零 */
SysTick->VAL = 0;
/* 选择内核时钟、倒数到0产生异常、使能系统节拍器 */
SysTick->CTRL = (1 << 2) | (1 << 1) | (1 << 0);
return 0;
}
int main(void)
{
/* 时钟配置 */
RCC_config();
/* 系统节拍器配置 */
SysTick_config(72 * 1000);
while(1)
{
}
}
void SysTick_Handler(void)
{
}
STM32之SysTick例程
猜你喜欢
转载自blog.csdn.net/lushoumin/article/details/87375605
周排行