打印

呵呵,根据经验,十有**不是芯片的问题

[复制链接]
8860|35
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ESTM32|  楼主 | 2008-7-16 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

一个简单的程序

#include "stm32f10x_lib.h"
EXTI_InitTypeDef EXTI_InitStructure;
ErrorStatus HSEStartUpStatus;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);

int main(void)
{


  RCC_Configuration();
  NVIC_Configuration();//到处就进入中断服务程序,然后死机!!!
  GPIO_Configuration();
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource15);
  EXTI_InitStructure.EXTI_Line = EXTI_Line15;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  while (1)
  {    
  }
}


void RCC_Configuration(void)
{
  
  RCC_DeInit();
  RCC_HSEConfig(RCC_HSE_ON);
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
  {
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    RCC_PCLK1Config(RCC_HCLK_Div2);
    FLASH_SetLatency(FLASH_Latency_2);
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    RCC_PLLCmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
}


void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM  

  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else 

  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);//单步运行到此,会进入中断服务程序,然后就不出来了
}

这个程序在mdk,iar下都能编译通过,不过运行时都会死机,今天测试了一天。这个程序模拟运行可以正常运行,就是不能下载到片子中,
把EXTI15_10_IRQChannel换成EXTI9_5_IRQChannel就很正常!
最后我的结论STM32有BUG,至少我用的这片是的!!
沙发
香水城| | 2008-7-16 21:19 | 只看该作者

谁写的程序?


我已经看到你的帖子:问,中断配置
 
但没有说服力。

使用特权

评论回复
板凳
ESTM32|  楼主 | 2008-7-16 21:26 | 只看该作者

我测试了一天

今天我测试了一天,用各种方法测试,为了测试我都重装系统了,可是还是不行,这个程序是最后精简的程序,但是还是不能正常运行,

使用特权

评论回复
地板
香水城| | 2008-7-16 21:33 | 只看该作者

谁能保证你的程序正确?谁能保证你的程序模拟没有Bug?

我不否认有Bug,但要判定一个Bug,需要有说服力的证据。

使用特权

评论回复
5
ESTM32|  楼主 | 2008-7-16 21:41 | 只看该作者

就这么一个简单的程序

你可以看看就这么简单的一个程序,而且NVIC_Configuration()函数就在主函数的第二行,不管中断服务程序是什么,都不应该在这里进入中断服务程序!如果可以,我可以把工程发给你,你可以看看是否正确,

使用特权

评论回复
6
ESTM32|  楼主 | 2008-7-16 22:48 | 只看该作者

这算是证据吗?

经多次试验,得到一下规律:每次必须用串口把flash的程序全部擦除。这样使用IAR或者MDK写程序,这样才能成功。如果修改了程序,那还需要从新擦除flash,不然就会犯毛病,
我怀疑闪存的某个部分坏了,坏的地方正好存放那个中断向量或者什么的,这是我的猜测。不过我还没擦写几次呢,最多几百次吧

使用特权

评论回复
7
sheepbaa| | 2008-7-17 08:06 | 只看该作者

我建议你换一个板子或者芯片看看.

我建议你换一个板子或者芯片看看.芯片有可能是次品.或者已经残了.

使用特权

评论回复
8
samuelyu| | 2008-7-17 09:24 | 只看该作者

建议

1,其他的板子也这样么?
2,你可以在 死机 的时候停下来,看看 REGISTER ,也许有帮助;
3,个人觉得 INIT 顺序应该 GPI0-》EXTI-》NVIC ;

使用特权

评论回复
9
zhang..yb| | 2008-7-17 09:33 | 只看该作者

是中断向量放错位置

使用特权

评论回复
10
ESTM32|  楼主 | 2008-7-17 09:53 | 只看该作者

有点让我失望

从刚接触STM32时,觉得其功能强大,价格便宜,是个很有前途的芯片。现在让我失望了,但愿是我一个芯片坏了,而不是有BUG,本想打电话问问ST公司技术支持,好半天没发现电话,可惜我这里只有一个板子,不能看看是不是其他有没有问题。不知道能不能申请样片,我也好再焊上一个试试。
工作也忙了,弄弄其他的了,暂时现放放这个

使用特权

评论回复
11
makesoft| | 2008-7-17 10:37 | 只看该作者

呵呵,根据经验,十有**不是芯片的问题

使用特权

评论回复
12
ESTM32|  楼主 | 2008-7-17 10:50 | 只看该作者

求各位个事

我的板子上芯片是STM32F103VBT6,PD14,PD15是按键,PC6,PC5是LED,用中断方式控制LED,不知道哪位大侠有兴趣帮我写个程序,然后把BIN文件传给我,我也好试验一下到底是什么地方出现了问题。买个板子虽然钱不多,放在这里也浪费了

使用特权

评论回复
13
zyok| | 2008-7-17 12:26 | 只看该作者

我觉得多半是你自己程序的问题。。。

使用特权

评论回复
14
walnutcy| | 2008-7-17 12:43 | 只看该作者

中断程序呢?


"把EXTI15_10_IRQChannel换成EXTI9_5_IRQChannel就很正常!"

换的时候,你中断程序的位置换过没?

使用特权

评论回复
15
ESTM32|  楼主 | 2008-7-17 13:02 | 只看该作者

回楼上各位

回 zyok:程序我已经贴出来了,如果有什么问题,还请指出。
回14楼:我没明白你的意思,你是说中断服务程序吧,还是其他的?但是不管如何,都不应该在配置中断程序时进入中断吧,
 

使用特权

评论回复
16
zhang..yb| | 2008-7-17 14:27 | 只看该作者

回复

如果你在 RAM 内调试,那必须把中断向量放在 RAM 中,
反之,如果你在 FLASH 内调试,那必须把中断向量放在 FLASH 中.
我也碰到过你的问题,改一下就好! 

使用特权

评论回复
17
ESTM32|  楼主 | 2008-7-17 14:49 | 只看该作者

我把问题说清楚点,各位大侠帮帮忙

这个我是知道的,而已我也是这样做的,我现在把问题说的清楚一点:
1:软件中不能开 EXTI15_10_IRQChannel中断,否则死机(如上面程序中铁贴出的一样),
2:如果想用 EXTI15_10_IRQChannel中断,必须使先用串口擦除FLASH,不然不管是用MDK还是IAR都会出现死机,
3:死机现象  程序在配置中断时(如程序中所示)就会进入中断。
4:如果我不开 EXTI15_10_IRQChannel中断,整个芯片运行正常,在IAR和MDK下都很正常,
5: 正常的意思是不需要用事先串口擦除FLASH,直接在IAR或者MDK下载可正常工作

使用特权

评论回复
18
vigia| | 2008-7-17 16:37 | 只看该作者

IAR或MDK在下载FLASH之前必然会擦除FLASH

用串口擦除了代码,然后连上IAR或者MDK下载代码调试时,不会有代码先运行。

而直接用IAR或MDK下载调试时,如果板子从FLASH BOOT的,在调试器控制芯片之前必然会有一段代码运行了,这就导致调试时,虽然PC指针指向代码首地址,但可能某些外设和标志位已经处于非复位状态了。

由于你没有详细描述你的死机现象,所以不能判断是什么导致了死机,不过你可以把BOOT改到RAM,看看不用串口擦除直接用IAR下载代码会不会死机,当然死机之后要断电的。

使用特权

评论回复
19
ESTM32|  楼主 | 2008-7-17 17:50 | 只看该作者

楼上分析有道理

我选择ram运行,过程及现象如下:
1:断电配置boot  
2:配置程序
3:上电下载 正常
4:第一次运行 正常
5:软件复位
6:第二次运行(或者单步运行) 死机


7: 断电
8:重复3~7

和flash运行不一样的地方,
flash运行:程序执行配置中断后,立刻进入中断服务程序,然后就出来了,
ram运行:程序执行配置中断后,程序跑飞(如图)


死机现象:
实在不好描述,也不知道怎么样描述,就是执行中断配置后整个程序就不往下进行。

使用特权

评论回复
20
ST_ARM| | 2008-7-17 21:56 | 只看该作者

To ESTM32

你的程序有问题,我最近在休假中,没法给你详细讲解,如果你不着急,我上班后给你解决。

使用特权

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

本版积分规则

14

主题

69

帖子

0

粉丝