[Cortex-M0技术交流] NANO100 I2C影响定时器的奇怪事件?

[复制链接]
3581|9
 楼主| jgphu 发表于 2012-7-20 10:23 | 显示全部楼层 |阅读模式
本帖最后由 jgphu 于 2012-7-20 10:33 编辑

我用定时器定时1S钟,在定时中断回调函数中置一个标志。

void Timer0_Callback(void)
{
  F_Timer0_1sTimeOut = 1;
}


在MAIN函数中调用这个标志

  while(1)
  {
    if(F_Timer0_1sTimeOut)
    {
      F_Timer0_1sTimeOut = 0;
      printf("\r\nmcu run normal!!!");
//      Bsp_I2C0ReadDevice(0x1a, 0x04, 2);
    }
  }

当注释读I2C器件时,每一秒中打印一次mcu run normal!!!。

但是当每隔1S钟调用一次读I2C器件时,这个定时就不准了,测了一下几MS执行一次。

我反复试过,是这个读I2C对定时有影响


我的I2C读是采用中断方式的。读器件是成功的。
 楼主| jgphu 发表于 2012-7-20 10:32 | 显示全部楼层
我用的是NANO100
X-Hawk 发表于 2012-7-20 11:07 | 显示全部楼层
Bsp_I2C0ReadDevice 有等待吧
 楼主| jgphu 发表于 2012-7-20 11:20 | 显示全部楼层
没有等待

void Bsp_I2C0ReadDevice(uint16_t deviceaddr, uint16_t addr, uint8_t num)
{
  I2C_0.State = I2C_START;
  I2C_0.DeviceAddr = deviceaddr;
  I2C_0.RegAddr = addr;
  I2C_0.Rx_Cnt = num;
  I2C_0.Cnt = 0;
  
  /* Open I2C0, and set clock = 100Kbps */
  DrvI2C_Open(I2C_PORT0, 100000);
  /* Get I2C0 clock */
  uint32_t data = DrvI2C_GetClockFreq(I2C_PORT0);
  printf("\r\nI2C0 clock %d Hz", (uint32_t)data);
  
  /* Enable I2C0 interrupt and set corresponding NVIC bit */
  DrvI2C_EnableInt(I2C_PORT0);
  
  /* Uninstall I2C0 call back function for write data to slave */
  DrvI2C_UninstallCallBack(I2C_PORT0, I2CFUNC);
  /* Install I2C0 call back function for read data from slave */
  DrvI2C_InstallCallback(I2C_PORT0, I2CFUNC, I2C0_Callback_Rx);
  
  DrvI2C_Ctrl(I2C_PORT0, 1, 0, 0);  //start
}
X-Hawk 发表于 2012-7-20 11:58 | 显示全部楼层
看来问题有点复杂呢,
会不会有更深层次的原因,比如中断的stack空间不够,stack溢出,正好修改了F_Timer0_1sTimeOut 的值。
又比如F_Timer0_1sTimeOut有没加volatile修饰?怕优化有影响。

评分

参与人数 1威望 +3 收起 理由
YDMCP + 3 很给力!

查看全部评分

 楼主| jgphu 发表于 2012-7-20 13:49 | 显示全部楼层
你说对了,我通过在线调试知道CSTACK达到90%,达其改大点就OK了
 楼主| jgphu 发表于 2012-7-20 13:57 | 显示全部楼层
如果遇到中断的stack空间不够,stack溢出这方面的原因,引起MCU工作不正常。我们如何找出原因。
 楼主| jgphu 发表于 2012-7-20 13:57 | 显示全部楼层
还有一个HEAP
X-Hawk 发表于 2012-7-20 15:08 | 显示全部楼层
也没有太好的办法,
我一般调程序时,发现它运行的完全不合逻辑,没其他想法时,就只好朝stack方面想了。

这件事肯定有兄弟有其他不同的经验,欢迎分享。
john_lee 发表于 2012-7-20 20:04 | 显示全部楼层
是 MDK 吧?
MDK 在设置栈顶位置方面确实有些脑残,按理直接设置到 RAM 末尾不就得了,却偏偏要人为定义一个什么stack区域,实在搞不懂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

642

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部