6211|10

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STR912定时器问题~~请大侠帮我看一下 [复制链接]

void SCU_Configuration(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  TIM_InitTypeDef   TIM_InitStructure;
  UART_InitTypeDef UART_InitStructure;
  
/* SYSTEM CLOCK Configuration ------------------------------------------------*/
  //CPU = 25MHZ
  SCU_MCLKSourceConfig(SCU_MCLK_OSC);
  
  SCU_RCLKDivisorConfig(SCU_RCLK_Div8);
  SCU_HCLKDivisorConfig(SCU_HCLK_Div1);
  SCU_PCLKDivisorConfig(SCU_PCLK_Div1);
  SCU_BRCLKDivisorConfig(SCU_BRCLK_Div2); //24MHZ
  
  //PLL = 96MHz
  SCU_PLLCmd(DISABLE);
  SCU_PLLFactorsConfig(0xC0,0x19,0x2);
  SCU_PLLCmd(ENABLE);
  //CPU = 96MHZ
  SCU_MCLKSourceConfig(SCU_MCLK_PLL);

/* SYSTEM interrupt controller Configuration ------------------------------------------------*/
  SCU_AHBPeriphClockConfig(__VIC, ENABLE);
  SCU_APBPeriphReset(__VIC,DISABLE);
  VIC_DeInit();
    
/* TIMER Configuration -------------------------------------------------------*/
  /* TIM0 Deinitialization */
#if 1//定时器开关
  TIM_DeInit(TIM0);
  // Enable TIM0 clocks
  SCU_APBPeriphClockConfig(__TIM01, ENABLE);
  // Release TIM0 reset
  SCU_APBPeriphReset(__TIM01,DISABLE);
  // TIM Configuration in Output Compare Timing Mode period 100us
  TIM_InitStructure.TIM_Mode = TIM_OCM_CHANNEL_1;   // OUTPUT COMPARE CHANNEL 1 Mode
  TIM_InitStructure.TIM_OC1_Modes = TIM_TIMING;     // OCMP1 pin is disabled
  TIM_InitStructure.TIM_Clock_Source = TIM_CLK_APB; // assign PCLK to TIM_Clk
  TIM_InitStructure.TIM_Prescaler = 12 - 1;         // 1us resolution
  TIM_InitStructure.TIM_Pulse_Length_1 = 1000;       // 1 ms period
  TIM_Init(TIM0, &TIM_InitStructure);
  // VIC configuration
  VIC_Config(TIM0_ITLine, VIC_IRQ, TIM0_ITLine);
  //VIC_Config(TIM0_ITLine, VIC_IRQ, 0);
  VIC_ITCmd(TIM0_ITLine, ENABLE);
  /* Clear TIM0 ISR registers */
  TIM_ClearFlag(TIM0, TIM_FLAG_OC1| TIM_FLAG_OC2| TIM_FLAG_TO|TIM_FLAG_IC1|TIM_FLAG_IC2);
  /* Enable TIM0 IC1 interrupt */
  TIM_ITConfig(TIM0, TIM_IT_OC1, ENABLE);
  /* Start the counter of TIM0 */
  TIM_CounterCmd(TIM0, TIM_START);
  #endif
  
/* GPIO Configuration --------------------------------------------------------*/
  SCU_APBPeriphClockConfig(__GPIO3, ENABLE); /* Enable the clock for GPIO3 */
  GPIO_DeInit(GPIO3);                        /* GPIO3 Deinitialization */
  SCU_APBPeriphClockConfig(__GPIO5, ENABLE); /* Enable the clock for GPIO5 */
  GPIO_DeInit(GPIO5);
  
  GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//GPIO_Pin_0 |GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
  GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt1;
  GPIO_Init (GPIO3, &GPIO_InitStructure);
  
  /*Gonfigure UART0_Rx pin GPIO5.1*/
  GPIO_InitStructure.GPIO_Direction = GPIO_PinInput;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
  GPIO_InitStructure.GPIO_IPConnected = GPIO_IPConnected_Enable;
  GPIO_InitStructure.GPIO_Alternate = GPIO_InputAlt1;
  GPIO_Init (GPIO5, &GPIO_InitStructure);
  /*Gonfigure UART0_Tx pin GPIO3.4*/
  GPIO_InitStructure.GPIO_Direction = GPIO_PinOutput;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Type = GPIO_Type_PushPull ;
  GPIO_InitStructure.GPIO_Alternate = GPIO_OutputAlt3  ;
  GPIO_Init (GPIO3, &GPIO_InitStructure);

/* UART Configuration --------------------------------------------------------*/
  // Release reset and enable clock
  UART_DeInit(UART0);
  // Enable UART0 clocks
  SCU_APBPeriphClockConfig(__UART0, ENABLE);
  // Release UART0 reset
  SCU_APBPeriphReset(__UART0, DISABLE);
  
  UART_InitStructure.UART_WordLength = UART_WordLength_8D;
  UART_InitStructure.UART_StopBits = UART_StopBits_1;
  UART_InitStructure.UART_Parity = UART_Parity_No ;
  UART_InitStructure.UART_BaudRate = 115200;
  UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
  UART_InitStructure.UART_Mode = UART_Mode_Tx_Rx;
  UART_InitStructure.UART_FIFO = UART_FIFO_Disable;
  UART_Init(UART0, &UART_InitStructure);
  UART_DMACmd(UART0,UART_DMAReq_Tx | UART_DMAReq_Rx, DISABLE);
  // Enable and configure the priority of the UART0 Update IRQ Channel
 // VIC_Config(UART0_ITLine, VIC_IRQ, 14);
 VIC_Config(UART0_ITLine, VIC_IRQ, 0);

  VIC_ITCmd(UART0_ITLine, ENABLE);
  /* Enable UART interrupt */
  UART_ITConfig(UART0, UART_IT_Receive, ENABLE);
  /* Enable the UART0 */
  UART_Cmd(UART0, ENABLE);
  
  // Enable the Interrupt controller to manage IRQ channel
  __enable_interrupt();
}


//定时器中断
void TIM0_IRQHandler(void)
{
          TIM0->CNTR=0;
        //TIM_CounterCmd(TIM0, TIM_START);
    /* Clear TIM0 ISR registers */
      TIM_ClearFlag(TIM0, TIM_FLAG_OC1);
 }


//UART0 中断
void UART0_IRQHandler(void)
{
  unsigned char data1;
  
   data1 = UART_ReceiveData(UART0);         
   UART_SendData(UART0, data1);  // resend received data 
      
  /* Clear the UART0 Receive interrupt */
  UART_ClearITPendingBit(UART0, UART_IT_Receive);
}

当我定时器打开的时候,UART接收会收漏丢!如果,把定时器关了,就收得很正常~
 谁帮我看一下,竟究是什么问题,谢谢!!!

此帖出自stm32/stm8论坛

最新回复

                                 如果每个人都能够把自己解决问题的方法介绍出来,这样既帮助了别人,也帮助了自己,因为你发表结果时又重新整理了一下自己的思路。再次谢谢所有与大家分享心得的朋友。   详情 回复 发表于 2007-9-11 16:53
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

哪位大哥,有遇到这问题的?帮小弟看一下~伤脑筋!!

                                 是不是我的定时器中断设置有问题?
此帖出自stm32/stm8论坛
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

程序这么长,很少有人会有耐心去看的

                                 LZ还是说说你的时钟中断的频率和时钟中断里都做了什么事情,估计是你的时钟中断太频繁了或占用时间太长,造成UART的中断来不及相应;还有一种情况是UART中断中做的事情太多,UART中断又被时钟中断打断,造成UART中断处理不能正常完成。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 

谢谢你-浪淘沙

我的时钟中断大概10ms中断一次,时钟中断就清中断标记位,没有做其它东西了!UART 中断接到的数据,回传到PC机,也没做其它东西了~

//UART0 中断
void UART0_IRQHandler(void)
{
  unsigned char data1;
  __disable_interrupt();-->关中断
   data1 = UART_ReceiveData(UART0);         
   UART_SendData(UART0, data1);  // resend received data 
      
  /* Clear the UART0 Receive interrupt */
  UART_ClearITPendingBit(UART0, UART_IT_Receive);
 __enable_interrupt();-->打开中断
}


//定时器中断
void TIM0_IRQHandler(void)
{
          TIM0->CNTR=0;
         /* Clear TIM0 ISR registers */
      TIM_ClearFlag(TIM0, TIM_FLAG_OC1);
}
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 

可能原因!

 在开中断前请设置默认中断处理程序:
 VIC0->DVAR = (UINT32)DFT_IRQHandler;
 VIC1->DVAR = (UINT32)DFT_IRQHandler;

  该defect是由于CPU与VIC间通讯速度造成的.STR912中断进入时间在10us以下(CPU CLK 96MHz) . 
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 

请确认进定时器中断只有一种条件

                                 你在定时器中断只清除了一个中断标志,你是否能肯定只有一种条件可以产生定时器中断?如果不能肯定的话,你的定时器中断会不断地重复进入。
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 

Overrun

你好

你运行的时候,UART0的"overrun bit"有没有变到1?

请问,为什么你用一个很低的频率(12Mhz)

Best Regards,
Stephane
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 

定时器中断 的标记,没清

但是TIMO->SR 也清不了为0.奇怪!!!!


void TIM0_IRQHandler(void)
{
      __disable_interrupt();
    
              while ((TIM0->SR)!=0)
            {
                TIM0->SR = 0;
            }
      

    
    
      __enable_interrupt();
}
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

9
 

debug模式

请问,你调试的时候你有没有把定时器的时钟关掉?

时钟没有关掉的话定时器会继续运行,

你可以用这个函数:
SCU_APBPeriphDebugConfig(__TIM01, DISABLE);

Regards,
Stephane
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 

问题已经解决,开了FIFO 就好了!!

可能是频繁定时器中断,UART数据被盖了!

谢谢,你们的热心帮助^00^.
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 

谢谢楼主分享心得!

如果每个人都能够把自己解决问题的方法介绍出来,这样既帮助了别人,也帮助了自己,因为你发表结果时又重新整理了一下自己的思路。

再次谢谢所有与大家分享心得的朋友。
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表