在STM32上调用Timer_callback时丢失指针地址

时间:2019-07-08 15:48:13

标签: c timer callback stm32

我正在使用STM32F103,在调用timer_callback时遇到一些麻烦。我正在使用CANopen_node,并且在堆栈上进行了一些更改,因为我正在使用HAL。当我使用带有CO_init (CAN_HandleTypeDef CANbaseAddress,uint8_t nodeId, uint16_t bitRate)之类的函数的结构初始化CAN模块时,一切正常。但是,当我启用并启动计时器中断时,我将失去CAN模块初始化中的所有内容。

有人知道为什么执行回调时会丢失CAN模块的值吗? 代码:

COO is static variable.
 in COO variable 

    typedef struct{
        CO_CANmodule_t     *CANmodule[1];   /**< CAN module objects */
        CO_SDO_t           *SDO[CO_NO_SDO_SERVER]; /**< SDO object */
        CO_EM_t            *em;             /**< Emergency report object */
        CO_EMpr_t          *emPr;           /**< Emergency process object */
        CO_NMT_t           *NMT;            /**< NMT object */
        CO_SYNC_t          *SYNC;           /**< SYNC object */
        CO_RPDO_t          *RPDO[CO_NO_RPDO];/**< RPDO objects */
        CO_TPDO_t          *TPDO[CO_NO_TPDO];/**< TPDO objects */
        CO_HBconsumer_t    *HBcons;         /**<  Heartbeat consumer object*/
    #if CO_NO_SDO_CLIENT == 1
        CO_SDOclient_t     *SDOclient;      /**< SDO client object */
    #endif
    #if CO_NO_TRACE > 0
        CO_trace_t         *trace[CO_NO_TRACE]; /**< Trace object for monitoring variables */
    #endif
    }CO_t;
    CO_t *CO = NULL;

在回调之前良好的初始化 good init befor callback

回调后的

after callback

1 个答案:

答案 0 :(得分:1)

如果您的MCU仅具有20 KB的RAM(例如STM32F103C8“蓝色药丸”),则在调用之前,CANbaseAddress0x20004FC0的值可能接近于{ {1}}。

最肯定的是,它已在已经完成的函数中声明为局部变量,为此结构(在堆栈上)分配的内存被释放,并用于其他用途。

在以后需要通过指针获取值时,将结构声明为 0x20005000