你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教STM8的TIM4的配置

[复制链接]
kimding 提问时间:2019-8-30 17:44 /

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

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

收藏 评论4 发布时间:2019-8-30 17:44

举报

4个回答
mylovemcu 回答时间:2019-9-4 09:28:51
1、UG置1  立即产生中断

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

评分

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

查看全部评分

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位的 ...

明白了
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版