搜索
查看: 885|回复: 4

[求助] 请教STM8的TIM4的配置

[复制链接]

该用户从未签到

3

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2019-11-22
发表于 2019-8-30 17:44:40 | 显示全部楼层 |阅读模式

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

/*    添加包含芯片的头文件    */
#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?(我认为是例程编写者可能说错了)

回复

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-9-4 09:28:51 | 显示全部楼层
1、UG置1  立即产生中断

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2019-11-22
 楼主| 发表于 2019-9-4 21:05:20 | 显示全部楼层
mylovemcu 发表于 2019-9-4 09:28
1、UG置1  立即产生中断

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

感谢你的解答,我的疑问是TIM4是一个8位定时器呀
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

736

帖子

256

蝴蝶豆

论坛元老

最后登录
2021-4-20
发表于 2019-9-5 07:53:00 | 显示全部楼层
kimding 发表于 2019-9-4 21:05
感谢你的解答,我的疑问是TIM4是一个8位定时器呀

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

使用道具 举报

该用户从未签到

3

主题

10

帖子

0

蝴蝶豆

初级会员

最后登录
2019-11-22
 楼主| 发表于 2019-9-9 08:59:14 | 显示全部楼层
mylovemcu 发表于 2019-9-5 07:53
啊 不好意思  看错了  TIM4是8位定时器  初始化以后是1ms的中断定时  在延时函数里定义的int类型是16位的 ...

明白了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-25 07:09 , Processed in 1.165671 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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