OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5853|回复: 6

STM32上的滴答时钟

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
681
金钱
681
注册时间
2013-8-16
在线时间
37 小时
发表于 2013-10-31 15:09:24 | 显示全部楼层 |阅读模式
您好源自个,我现在急需要使用滴答时钟做精准的延时函数,可是我按照滴答时钟的操作手册初始化了,可是没有办法用,我找了很久没有查查处原因,希望能够指点一下。下面是我写的代码。
#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);灯灭
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-10-31 15:49:44 | 显示全部楼层
回复【楼主位】星空:
---------------------------------
建议楼主在操作 SysTick->CTRL 寄存器的时候不要直接赋值,用与、或等操作比较好点,这样可以对某些位进行单独操作。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
681
金钱
681
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2013-10-31 18:26:40 | 显示全部楼层
谢谢。我按照你的建议修改了一下仍然没有办法使用滴答时钟定时,每一次都在在循环中跑不走出去
回复 支持 反对

使用道具 举报

70

主题

6766

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13146
金钱
13146
注册时间
2012-11-26
在线时间
3816 小时
发表于 2013-10-31 18:44:41 | 显示全部楼层
回复【3楼】星空:

谢谢。我按照你的建议修改了一下仍然没有办法使用滴答时钟定时,每一次都在在循环中跑不走出去

---------------------------------
战舰例程不是有现成的
学无止境
回复 支持 反对

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
681
金钱
681
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2013-11-1 09:33:19 | 显示全部楼层
我是按照我买的那块战舰板上的IIC例程做的,可是依旧会死在循环中,是不是对于不同芯片设置上有区别,还是我有什么 头文件没有加上,使得滴答时钟不能工作。我在网上找了一下,全都是按照我写的那个方法做的啊。所以不明白错在什么地方。还请各位大哥指点指点。
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-11-1 10:10:22 | 显示全部楼层
回复【5楼】星空:
---------------------------------
不要用单步仿真,用跳出,如果跳不出才是程序问题。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
681
金钱
681
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2013-11-1 17:33:54 | 显示全部楼层
谢谢,我刚才按照你说的方法做了,跳的出来,我焊接了一下接线,现在完全正常了,谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 20:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表