STM32之SysTick例程

#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)
{
	
}

猜你喜欢

转载自blog.csdn.net/lushoumin/article/details/87375605