kimding 发表于 2019-8-30 17:44:40

请教STM8的TIM4的配置


新人一枚,百思不得其解,跑来请教大神

/*    添加包含芯片的头文件    */
#include<iostm8s103f3.h>


/*******************************************************************************
**函数名称: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 (每8us计数值加1)
                                                         
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
}


/*******************************************************************************
**函数名称:void LED3_Init()
**功能描述:LED3->功能引脚初始化
**入口参数:无
**输出:无
*******************************************************************************/
void LED3Init()
{
   
PC_DDR_bit.DDR6 = 1;    //设置端口PC->6的输入输出方向寄存器为输出方向
PC_CR1_bit.C16 = 1;   //PC->6为推挽输出
PC_CR2_bit.C26 = 1;   //PC->6是输出速度最快为10MHz
}




/*    主函数    */
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.对TIM4_EGR事件产生寄存器,UG置1,会有什么变化?(是立即产生中断?还是由我设置了初值后,溢出产生中断?)


2.对UG的理解(请指正):
>>>>>>>>>UG置1,是不是会产生更新中断请求,收到请求后,硬件会将更新中断标志UIF置1,与中断使能寄存器IER的UIE无关


3.为什么溢出后IER寄存器的UIF都复位了,还需要清零?


4.为啥定时器4参进行精确延时,最大65535?(我认为是例程编写者可能说错了)

mylovemcu 发表于 2019-9-4 09:28:51

1、UG置1立即产生中断

3、UIF是硬件置位需要软件清除
4、定时器是16位的定时器,计数器最大就到65535,初始化的时候将定时器的频率设置为1ms,那么最大延时就是65535ms,如果时间不够,可以更改定时器频率,但是跨度就是65535

kimding 发表于 2019-9-4 21:05:20

mylovemcu 发表于 2019-9-4 09:28
1、UG置1立即产生中断

3、UIF是硬件置位需要软件清除


感谢你的解答,我的疑问是TIM4是一个8位定时器呀

mylovemcu 发表于 2019-9-5 07:53:00

kimding 发表于 2019-9-4 21:05
感谢你的解答,我的疑问是TIM4是一个8位定时器呀

啊 不好意思看错了TIM4是8位定时器初始化以后是1ms的中断定时在延时函数里定义的int类型是16位的最大到65535如果想加大数据可以换成long型的

kimding 发表于 2019-9-9 08:59:14

mylovemcu 发表于 2019-9-5 07:53
啊 不好意思看错了TIM4是8位定时器初始化以后是1ms的中断定时在延时函数里定义的int类型是16位的 ...

明白了
:)
页: [1]
查看完整版本: 请教STM8的TIM4的配置