打印
[应用相关]

uC/OS-II官方STM32版本运行后产生的问题

[复制链接]
4358|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangxk|  楼主 | 2009-4-10 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32社区里下载了一个“uC/OS-II官方STM32版本修改后在万利的STM32开发板上运行”的工程程序,连接目标板后编译、加载、运行都正常的,我将串口发送改为DMA传输,编译后运行,程序停止在了下面的这行:
App_Fault_ISR       B       App_Fault_ISR
产生了Hard Fault异常,请问这是怎么回事?

下面是初始化程序部分:
    USART_InitStructure.USART_BaudRate = UART1_BAND;
    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(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);

    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

    DMA_UART1Tx_StructInit();
    DMA_Init(DMA1_Channel4, &DMA_UART1TxStructure);
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);

    BSP_IntVectSet(BSP_INT_ID_DMA1_CH4, DMA1_CH4_Uart1TxFinish);
    BSP_IntPrioSet(BSP_INT_ID_DMA1_CH4, DMA1_CH4_UART1Tx_UIP);
    BSP_IntEn(BSP_INT_ID_DMA1_CH4);

下面是DMA1_Channel4中断处理程序
void DMA1_CH4_Uart1TxFinish(void)
{
    DMA_ClearITPendingBit(DMA1_IT_TC1);
    Uart1_Data.TxStatus = READY;
}

下面是发送子程序
void UART1SendData(COMM_Q *pQdata)
{
    u32 temp;
    COMM_Q_char TxBuf[UART_TxBufSize];

    temp = Uart1QTx->QEntries;
    if (Uart1QTx->QEntries != 0)
    {
        if (COMM_QPopStr(Uart1QTx, TxBuf, 0)== COMM_Q_OK)
        {
            DMA_Cmd(DMA1_Channel4, DISABLE);
            DMA_UART1TxStructure.DMA_MemoryBaseAddr = (u32)TxBuf;
            DMA_UART1TxStructure.DMA_BufferSize = temp;
            DMA_Init(DMA1_Channel4, &DMA_UART1TxStructure);
            DMA_Cmd(DMA1_Channel4, ENABLE);
        }
    }
}

类型 COMM_Q_char 定义 unsigned char
沙发
zhangxk|  楼主 | 2009-4-10 14:57 | 只看该作者

DMA_UART1Tx_StructInit()初始化程序


void DMA_UART1Tx_StructInit(void)
{
/*-------------- Reset DMA init structure parameters values ------------------*/
  /* Initialize the DMA_PeripheralBaseAddr member */
  DMA_UART1TxStructure.DMA_PeripheralBaseAddr = USART1->DR;

  /* Initialize the DMA_MemoryBaseAddr member */
  DMA_UART1TxStructure.DMA_MemoryBaseAddr = (u32)Uart1_Data.TxBuf;

  /* Initialize the DMA_DIR member */
  DMA_UART1TxStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  /* Initialize the DMA_BufferSize member */
  DMA_UART1TxStructure.DMA_BufferSize = 0;

  /* Initialize the DMA_PeripheralInc member */
  DMA_UART1TxStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  /* Initialize the DMA_MemoryInc member */
  DMA_UART1TxStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  /* Initialize the DMA_PeripheralDataSize member */
  DMA_UART1TxStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  /* Initialize the DMA_MemoryDataSize member */
  DMA_UART1TxStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  /* Initialize the DMA_Mode member */
  DMA_UART1TxStructure.DMA_Mode = DMA_Mode_Normal;

  /* Initialize the DMA_Priority member */
  DMA_UART1TxStructure.DMA_Priority = DMA_Priority_Medium;

  /* Initialize the DMA_M2M member */
  DMA_UART1TxStructure.DMA_M2M = DMA_M2M_Disable;
}

使用特权

评论回复
板凳
zhangxk|  楼主 | 2009-4-10 15:04 | 只看该作者

去掉了上边的初始化部分后就正常了

初始化部分那个地方用的不对还是初始化顺序有问题?

使用特权

评论回复
地板
zhangxk|  楼主 | 2009-4-10 16:03 | 只看该作者

Hard Fault异常的问题解决了

可能只虚指针造成的Hard Fault异常。

现在是串口没有发出去数据,好像DMA通道没启动似的。

使用特权

评论回复
5
zhangxk|  楼主 | 2009-4-10 16:55 | 只看该作者

传上去了

有时间给看看,谢谢!
相关链接:https://bbs.21ic.com/upfiles/img/20094/2009410165219749.rar

使用特权

评论回复
6
zhangxk|  楼主 | 2009-4-10 17:40 | 只看该作者

根本没有DMA中断产生

我在DMA中断程序里设置了断点,程序没有进入断点处,就是说启动DMA传输后没有产生中断(也许DMA就没有启动)。

到底设置串口DMA发送该如何操作,什么设置顺序?

使用特权

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

本版积分规则

20

主题

69

帖子

1

粉丝