/*******************************************************************************
**函数名称:void timer4Init()
**功能描述:定时器4参数初始化
**入口参数:无
**输出:无
*******************************************************************************/
void Timer4Init()
{
TIM4_IER_bit.TIE = 0; // 禁止中断
TIM4_IER_bit.UIE = 0;
TIM4_EGR_bit.UG = 1; // 允许产生更新事件
TIM4_PSCR_bit.PSC = 7; // 计数器时钟=主时钟16MHz / 128 = 125KHz
TIM4_ARR = 125; //设定定时器4产生1毫秒重装载时的计数值,255是最大值
TIM4_CNTR = 0x00; // 设定计数器的初值
}
/*******************************************************************************
**函数名称:void TIM4Delayms(unsigned int ms)
**功能描述:定时器4参进行精确延时,最小为1毫秒,最大65535
**入口参数:unsigned int ms 1=< ms <= 65535
**输出:无
*******************************************************************************/
void TIM4Delayms(unsigned int ms)
{
TIM4_CNTR = 0x00; // 设定计数器的初值
TIM4_CR1_bit.CEN = 1; //启动定时器4开始计数
while(ms--)
{
while(TIM4_SR_bit.UIF == 0); //等待计数是否达到1毫秒
TIM4_SR_bit.UIF = 0; //计数完成1毫秒,清除相应的标志
}
TIM4_CR1_bit.CEN = 0; //延时全部结束,关闭定时器4
}
/* 主函数 */
int main(void)
{
asm("sim"); //关闭系统总中断
CLK_CKDIVR = 0x00; //CPUDIV = 1 HSIDIV = 1 内部时钟 = 16Mhz
Timer4Init(); //调用定时器4初始化函数
LED3Init(); //调用LED3初始化函数
while(1)
{
PC_ODR ^= 0x40; //异或取反PC->6 ,控制LED3进行周期性亮灭亮灭操作
TIM4Delayms(1000); //调用定时器4进行精确延时1000毫秒,即1秒
}
}
问题:
1.第一次运行时,软件置位UG位,会立即更新事件标志位UIF=1,是不是就l立即刷新了定时器TIM4相关寄存器的值?那么第一个1ms定时是不是就不准确,因为UIF已经置1?
2.为啥写定时器4参进行精确延时,最小为1毫秒,最大65535,是不是与单片机的运行速率有关
3.为我讲解一下STM8的定时器延时与定时器中断的区别?(之前学51时不管是延时还是中断都是在定时器的中断服务函数里写,我看这段代码之后就有点迷了)
|