static int delayLoopCount=400;
void Delay(int time)
{
int i,adjust=0;
if(time==0)//校准
{
time=200;
adjust=1;
delayLoopCount=400;
rWTCON=((MCLK/1000000-1)<<8)|(2<<3); //MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
rWTDAT=0xffff;//for first update
rWTCNT=0xffff;//resolution=64us @any MCLK
rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
}
for(;time>0;time--)
for(i=0;i
if(adjust==1)
{
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop
i=0xffff-rWTCNT; //1count->64us, 200*400 cycle runtime = 64*i us
delayLoopCount=8000000/(i*64); //200*400:64*i=1*x:100 -> x=80000*100/(64*i)
}
}
初看这个函数时有问题的,花了很长时间才搞懂,很经典的一段程序。
(1)这个函数在使用前必须先运行一下Delay(0),这个是关键。它主要完成的是delayLoopCount变量的计算,即100uS的校准。
(2)假设MCLK=66M,
rWTCON=((MCLK/1000000-1)<<8)|(2<<3);经过预分频,输出频率1M,即1us计时; 时钟除数因子=1/64,即看门狗定时器对1M的64分频计数, 计数一次是64us,每64usWTCON减1。
(3) for(i=0;i
(4)用此函数前,先用Delay(0)校准,一个是两个for循环延时。for循环延时同时,定时器计数。
200*400个循环对应------看门狗计数次数i(i=0xffff-rWTCNT,计数一次是64us),延时64*i个us;(200*400)/64i是每个us循环的个数, 100us对应的循环个数,(200*400)*100/64i;
delayLoopCount=8000000/(i*64); 就是100us的for循环个数
关键字:ARM7 S3C44b0 看门狗作 延时函数
引用地址:
ARM7S3C44b0看门狗作延时函数
推荐阅读最新更新时间:2024-03-16 14:32
ARM7入门8,向量IRQ中断
主程序: /******************************************************************************* *File: Main.c *功能: 使能外部中断0和外部中断1,当外部中断0有效时,控制LED1取反; * 当外部中断1有效时,控制LED2取反 *******************************************************************************/ #include config.h #define LED1CON 0x00000400 /*P0.10引脚控制LED1,低电平点亮*
[单片机]
基于ARM7的无线传感器网络节点能量管理初探
1 引言 微小的、资源非常有限的无线传感器网络节点是无传感器网络的基本功能单元,担负着信息采集、数据处理、信息传输等重任。 随着MEMS技术、微电子技术、网络技术和计算机技术的进步,逐渐使得无线传感器网络成为现实。研究人员利用嵌入式技术开发出了小型化板级无线 传感器网络节点,而这在30年前还仅是一种构想;单片无线传感器网络节点也已经问世,但距离实用仍有相当一段路要走。为了研究无线传感器网络的组网技术和 能量管理技术我们采用基于ARM7核的SOC单片机LPC2138开发了一种传感器网络节点(如图1)。 2 节点设计概述 相对于处理器运算速度和功耗提高的幅度而言,电池性能的提高则
[单片机]
基于arm7的(lpc2388)flash的读写操作
开始工作不久就碰到一个flash读写的问题。是一块lpc2388的芯片(arm7), 开始总是抱着一arm11的flash读写的方式去看数据手册。看了好长时间都没有一个很好的解决方发。 后来我在keil的库文件中找到:flash的写入方式。如下://C:\Keil\ARM\Flash\LPC2888\FlashPrg.c /* * Program Page in Flash Memory * Parameter: adr: Page Start Address * sz: Page Size * buf: Page Data * Return Value: 0
[单片机]
STM8,延时函数
照搬原子哥的代码:http://www.openedv.com/posts/list/17347/htm 原子哥的教程有比较详细的注释和网友回复,这里仅作记录 这是基于IAR的,原子哥的帖子下面有网友回复的STVD的 main.c #include stm8l15x_conf.h volatile u8 fac_us=0; void delay_init(u8 clk) { if(clk 16)fac_us=(16-4)/4; else if(clk 4)fac_us=(clk-4)/4; else fac_us=1; } void delay_us(u16 nus) { __asm( PUSH A n
[单片机]
基于ARM7的RTU微控制器的设计
引言
随着我国在水情数据采集系统的信息化和现代化步伐的加快,需要采集的数据种类增多,采集的站点数增加,对数据采集的速度和质量都提出了新的要求,传统的水情数据测报系统的RTU(远端数据采集器)已不能适应新的要求,亟需开发新的产品。
新开发的RTU,其处理能力要比较强,可扩展性要比较好,运行的软件系统具有可移植性,可以移植到不同的硬件平台,可以根据需要配置不同的传感器。为此技术上选用成熟可靠的RTOS 和层次化、构件化的设计思想构建平台软件,保证软件稳定、可靠,扩充新业务功能时软件结构体系保持不变。
RTU 对外有各种类型的传感器接口及通信接口,平时处于守侯状态,当有外部事件或定时处理事件时,由中断信号唤醒CPU 进行相应
[嵌入式]
ADI新款精密模拟微控制器集成了片上数据转换器
Analog Devices, Inc.推出两款高集成度精密模拟微控制器,分别为 ADuC7023 和 ADuC7122。这两款器件集成了片上存储器、数据转换器和众多模拟外设,可提供业界最高水平的可编程性能和最小的封装尺寸。ADuC7023 和 ADuC7122 精密模拟微控制器采用闪存容量高达 126KB 的 ARM7 处理器,可以在基于固定和可调谐频率激光的光收发器和模块应用中实现数字诊断,并能确保精确控制光驱动器和诊断过程。
这两款最新的微控制器集成了片上12位 ADC(模数转换器)和 DAC(数模转换器),与竞争性分立方案相比,这种整体解决方案可减小高达75%的尺寸。ADuC7023 和 ADuC712
[单片机]
STM32 SysTick定时器做延时函数
在STM32中延时函数用的非常广泛,具体延时函数怎么使用,下面我们来进行想详解,本文主要介绍采用SysTick计时器来实验系统延时: 原理介绍: SysTick计时器是一个24位的倒计数定时器,主要用来做操作系统的定时器,每来一个时钟周期计数减1,当计数到0时,他就会自动从LOAD寄存器中自动重装设置的初值,操作时只要不把CTRL寄存器中的ENABLE位清0,它就永远不会停止,即使在睡眠状态他也还是在继续奋斗。 配置代码如下: static u8 fac_us=0;//us延时倍乘数 static u16 fac_ms=0;//ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为HCLK时钟的1/8 //SYSCLK
[单片机]
ARM7单片机(学习ing)—(KZ)、ARM7系列的相关频率的介绍
我之前做的实验中,好多都不知道那个pclk是怎么出来的~~我还纳闷的~~呵呵,这篇就详细介绍了我之前的那个大漏洞~~ 这篇虽然说是篇介绍,但是ARM7里面的频率还是很重要的,尤其是UART~~ 很多人都说FIFO是个大重点~~ 在LPC210X系列的单片机中,IIC、SPI、UART、PWM、定时/计数器还有就是在Startup.s文件里的初始化频率等等都是有关频率的~~ 所以就想把我现在用到的频率的相关知识总结一下~~ 由于前面已经介绍过PLL(锁相环),这里也就不说了~~ 不过可以参考一下PLL的介绍: http://blog.sina.com.cn/s/blog_7ec8fc2c01013b5j.html ARM7系列
[单片机]