Can someone tell me why the following IF condition (see below) doesn't seem to capture? The else works fine when PORT1, PORT3 or PORT5 is called....
void Timer_PWM(Timer_RegDef_t *pTIMERx, uint8_t WhichCCRegister, uint8_t Output, uint16_t LoadValue, \
GPIO_RegDef_t *pGPIOx, uint8_t Pin)
{
uint16_t *p;
pGPIOx->POUT |= (1 << Pin);
pGPIOx->DIR |= (1 << Pin);
p = (uint16_t *)(&pGPIOx->SEL[0]);
if ((pGPIOx == PORT2) || (pGPIOx == PORT4) || (pGPIOx == PORT6))
*(p+1) |= (1 << Pin);
else
*p = (1 << Pin);
p = (uint16_t *)(&pTIMERx->TB_CTL);
*(p + CCVALUE_OFFSET + WhichCCRegister) = LoadValue;
*(p + CCCNTRL_OFFSET + WhichCCRegister) &= (0x7 << 5);
*(p + CCCNTRL_OFFSET + WhichCCRegister) |= (Output << 5);
}
The PORTs are defined as follows, along with GPIO_RegDef_t if needed....
typedef struct
{
__vo uint16_t PIN; /*GPIO port input value register Offset 0x00 */
__vo uint16_t POUT; /*GPIO port output value register Offset 0x02 */
__vo uint16_t DIR; /*GPIO port direction register Offset 0x04 */
__vo uint16_t PREN; /*GPIO resistor enable register Offset 0x06 */
uint16_t RESERVED; /* Reserved Offset 0x08 */
__vo uint16_t SEL[2];/*GPIO port function select register Offset 0x0A SEL[0] - 0x0C SEL[1] */
__vo uint16_t IV; /*GPIO port output data register Offset 0x0E */
uint16_t RSVDA[3]; /*Reserved Offset 0x10, 0x12, 0x14 */
__vo uint16_t PSELC; /*GPIO Complement selection Offset 0x16 */
__vo uint16_t PIES; /*GPIO Interrupt edge select Offset 0x18 */
__vo uint16_t PIE; /*GPIO Interrupt edge Offset 0x1A */
__vo uint16_t PIFG; /*GPIO Interrupt flag Offset 0x1C */
}GPIO_RegDef_t;
#define PORT1 (GPIO_RegDef_t *)P1_BASE
#define PORT2 (GPIO_RegDef_t *)P2_BASE
#define PORT3 (GPIO_RegDef_t *)P3_BASE
#define PORT4 (GPIO_RegDef_t *)P4_BASE
#define PORT5 (GPIO_RegDef_t *)P5_BASE
#define PORT6 (GPIO_RegDef_t *)P6_BASE