您好源自个,我现在急需要使用滴答时钟做精准的延时函数,可是我按照滴答时钟的操作手册初始化了,可是没有办法用,我找了很久没有查查处原因,希望能够指点一下。下面是我写的代码。
#include "stm32f10x.h"
#define SysTick_CTRL 0xE000E010
#define SysTick_LOAD 0xE000E014
#define SysTick_VAL 0xE000E018
u32 f_us=0;
u32 f_ms=0;
//滴答时钟的初始化
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
f_us=SYSCLK/8;
f_ms=(u16)f_us*1000;
}
//延时毫秒
void delay_ms(u16 nms)
{
u32 tp;
SysTick->LOAD=(u32)nms*f_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
tp=SysTick->CTRL;
}
while(tp&0x01&&!(tp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时微秒
y_us(u32 nus)
{
u32 tp;
SysTick->LOAD=nus*f_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
tp=SysTick->CTRL;
}
while(tp&0x01&&!(tp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
int mian(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );
SystemInit();
//滴答时钟初始化
delay_init();
//LED初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
while(1)
{
delay_ms(1000);
GPIO_SetBits(GPIOC,GPIO_pin_9);//灯亮
delay_ms(1000);
GPIO_ResetBits(GPIOC,GPIO_Pin_9);灯灭
}
}