历史上的今天
今天是:2025年04月25日(星期五)
2020年04月25日 | STM8定时器实现精准延时(阻塞)
2020-04-25 来源:eefocus
定时器选择:
stm8定时器与stm32定时器略有不同,stm32定时器是24位--16,777,216,按照72M时钟8分频计算,周期达到1.86s左右,而stm8定时器是16/8--位65535/255,自身时钟为16M,即使16分频周期也远小于1s。
当前选择TIM2定时器,1分频,最大周期65536/16 约等于 4096us。
初始化
void TIM_Delay_Init()
{
/* 自动重装载值范围TIM4为0~255,TIM2为0~65535*/
TIM2_TimeBaseInit(TIM2_PRESCALER_1,65535); //65535*(1/16)≈4095us
TIM2_Cmd(DISABLE); //关闭定时器
}
延时函数
延时函数中最好采用寄存器操作,降低运算量,减小误差。
void TIM_Delay_us(uint16_t nus)
{
uint16_t value = nus*16;
TIM2->CNTRH = 0; //计算值清零
TIM2->CNTRL = 0;
TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN; //开始计时
while(TIM2_GetCounter() < value)
{
/*if(TIM2_GetFlagStatus(TIM2_FLAG_UPDATE)) //达到单次us最大延时时间
{
TIM2_ClearFlag(TIM2_FLAG_UPDATE);
break;
}*/
};
TIM2->CR1 &= (uint8_t)(~TIM2_CR1_CEN);//停止计时
}
结语
选择8位的定时器(TIM4)时,一分频时周期为16us,二分频时周期为32us,ms延时情况下则可以5/10/20us等作为延时周期,实现Delay_10us()、Delay_N_10us()等函数即可。
下一篇:STM8使用STVD开发环境问题
史海拾趣
|
VOID WRITE_PORT_UCHAR( PUCHAR Port, UCHAR Value ); 调用这个函数会读什么地方的数据(数据从那个口得到,地址线是哪个)? port这个参数是怎么的到是PA\\PB\\PC之类的口吗?地址怎么得到?… 查看全部问答> |
|
内核 下到 板子上后,怎么调试? 目前是下载成功后,debuger 工具栏出来了,但选break时,没有反应,是什么问题? ABW tH Bs\'-ojG 在在SETTING 里选哪几个项目? 和这里的选项有关么? FIoS[MBH ...… 查看全部问答> |
|
一个无线Zigbee网络的两个设备对传,发射端有一串比较长的字符串需要发送,我的方法是:把它分割成适合长度的字符串,先发送第一个小字符串,接着进入一个循环,等待接收机返回的确认信号后再发下一串字符串 k =StringLength/SuitLength; //k定义 ...… 查看全部问答> |
|
1 、 Ucos 的信号量实现还是比较简单的。这里的简单指的是其代码易读,易理解。 简单来说,需要是实现信号量计数与任务挂起列表的实现。对于任务代码而言,信号量提供了共享资源与同步的支持。而信号量本身的实现,则是通过开断中断实现临界区的访 ...… 查看全部问答> |
|
热敏电阻Rt温度会随温度变化,Rt和R1分压之后,输出经过跟随器送到CC2530的AD输入引脚。 这个用法适合精度要求不高的应用;R1取值要求能够让Rt阻值变化,输出较大的电压变化,另一方面流过Rt电流不要太大,避免Rt自身发热影响测量;跟随器隔离AD输 ...… 查看全部问答> |
|
之前把单片机用焊台调了350度左右来焊接,焊接有错,再用热风枪400度把它拆卸下来了,再重新焊接成功后,发现程序下载不了mcu里面了。。。。不知道是不是把单片机烧坏了,求各位大虾赐教,小弟感激不尽… 查看全部问答> |
|
我用MSP430F149单片机的ADC采样电源电压,用的内部2.5V标准电压,电源电压最大4V,所以我用10K的电阻分压,可是最终采样到的电压为0V,不知道哪里出了问题?还请高手帮忙分析一下,同样的程序我用开发板测量电池的电阻分压后的电压,显示正常… 查看全部问答> |
|
请问有用过LPC4357带有SDRAM存储器的吗?这个速度最高做到多少?按照勘误手册,不能超过100M。我的板子在96M,有的甚至90M都不稳定,整块读取正常,但是随机读取就容易出现进入硬件错误中断的情况。不知道大家在高速率下的各寄存器是如何配置的。… 查看全部问答> |




