打印

stm32串口2硬件仿真正常,重新上电运行就出错

[复制链接]
7331|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinjing999|  楼主 | 2011-8-18 15:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32串口3硬件仿真正常,重新上电运行就出错


真郁闷,我发现如果正常调试程序,下载后程序后,通讯口3能通讯上数据,就是不放仿真(jlink),也能通讯上数据,但是重新上电,数据就通不上了。

为了验证是不是硬件的问题,我找了别的产品的STM32程序,用的也是串口3,口线一样,就没有出现这种情况。

那位遇到过?是什么问题造成的?
沙发
jinjing999|  楼主 | 2011-8-18 15:31 | 只看该作者
//串口3配置       
        DMA_DeInit(DMA1_Channel2);
        DMA_tx_USART3_Configuration(1);
        //DMA_rx_Configuration(1);
    //USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_BaudRate = 9600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          USART_InitStructure.USART_StopBits = USART_StopBits_1;
          USART_InitStructure.USART_Parity = USART_Parity_No;
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
          USART_Init(USART3, &USART_InitStructure);
          // Enable USART1 DMA Rx and TX request
          USART_DMACmd(USART3,USART_DMAReq_Tx, ENABLE);
        // Enable DMA1 Channel4
          DMA_Cmd(DMA1_Channel2, ENABLE);
          /* Enable DMA1 Channel5 */
          //DMA_Cmd(DMA1_Channel5, ENABLE);
        USART_ITConfig(USART3, USART_IT_ERR, ENABLE);//错误中断
           USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//接收中断开启
        /* Enable the USART1 */
          USART_Cmd(USART3, ENABLE);

使用特权

评论回复
板凳
jinjing999|  楼主 | 2011-8-18 15:32 | 只看该作者
void DMA_tx_USART3_Configuration(u8 tx_length)
{
  DMA_InitTypeDef DMA_InitStructure;

  DMA_Cmd(DMA1_Channel2, DISABLE);
  DMA_DeInit(DMA1_Channel2);
  /* DMA1 Channel4 (triggered by USART1 Tx event) Config */
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)usart3.TxBuffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = tx_length;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  /* DMA1 Channel5 (triggered by USART1 Rx event) Config */
  DMA_Init(DMA1_Channel2, &DMA_InitStructure);
  //DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
  DMA_ClearFlag(DMA1_FLAG_TC2);
  DMA_Cmd(DMA1_Channel2, ENABLE);
}

使用特权

评论回复
地板
jinjing999|  楼主 | 2011-8-18 15:32 | 只看该作者
别的产品也是用的同样的驱动代码

使用特权

评论回复
5
jinjing999|  楼主 | 2011-8-18 15:33 | 只看该作者
//串口3配置       
        DMA_DeInit(DMA1_Channel2);
        DMA_tx_USART3_Configuration(1);
        //DMA_rx_Configuration(1);
    //USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_BaudRate = 9600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          USART_InitStructure.USART_StopBits = USART_StopBits_1;
          USART_InitStructure.USART_Parity = USART_Parity_No;
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
          USART_Init(USART3, &USART_InitStructure);
          // Enable USART1 DMA Rx and TX request
          USART_DMACmd(USART3,USART_DMAReq_Tx, ENABLE);
        // Enable DMA1 Channel4
          DMA_Cmd(DMA1_Channel2, ENABLE);
          /* Enable DMA1 Channel5 */
          //DMA_Cmd(DMA1_Channel5, ENABLE);
        USART_ITConfig(USART3, USART_IT_ERR, ENABLE);//错误中断
           USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//接收中断开启
        /* Enable the USART1 */
          USART_Cmd(USART3, ENABLE);

使用特权

评论回复
6
香水城| | 2011-8-18 15:39 | 只看该作者
请试试在上电后,初始化所有片外外设之前,先等待一段时间,等待这些片外外设上电就绪,他们很可能比STM32上电过程慢。

使用特权

评论回复
7
jinjing999|  楼主 | 2011-8-18 16:00 | 只看该作者
我在出事化RCC之前已经延时了,这几个指令,还是不行

  for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }
  for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }
    for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }
   for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }
    for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }
  for(u16_WaitForOscSource=0;u16_WaitForOscSource<500000;u16_WaitForOscSource++)
  {
  }

使用特权

评论回复
8
香水城| | 2011-8-18 16:03 | 只看该作者
我在出事化RCC之前已经延时了,这几个指令,还是不行

  for(u16_WaitForOscSource=0;u16_WaitForOscSource
jinjing999 发表于 2011-8-18 16:00


这些语句有可能被编译器优化掉。

使用特权

评论回复
9
jinjing999|  楼主 | 2011-8-18 16:15 | 只看该作者
还不行

在上电后,没有初始化时钟的时候延时0.3秒 ,没有初始化串口时钟晶振的时候延时0.3秒,初始化 串口配置之前,延时0.3秒

仿真通讯可以,上电通讯还是不行。

能明显看到系统上电比较慢了,

使用特权

评论回复
10
jinjing999|  楼主 | 2011-8-18 16:23 | 只看该作者
我还有一个产品的程序,也下进去就没有问题。

这个产品就有问题,很郁闷

使用特权

评论回复
11
香水城| | 2011-8-18 16:31 | 只看该作者
USART程序部分应该没有问题,问题还是在供电、时序部分。

使用特权

评论回复
12
jinjing999|  楼主 | 2011-8-18 16:57 | 只看该作者
怎么解决,我在上电后,6秒后没有初始化硬件程序。


还有我用的是rs485,是一个隔离电源模块供电,难道是485硬件问题?如果是485硬件问题,别产品程序代码也通不上啊,当然仿真状态下,程序也是通不上的。

使用特权

评论回复
13
香水城| | 2011-8-18 17:20 | 只看该作者
光凭你的描述,我看不出问题在哪里,恐怕还要你自己仔细地查查。

可以考虑用示波器看看MCU端USART引脚的波形,与485对外端的波形,再比较两边的时序,也许会有所发现。

使用特权

评论回复
14
MakeBetter| | 2011-8-18 21:29 | 只看该作者
看看别的部分,不要专看Usart,如果别的部分初始化失败,导致程序死机,也同样不能通串口。

我就有过:
下载后,程序运行正常,在调试状态复位,就运行不了,暂停后跳至访问错误中断,因为我用了FSMC,所以判断是FSMC初始化问题,检查后修改了一个使能,就可以了。同样的,这个初始化程序,在别的芯片上运行正常的。(不同资源的)

使用特权

评论回复
15
jinjing999|  楼主 | 2011-8-19 08:18 | 只看该作者
谢谢楼上兄弟。

我感觉是程序的问题。这个通讯不上程序,上电后液晶,CAN, AD,spi总线都正常。如果是死机的话,这就不正常,这个死机问题应该可以排除。

使用特权

评论回复
16
MakeBetter| | 2011-8-21 12:19 | 只看该作者
那就比较不同点:
下载后,程序正常,复位后不能正常,
唯一不同的是:IAR下载的时候,先下载了FlashLoader,还可能对芯片进行了一些初始化,而用户程序开始运行时,就没有这些,就看这些初始化的不同了,楼主自己比较比较。
另外,可以找以前能用的,和不能用的,相互比较,有哪些不同,资源的不同、外设的不同或是程序有小许的修改的地方。

使用特权

评论回复
17
jinjing999|  楼主 | 2011-9-24 10:05 | 只看该作者
是我的硬件存储器坏了

使用特权

评论回复
18
zzifeng| | 2011-9-24 12:25 | 只看该作者
17# jinjing999
LZ,这个是怎么检查出来的?
能否知道一下,谢谢了~

使用特权

评论回复
19
na239152605| | 2012-4-1 22:50 | 只看该作者
我也遇到类似的问题!头疼!

使用特权

评论回复
20
song513| | 2013-10-30 13:55 | 只看该作者
我出现的问题是串口3在jtag调试时,运行正常,但重新上电运行时,信号是乱码。最后发现我的串口线太长造成的,用的不是屏蔽线。

使用特权

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

本版积分规则

73

主题

363

帖子

1

粉丝