打印
[Cortex-M0技术交流]

NANO100 I2C影响定时器的奇怪事件?

[复制链接]
2786|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
}

使用特权

评论回复
5
X-Hawk| | 2012-7-20 11:58 | 只看该作者
看来问题有点复杂呢,
会不会有更深层次的原因,比如中断的stack空间不够,stack溢出,正好修改了F_Timer0_1sTimeOut 的值。
又比如F_Timer0_1sTimeOut有没加volatile修饰?怕优化有影响。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
YDMCP + 3 很给力!
6
jgphu|  楼主 | 2012-7-20 13:49 | 只看该作者
你说对了,我通过在线调试知道CSTACK达到90%,达其改大点就OK了

使用特权

评论回复
7
jgphu|  楼主 | 2012-7-20 13:57 | 只看该作者
如果遇到中断的stack空间不够,stack溢出这方面的原因,引起MCU工作不正常。我们如何找出原因。

使用特权

评论回复
8
jgphu|  楼主 | 2012-7-20 13:57 | 只看该作者
还有一个HEAP

使用特权

评论回复
9
X-Hawk| | 2012-7-20 15:08 | 只看该作者
也没有太好的办法,
我一般调程序时,发现它运行的完全不合逻辑,没其他想法时,就只好朝stack方面想了。

这件事肯定有兄弟有其他不同的经验,欢迎分享。

使用特权

评论回复
10
john_lee| | 2012-7-20 20:04 | 只看该作者
是 MDK 吧?
MDK 在设置栈顶位置方面确实有些脑残,按理直接设置到 RAM 末尾不就得了,却偏偏要人为定义一个什么stack区域,实在搞不懂。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

642

帖子

2

粉丝