|
发表于 2011-3-9 21:31:21
|
显示全部楼层
回复【楼主位】zhangyang86 张洋
-----------------------------------------------------------------------
楼主你好,由于3.3.0库没有了systick函数操作,所以用了你里面的直接操作寄存器的方法。但是延时有点问题呢,想请教下。
/********************************************************************************
* @file SysTick/main.c
* @author swei
* @version V3.3.0
* @date 10/20/2010
* @brief Main program body.
******************************************************************************/
/*
Systick是一个24位的倒计数定时器,当记到0时,将从RELOAD寄存器中自动重新装载定时初值。
只要不把它在Systick控制及状态寄存器中的使能位清除,就永不停息。
*/
#include "stm32f10x.h"
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
void RCC_Configuration(void);
void GPIO_Configuration(void);
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
int main(void)
{
SystemInit();
RCC_Configuration();
GPIO_Configuration();
delay_init(72);
while(1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_9);
delay_ms(1000);
GPIO_SetBits(GPIOD,GPIO_Pin_9);
delay_ms(1000);
}
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
//fac_ms = 1000;
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
我想延时1s,但实际延时达9秒之久啊。
知识逻辑分析仪的图片。 (原文件名:Systick_9.png)
然后我把fac_ms=(u16)fac_us*1000改成fac_ms = 1000;延时挺准的,刚好一秒啊。
(原文件名:Systick.png)
能找找原因吗,有点纳闷了。。。? |
|