【发布时间】:2017-09-22 07:03:25
【问题描述】:
我有以下结构(来自我正在使用的库)和一些字段,我想用 OR 操作分配一个新值。但我正在调试,我看不到 stm32l4xx_hal_tim.c 文件中的内容:
typedef struct
{
TIM_TypeDef *Instance; /*!< Register base address */
TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */
HAL_TIM_ActiveChannel Channel; /*!< Active channel */
DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array This array is accessed by a @ref DMA_Handle_index */
HAL_LockTypeDef Lock; /*!< Locking object */
__IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */
}TIM_HandleTypeDef;
typedef struct
{
__IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */
__IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */
__IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */
__IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */
__IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */
__IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */
__IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */
__IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */
__IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */
__IO uint32_t CNT; /*!< TIM counter register,
} TIM_TypeDef;
我定义了一部分代码:TIM_HandleTypeDef TIMER_Struct;
我想访问 TIM_TypeDef 结构的字段“CR1”,即 TIM_HandleTypeDef 的“*Instance”字段。所以我在函数 DRV_TIMER_init() 中通过这种方式完成了它:
#include "main.h"
#include "stm32l4xx_hal_tim.h"
uint32_t uwPrescalerValue = 0;
TIM_HandleTypeDef TIMER_Struct;
void DRV_TIMER_init(void);
int main(void)
{
DRV_TIMER_init();
while(1)
{
}
}
//where uint32_t SystemCoreClock = 4000000; in other system source file.
void DRV_TIMER_init(void)
{
uwPrescalerValue = (uint32_t)(SystemCoreClock / 1000000) - 1;
TIMER_Struct.Init.Period = 100 - 1;
TIMER_Struct.Init.Prescaler = uwPrescalerValue;
TIMER_Struct.Init.ClockDivision = 0; // these accesses work
TIMER_Struct.Instance -> CR1 |= 0x01 << 3; // this no works
}
即使我直接写:
TIMER_Struct.Instance -> CR1 = 0xFFFFFFFF;
静止不动。
我认为这可能是我没有适当控制指针访问或类似的事实。但是我看不到如何访问和修改注释字段的内容。因为我可以看到(调试模式)其余的结构字段更新是如何正确写入的。
这里有什么更正建议吗?
TIMER_Struct.Instance -> CR1 = 0xFFFFFFFF;
我尝试了不同的方法来获得它,但没有成功。我需要新的想法。
【问题讨论】:
-
建议:摆脱那个 STlib HAL 膨胀软件并直接写入寄存器。编写驱动程序来抽象硬件。写你的问题:阅读How to Ask,提供minimal reproducible example。四个月后,你应该知道它是如何工作的。
-
@Olaf 不幸的是我不能选择这个选项。使用 HAL_lib 是一个项目规范,我正在使用的所有 fw 都是几个月前基于 HAL_libs 开发的。但是,我想知道我的访问方式是否做错了,以便了解如何在未来的情况下面对它。
-
您是否为
TIMER_Struct.Instance创建了一个指向的对象?请出示您的minimal reproducible example。 -
不,我不知道。如果我必须创建一个对象 TIMER_Struct.Instance,如果可能的话,我想了解原因。现在我正在对示例进行一些更改。它将很快更新。谢谢。请让我几分钟。
-
可能你没有正确初始化结构。您正在正确访问该成员,因此原因是发布的代码之外的内容。
标签: c pointers struct embedded