打印

新手stm32的3.4库中SYSTICK的问题请教大虾

[复制链接]
3797|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sulh|  楼主 | 2011-6-6 06:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大虾们个问题,3.4库中DELAY()的用法,已经知道想要毫秒级延时,用
SysTick_Config( SystemCoreClock / 1000 );
if( SysTick_Config( SystemCoreClock / 1000 ))

{

while(1);

}  

此时DELAY(1000)为1ms
于是想用微秒级的延时,把上面1000改为1000000,
再DELAY(1000000),应该是也是1ms啊,怎么不工作呢?
新手求解!!!!
沙发
sulh|  楼主 | 2011-6-6 07:19 | 只看该作者
补充,改成100000还有用,再加个0就不干活了,求解怎样delay 1us

使用特权

评论回复
板凳
610095871| | 2011-6-6 17:59 | 只看该作者
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
void delay_init(u8 SYSCLK)
{
        SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
        fac_us=SYSCLK/8;                    
        fac_ms=(u16)fac_us*1000;
}               


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;       //清空计数器         
}

使用特权

评论回复
地板
sulh|  楼主 | 2011-6-6 18:26 | 只看该作者
3# 610095871 非常感谢楼上,很好用,比固件库方便。

想理解一下,用固件库有没有方法呢?为什么我用固件库这个方法不行。

使用特权

评论回复
5
lip0201| | 2011-6-6 19:07 | 只看该作者
最近也一直纠结这个问题呢,发现SysTick的固件库不好用

使用特权

评论回复
6
610095871| | 2011-6-7 09:18 | 只看该作者
不是的 其实用固件库有用固件库的方便,这个延时用固件库也可以,等有时间了我把固件库做的给你发上来,你们看的是例程上的把 他用的是中断,最好看一下他的源代码,在keil上寻找源代码是很简单方便的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
sulh + 1
7
610095871| | 2011-6-7 17:15 | 只看该作者
static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数
void delayinit(u8 Systick)
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
        fac_us=Systick/8;
        fac_ms=(u16)fac_us*1000;
}
void delay_ms(u16 nms)
{
        u32 temp;
        SysTick_SetReload(nms*fac_ms);
        SysTick_CounterCmd(SysTick_Counter_Clear);
        SysTick_CounterCmd(SysTick_Counter_Enable);
        do
        {
                temp=SysTick_GetCounter();
        } while(temp);//等待时间到达
        SysTick_CounterCmd(SysTick_Counter_Disable);
        SysTick_CounterCmd(SysTick_Counter_Clear);
}
固件库写的

使用特权

评论回复
8
sulh|  楼主 | 2011-6-7 19:29 | 只看该作者
7# 610095871 再次感谢楼上的热心帮助

使用特权

评论回复
9
lip0201| | 2011-6-8 10:47 | 只看该作者
LZ我用的3.5的库,7楼用的函数怎么找不到呢,用了的话,提示没有定义
SysTick_SetReload(nms*fac_ms);
SysTick_CounterCmd(SysTick_Counter_Clear);
SysTick_CounterCmd(SysTick_Counter_Enable);
我只找到了SysTick_Config()和 SysTick_CLKSourceConfig()两个函数

使用特权

评论回复
10
610095871| | 2011-6-9 19:34 | 只看该作者
9# lip0201
应该是固件库不一样,建议对照上面的写寄存器的例子,然后根据你的固件库自己写。

使用特权

评论回复
11
qq363155763| | 2012-7-29 23:12 | 只看该作者
4# sulh 请问大侠丫,这个初始化函数void delay_init(u8 SYSCLK)  的参数应该填多少啊??8M???在的回复一下,我搞不懂这个地方、、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

16

帖子

1

粉丝