打印

已解决。I2C问题用置顶程序在WWDG中断仍通不过

[复制链接]
3045|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alenthj|  楼主 | 2009-3-25 19:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, ic, vi, IO, ST
闲话不说。
直接上程序,主要是加了WWDG看门狗并且使用它的中断。主程序里放了看门狗的初始化,中断里面放了看门狗喂狗。其它都按照你2楼的程序没改动。单独使用你的程序没问题,systick中断对它也没影响。但是WWDG通不过,因为WWDG提到它的中断只有复位才能关闭,难道是这个原因,导致你的关中断对它无效?

//【主程序部分】

int main(void)
{
#ifdef DEBUG
  debug();
#endif

  RCC_Configuration();

  NVIC_Configuration();
  

//---------------????????????????--------------------------------
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
  WWDG_SetPrescaler(WWDG_Prescaler_8);
  WWDG_SetWindowValue(65);
  WWDG_Enable(127);
  WWDG_ClearFlag();
  WWDG_EnableIT();    
  
//-----------------?????????????------------------------------  
  
  

  
  I2C_Comm_Init(I2C1, 100000, 0xA0);

  re1=I2C_Comm_MasterWrite(I2C1, 0xa0, 0, Tx1_Buffer, 2);
  re2=I2C_Comm_MasterRead(I2C1, 0xa0, 0, Rx1_Buffer, 5);
  re2=I2C_Comm_MasterRead(I2C1, 0xa0, 0, Rx1_Buffer, 3);
  re2=I2C_Comm_MasterRead(I2C1, 0xa0, 0, Rx1_Buffer, 2);
  re2=I2C_Comm_MasterRead(I2C1, 0xa0, 0, Rx1_Buffer, 1);
  
  while(1)
  {
  re3 = I2C_Comm_MasterWrite(I2C1, 0xa0, 0, Tx1_Buffer, 8);
  if (re3!=NO_ERR)
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
  re4 = I2C_Comm_MasterRead(I2C1, 0xa0, 0, Rx1_Buffer, 8);
  if (re4!=NO_ERR)
    GPIO_SetBits(GPIOA, GPIO_Pin_1);
  }

}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif  

//------------------??????????????-------------------------------  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQChannel; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_Init(&NVIC_InitStructure);  
//-----------------??????????????---------------------------------
}




//【中断WWDG部分】
void WWDG_IRQHandler(void)
{
//----------------?????????????????----------------------  
  WWDG_SetCounter(0x7F);

  WWDG_ClearFlag();  
  
  //NOP();
//----------------????????????????------------------------
}




沙发
香水城| | 2009-3-25 21:10 | 只看该作者

两个问题:1、在WWDG中断仍通不过,什么现象?2、为什么用WW

WWDG与IWDG的主要区别是有一个窗口控制,WWDG的中断是给你最后一次喂狗的机会,通常这个中断不是让你执行喂狗操作的;一般进到这个中断时表示你在其它地方安排的喂狗操作不能奏效,而发生这种现象时,肯定是系统有问题了,或者是程序有Bug,或者是碰到了干扰,在这种情况下,这个中断是为了让你的程序在发生真正的看门狗复位前,有一个紧急处理的机会,如保存重要的数据,或做系统刹车等操作。

由此看出,简单地在WWDG中断喂狗,既没有发挥WWDG相对于IWDG的优势,又因为在中断中喂狗而为以后的产品留下了隐患。


再说你的现象,请描述一下“在WWDG中断仍通不过”的具体表象,这有利于分析问题的可能原因,谢谢。

使用特权

评论回复
板凳
alenthj|  楼主 | 2009-3-25 22:22 | 只看该作者

你在lut1lut的I2C程序里加入WWDG初始化程序,

并开启WWDG中断,你就会发现I2C程序就读写不了EEPROM。但WWDG中断能顺利进入。

WWDG是个最后喂狗机会这个不会错,但是并不能代表这个中断没有用处。

烦请有实验条件的朋友们,也试试这个问题,我这里是存在这个问题的。

使用特权

评论回复
地板
alenthj|  楼主 | 2009-3-25 22:32 | 只看该作者

或者说

一旦进入这个中断,我们就可以认为系统已经有问题了,所以它对I2C的影响已经可以忽略,因为接下来必需软复位来解决出问题的系统。  这样理解的话,倒也通了。  果真?

使用特权

评论回复
5
香水城| | 2009-3-26 07:05 | 只看该作者

3楼说的正确,4楼说法不妥

我在2楼前半部分只是想提醒,你这么用WWDG,没有发挥它的作用,想搞清楚你为什么要用WWDG。

使用特权

评论回复
6
lut1lut| | 2009-3-26 10:04 | 只看该作者

我试了一下

如1楼那样,添加三个地方的代码
1)main中WWDG的配置
2) NVIC中打开WWDG中断
3) it.c中在WWDG_ISR中添加处理程序

程序一直跑,示波器看I2C总线,一直正常运行,没有进入WWDG中断阿?

使用特权

评论回复
7
alenthj|  楼主 | 2009-3-26 10:37 | 只看该作者

to:lut1lut

只有进入WWDG中断才会出错。我在主程序中没有喂狗的,只在WWDG中断里喂狗。 只要一直喂狗,不进WWDG中断,程序不会影响。

另:其它中断对I2C没影响,是因为lut1lut的程序中关键时序地方都加了关中断保护。 

首先这里讨论的是WWDG中断开启后是关不掉的,除非复位。 就因为关不掉,这里才讨论WWDG中断对I2C操作有没有影响。 只作讨论,实际应用中,需要WWDG中断里喂狗的情况基本不会发生,除非程序出错。

使用特权

评论回复
8
lut1lut| | 2009-3-26 11:01 | 只看该作者

我没有明白LZ的意思

主程序I2C读写一直在运行;

WWDG也一直在进入,不断喂狗,刷新计数器,避免复位,从而主程序的I2C通信得以一直正常运行啊。

使用特权

评论回复
9
ST_ARM| | 2009-3-26 11:07 | 只看该作者

to alenthj

“只有进入WWDG中断才会出错。我在主程序中没有喂狗的,
只在WWDG中断里喂狗。只要一直喂狗,不进WWDG中断,程序不会影响。”

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果你的程序没有进中断,那你怎么能喂狗?如果没有进中断,程序肯定复位,怎么会不受影响?

“实际应用中,需要WWDG中断里喂狗的情况基本不会发生,除非程序出错。”
实际情况是WWDG中断里喂狗的情况肯定会发生。我们软件库里那个WWDG例程我
                             ^^^^^^^^^^^
是run过的。

使用特权

评论回复
10
alenthj|  楼主 | 2009-3-26 12:37 | 只看该作者

to:all

我在WWDG中断里喂狗的。


lut1lut,能把你的测试例程打包发给我吗?

email:alenthj@yahoo.com.cn        


我的硬件是stm32f103r8读写AT24c01,软件是IAR5.3。我回去再测试看看。

使用特权

评论回复
11
lut1lut| | 2009-3-26 13:42 | 只看该作者

to alenthj

已发,请查收。

使用特权

评论回复
12
香水城| | 2009-3-26 21:56 | 只看该作者

楼主最好回答我在2楼的问题

请描述一下“在WWDG中断仍通不过”的具体表象。


8楼又说:“只有进入WWDG中断才会出错。我在主程序中没有喂狗的,只在WWDG中断里喂狗。 只要一直喂狗,不进WWDG中断,程序不会影响。”

请问出错的具体表象是什么?

还有,记得曾经看到你在搞UCOS,这个帖子讨论的背景是否与你的UCOS有关,是否有可能你根本就没有进过WWDG中断?你根据什么具体想象判断进了WWDG中断就出错?


你现在要做的是尽可能地描述操作过程和想象,不要用抽象的出错、不工作、不影响等广义词汇。

使用特权

评论回复
13
alenthj|  楼主 | 2009-3-27 09:05 | 只看该作者

大概原因找到了

用IAR调试WWDG的问题,Debug设置断点要关闭看门狗计数器,否则它继续执行,直至复位。这应该就是出错的原因。

定时器、看门狗、bxCAN和I2C的调试
● 在产生断点时,计数器停止计数。这对于看门狗的计数器是必需的。

所以用wwdg断点调试时,先需要设置DBG的watchdog计数停止,以免溢出。

thanks lut1lut和版主。  



使用特权

评论回复
14
香水城| | 2009-3-27 17:13 | 只看该作者

恭喜楼主

这个问题的关键点是“Debug设置断点”!

使用特权

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

本版积分规则

40

主题

221

帖子

0

粉丝