This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:如何向 HAL 值添加偏移?

Guru**** 2535750 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/999752/msp430fr2355-how-to-add-offset-to-hal-value

器件型号:MSP430FR2355

您好...

我不知道如何问这个问题,因为我试图为 MSP 计时器制作 HAL 库,但这里是…

我有一个与寄存器集一起定义的定时器的基址:

typedef struct
{
    __vo uint16_t TB_CTL;   /*Timer control register                         Offset 0x00 */
    __vo uint16_t TB_CCLT0; /*Timer capture/compare control 0 register       Offset 0x02 */
    __vo uint16_t TB_CCLT1; /*Timer capture/compare control 1 register       Offset 0x04 */
    __vo uint16_t TB_CCLT2; /*Timer capture/compare control 2 register       Offset 0x06 */
    __vo uint16_t TB_CCLT3; /*Timer capture/compare control 3 register       Offset 0x08 */
    __vo uint16_t TB_CCLT4; /*Timer capture/compare control 4 register       Offset 0x0A */
    __vo uint16_t TB_CCLT5; /*Timer capture/compare control 5 register       Offset 0x0C */
    __vo uint16_t TB_CCLT6; /*Timer capture/compare control 6 register       Offset 0x0E */
    __vo uint16_t TB_R;     /*Timer counter register                         Offset 0x10 */
    __vo uint16_t TB_CCR0;  /*Timer capture/compare 0 register               Offset 0x12 */
    __vo uint16_t TB_CCR1;  /*Timer capture/compare 1 register               Offset 0x14 */
    __vo uint16_t TB_CCR2;  /*Timer capture/compare 2 register               Offset 0x16 */
    __vo uint16_t TB_CCR3;  /*Timer capture/compare 3 register               Offset 0x18 */
    __vo uint16_t TB_CCR4;  /*Timer capture/compare 4 register               Offset 0x1A */
    __vo uint16_t TB_CCR5;  /*Timer capture/compare 5 register               Offset 0x1C */
    __vo uint16_t TB_CCR6;  /*Timer capture/compare 6 register               Offset 0x1E */
    __vo uint16_t TB_EX0;    /*Timer expansion 0                              Offset 0x20 */
    uint16_t RSVD[6];       /*Reserved                                       Offset 0x22-0x2C*/
    __vo uint16_t TB_IV;    /*Timer interrupt vector                         Offset 0x2E */
}Timer_RegDef_t;


#define TIMERB0   (Timer_RegDef_t *)TB0_BASE
#define TIMERB1   (Timer_RegDef_t *)TB1_BASE
#define TIMERB2   (Timer_RegDef_t *)TB2_BASE
#define TIMERB3   (Timer_RegDef_t *)TB3_BASE

我已为应用端定义了值类型输入以及句柄结构(请参阅下文):

typedef struct
{
    uint8_t Timer_Clk;         /*values @CLK */
    uint8_t Timer_Divider;     /*values @DIVIDER*/
    uint8_t Timer_Size;        /*values @SIZE*/
    uint8_t Timer_CountMode;   /*values @COUNT_MODE */
    uint16_t Timer_Value;       /*load value on counter */
    uint8_t Timer_Clear;       /*values @CLEAR */
    uint8_t Timer_CC_Register; /*values @CAPTURE_CONTROL_REGISTER */
    uint8_t Timer_CC_Control;   /*values @CAPTURE_COMPARE_CONTROL */
    uint16_t Timer_CC_Value;   /*load value on capture compare */
    uint8_t Timer_PWMValue;    /*values @PWM_VALUE */
}Timer_Config_t;

typedef struct
{
    Timer_RegDef_t *pTIMERx; /*holds base address of GPIO port to which pin belongs */
    Timer_Config_t Timer_Config; /* holds timer settings */
}Timer_Handle_t;

我希望能够将一个值放置到所选的捕获比较寄存器中、并相应地修改捕获比较控制寄存器。   如果用户选择 CCR 寄存 器(Timer_CC_Register、值0 -6)、那么该值+偏移量0x12应该能够被添加到基址、并且这个寄存器应该被 Timer_CC_Value 更新。  我在下面的尝试不起作用。  

    (pTimerHandle->pTIMERx->TB_CTL + (0x12 + pTimerHandle->Timer_Config.Timer_CC_Register)) = \
            pTimerHandle->Timer_Config.Timer_CC_Value;

我认识到这是错误的、但不理解将偏移量添加到基址以获取指向的新地址并使用 Timer_CC_Value 进行更新的方法...

有人能告诉我解决这个问题的最简单方法吗?

谢谢