我正在使用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;
回调后的
答案 0 :(得分:1)
如果您的MCU仅具有20 KB的RAM(例如STM32F103C8“蓝色药丸”),则在调用之前,CANbaseAddress
,0x20004FC0
的值可能接近于{ {1}}。
最肯定的是,它已在已经完成的函数中声明为局部变量,为此结构(在堆栈上)分配的内存被释放,并用于其他用途。
在以后需要通过指针获取值时,将结构声明为 0x20005000
。