打印
[STM32F1]

高手帮忙分析下怎么出现HardFault_Handler错误地,源码附上

[复制链接]
2344|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DAZHOU0503|  楼主 | 2016-1-13 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
头文件定义结构体
#ifndef __APP_UART_H
#define __APP_UART_H
#include"stm32f10x.h"
#include "app_fifo.h"
#define        UART_MAX_NUM                        5

#define        UART_RCV_BUF_LEN                256

#define        UART_SND_BUF_LEN                1024

#define        UART_RCV_TIMEOUT                2        // 20ms

#define        SendHostCycleBufLen                        (4096)
#define        ReceiveHostCycleBufLen                (4096)

typedef struct _BufInfo_t_
{
        uint8_t                uchBuf[200];
        uint32_t                unLen;
}BufInfo_t;

typedef struct UART_SndInfo_t_
{
        uint8_t        SndBuf[UART_SND_BUF_LEN];
        uint32_t SndLen;
}UART_SndInfo_t;

typedef struct _UART_RcvInfo_t_
{
        uint8_t                RcvBuf[UART_RCV_BUF_LEN];
        uint32_t                RcvLen;
        uint32_t                RcvTimer;
}UART_RcvInfo_t;

/* 串口接收和发送的buf */
typedef struct UART_Info_t_
{        
        UART_SndInfo_t                stSndInfo;                                                                // 临时存储往外发送的数据buf
        CycleBufInfo_t                stSendToHostCycleInfo;                                        // 按16字节发送时记录发给主机数据循环buf 状态的结构
        uint8_t                                uchSendToHostBuf[SendHostCycleBufLen];        // 按16字节发送时存储发给主机数据的循环buf

        BufInfo_t                        stHostFrameDataInfo;                                                //临时存放完整的一帧数据
        CycleBufInfo_t                stRcvHostCycleInfo;                                                //接收主机的数据使用的循环结构
        uint8_t                                uchRcvHostCycleBuf[(ReceiveHostCycleBufLen+256)];//主机数据存放的Buf

        BufInfo_t                        stObdFrameDataInfo;                                                        //临时存放完整的一帧数据
        CycleBufInfo_t                stRcvObdCycleInfo;                                                //接收OBD 的数据使用的循环结构
        uint8_t                                uchRcvObdCycleBuf[ReceiveHostCycleBufLen];//OBD 数据存放的Buf

        uint32_t                        unRcvPcTimer;                                                        //PC 透传模式下超时计数值  

}UART_Info_t;

typedef struct systemParam_t_
{
        /*串口*/
        UART_Info_t                        stUartInfo;
}systemParam_t;

void USART1_Configuration(void);
void USART1_SendData(uint8_t SendData);
void UART1_SendByte(uint16_t Data);
int32_t DrvUART_Write(uint8_t uartId, uint8_t *pData, uint32_t dataLen);

#endif

轮询函数里调用
static void Polling_100ms(void)
{
DrvWatchDog_Feed();         //喂狗
Obd_TransStart();         //下达OBD开启数据流传输指令给卡车模块
}


/*
功             能: 开始OBD 数据流传输;
参数1    : 无;              
返回值: 无;
*/
void Obd_TransStart(void)
{
        UART_SndInfo_t        *pSndInfo = pObdUartSndInfo;
        
        pSndInfo->SndLen = OBD_IfStartTsCmdPack(1, pSndInfo->SndBuf);
        
        DrvUART_Write(3, pSndInfo->SndBuf, pSndInfo->SndLen);
}


int OBD_IfStartTsCmdPack(int ReSendCnt, unsigned char *oCmdBuff)
{
        int cmdBuffLen = 0;
        OBD_PkgInData_t pkgdata;
        unsigned char *pstr = NULL;
        unsigned char *pCmdBuff = NULL;
        unsigned char data[OBD_PKGBUF_SIZE] = {0};
        
        if (oCmdBuff == NULL)
        {
                return OBD_FAILED;        
        }
        
        pCmdBuff = oCmdBuff;
        
        memset(data, 0x00, OBD_PKGBUF_SIZE);
        
        memset(&pkgdata, 0x00, sizeof(OBD_PkgInData_t));
        pkgdata.data = data;
        pstr = pkgdata.data;

        *pstr++ = 0xff;
        *pstr++ = 0x00;
        *pstr++ = 0x00;
        *pstr++ = 0x00;
        *pstr++ = 0x00;
        pkgdata.datasize += 5;

        cmdBuffLen = OBD_GenerateObdPackage(CMD_TS_START, &pkgdata, pCmdBuff, ReSendCnt);

        return cmdBuffLen;   
}

/*将OBD数据按照协议打包上传
    函数返回值:数据包的长度
*/
static int OBD_GenerateObdPackage(obdcmd_t cmdId, OBD_PkgInData_t *pPkgData, unsigned char *pBuf, int isReSend)         
{
        unsigned char *pstr = NULL;
        unsigned char *pstrtmp = NULL;
        unsigned short pkglen = 0;
        unsigned short datalen = 0;
        int pkgsize = 0;
        unsigned int cmd = ObdCmdArray[cmdId];

        if (pBuf == NULL)
        {        
                return OBD_FAILED;
        }

        if (pPkgData == NULL)
                datalen = 0;
        else
                datalen = pPkgData->datasize;

        if (isReSend == 0)
                m_nPkgCounter++;
        
        pkglen = 1+2+datalen;        /* 加上一个字节的包长度和两个字节的命令字*/
        
        pstr = pBuf;
        pstrtmp = pBuf;                          
        
        //fill header
        *pstr++ = 0x55;
        pkgsize++;
        *pstr++ = 0xaa;
        pkgsize++;

        //fill dst addr
        *pstr++ = 0xf0;
        pkgsize++;
        
        //fill src addr
        *pstr++ = 0xf8;
        pkgsize++;

        //fill len
        *pstr++ = (unsigned char)((pkglen>>8)&0xff);
        pkgsize++;
        *pstr++ = (unsigned char)(pkglen&0xff);
        pkgsize++;

        //fill counter
        *pstr++ = m_nPkgCounter;
        pkgsize++;
        
        //fill cmd
        *pstr++ = (unsigned char)((cmd>>8)&0xff);
        pkgsize++;
        *pstr++ = (unsigned char)(cmd&0xff);
        pkgsize++;

        //fill data
        if (pPkgData != NULL)
        {
                memcpy(pstr, pPkgData->data, datalen);
                pstr += datalen;
                pkgsize += datalen;                                 
        }
        //fill crc
        pstrtmp += 2;
        *pstr = CalXOR(pstrtmp, pkgsize-2);
        pkgsize++;

        return pkgsize;
}
沙发
DAZHOU0503|  楼主 | 2016-1-13 16:34 | 只看该作者
源码程序,高手帮忙看看问题

串口.rar

4.41 MB

使用特权

评论回复
板凳
myqq12| | 2016-1-13 16:39 | 只看该作者
怎么出现的?比如说屏蔽掉哪些就不会出现,等等.....
这源码...

使用特权

评论回复
地板
DAZHOU0503|  楼主 | 2016-1-13 17:15 | 只看该作者
屏蔽了轮询里调用  Obd_TransStart();函数和ObdRead();函数,程序就可以正常运行。正好这部分都是借鉴别人的,我对结构体的应用也不是很懂

使用特权

评论回复
5
LM黎明| | 2016-1-13 17:20 | 只看该作者
为什么附件下不了

使用特权

评论回复
6
DAZHOU0503|  楼主 | 2016-1-13 18:09 | 只看该作者
我刚 发现我上传的附件下载不了,这个怎么回事

使用特权

评论回复
7
siemens11| | 2016-1-14 09:47 | 只看该作者
出现hardfault的话,十有**都是程序跑飞了,尤其是你使用rtos的话,这种情况更加常见。检查一下堆栈,看是不是哪里溢出了

使用特权

评论回复
8
DAZHOU0503|  楼主 | 2016-1-14 14:57 | 只看该作者
用的是KEIL4 ,不知道怎么去看堆栈溢出?

使用特权

评论回复
9
DAZHOU0503|  楼主 | 2016-1-19 11:29 | 只看该作者
问题解决了,是指针初始化的问题

使用特权

评论回复
10
xmshao| | 2016-1-19 13:54 | 只看该作者
指针初始化 或数组过界最常见的 hardfault源了。

使用特权

评论回复
11
643757107| | 2016-1-19 17:55 | 只看该作者
除了空指针,定以后都要初始化的。

使用特权

评论回复
12
Brand2| | 2016-1-19 20:29 | 只看该作者
硬fault 是总线fault、存储器管理fault 以及用法fault 上访的结果。如果这些fault 的服务例程无法执行,它们就会成为“硬伤”——上访(escalation)成硬fault

使用特权

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

本版积分规则

11

主题

59

帖子

1

粉丝