OpenEdv-开源电子网

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

求助定时器准确延时函数t1_delay_us(unsigned t_us)函数!!!本人菜鸟,有可能程序思路出错。

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-4-25
在线时间
0 小时
发表于 2014-4-25 11:20:43 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]//程序目的使用定时器进行准确延时,使LED闪烁。 流程;延时每次都会进入中断关闭计数器,在下一次进入中断时再打开计数器。通过改变计数器初值改变时间延迟。 //仿真现象;LED灯不闪烁,程序按照顺序进行,每次都会进入中断,但定时器不定时??? #include"stm8s103k3.h" _Bool LED1 @PC_ODR:2; void t1_delay_us(unsigned t_us); unsigned int n=0; void TIM1_Init(unsigned us); void GPIO_Init(void); main() { _asm("sim"); GPIO_Init();//初始化GPIO while (1) { LED1=1;//灯亮 t1_delay_us(50000);//延时 LED1=0; //灯灭 t1_delay_us(50000);//延时 } } @far @interrupt void TIM1_OVER_Int(void) { TIM1_SR1 = 0x00;//中断标志位清零 n=1;//进入中断判断位 TIM1_CR1&=0XFE;//关计算器 } void GPIO_Init(void) { PC_DDR = 0x04; PC_CR1 = 0x06; PC_CR2 = 0x02; } void TIM1_Init(unsigned us) { TIM1_PSCRH = 0; TIM1_PSCRL = 19; TIM1_ARRH=(unsigned char)(us>>8);//自动重载 TIM1_ARRL=(unsigned char)us; TIM1_IER=0X01; TIM1_CNTRH=(unsigned char)(us>>8);//赋初值 TIM1_CNTRL=(unsigned char)us; _asm("rim");//开总中断 TIM1_CR1 |=0x01;//开计数器 } void t1_delay_us(unsigned int t_us) { TIM1_Init(t_us); while(n!=1);//判断是否进入中断,如果进入n清零,方便下一一次判断。 n=0; } [/mw_shl_code]

求助定时器准确延时函数t1_delay_us(unsigned t_us)函数!!!本人菜鸟,有可能程序思路出错。如果t1_delay_us(unsigned t_us)可行,想问一下定时误差多大???
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

108

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2013-12-23
在线时间
2 小时
发表于 2014-4-25 11:55:20 | 显示全部楼层
回复【楼主位】cowboy:
---------------------------------
STM32精确延时,寄存器操作。 (2013-12-31 15:13) [编辑] [删除] 转载▼
标签: 杂谈
#include 'stm32f10x.h'
#include 'delay.h'
//延时函数
//仿原子延时,不进入systic中断
//微秒延迟
void delay_us(u32 nus)
{ u32 temp;
 SysTick->LOAD = 9*nus;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do
 {
   temp=SysTick->CTRL;//读取当前倒计数值
 }
 while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
 SysTick->CTRL=0x00; //关闭计数器
 SysTick->VAL =0X00; //清空计数器
  }

//毫秒ms延时 
void delay_ms(u16 nms)
{
 u32 temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空计数器
 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 do
 {
  temp=SysTick->CTRL;//读取当前倒计数值
 }
只要肯努力,知识是自己的,别人拿不走
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-4-25
在线时间
0 小时
 楼主| 发表于 2014-4-26 08:34:37 | 显示全部楼层

对stm32没有了解,请求大神看看我的程序,程序设计思路是;改变定时器的初值,来改变定时时间,进入中断关闭定时器,同时标志位清零,下次定时时再给定时器赋新的初值!!!!!

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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