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

请教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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版