Skip to main content
xtian
Associate III
January 20, 2013
Question

ODR IDR question

  • January 20, 2013
  • 7 replies
  • 1540 views
Posted on January 21, 2013 at 00:35

Hi guys,

I have this question,

/* GPIOA Periph clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /* Configure PA0 .. PA7 in output pushpull mode */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure PA8 .. PA15 in input, pulled up mode */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIOA->ODR = GPIOA->IDR >> 8; // Mirror high ordered inputs to low ordered outputs

could you explain to me the bold one especially ''8'' and IDR

for example I want to mirror only the first four bits from high ordered to low ordered

or last four bits from high ordered to low ordered.

Thank you very much!
    This topic has been closed for replies.

    7 replies

    Tesla DeLorean
    Guru
    January 20, 2013
    Posted on January 21, 2013 at 00:54

    It's a shift right by 8 bits, So bit 8 goes to bit 0, and bit 15 to bit 7. In all A[8..15] to A[0..7]. It is a basic C operator.

    So reading IDR as  XXXXXXXX--------

    And writing ODR as 00000000XXXXXXXX

    So A[12..15] reflected to A[0..3]

    GPIOA->ODR = (GPIOA->ODR & 0x00F0) | ((GPIOA->IDR >> 8) & 0x000F);

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    xtian
    xtianAuthor
    Associate III
    January 21, 2013
    Posted on January 21, 2013 at 01:44

    Thanks clive... sorry for my ignorance but im reading books in c now but in parallel

    So A[12..15] reflected to A[0..3]

    GPIOA->ODR = (GPIOA->ODR & 0x00F0) | ((GPIOA->IDR >> 8) & 0x000F);

    -> means?

    the value of GPIOA is pointed to the value of ODR,

    where ODR is equal to (GPIOA pointed to the values of 0000XXXX <12-15>) of (GPIOA pointed to the values of XXXX0000 <0-3>)

    correct?

    Tesla DeLorean
    Guru
    January 21, 2013
    Posted on January 21, 2013 at 03:18

    Sorry that should have read

    ''So A[8..11] reflected to A[0..3]''

    Whereas A[12..15] reflected to A[0..3] would be

    GPIOA->ODR = (GPIOA->ODR & 0x00F0) | ((GPIOA->IDR >> 12) & 0x000F);
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    xtian
    xtianAuthor
    Associate III
    January 21, 2013
    Posted on January 21, 2013 at 03:24

    Thanks clive >> 12 to apply the mirror on the 12 bit.. OK.. thanks much

    xtian
    xtianAuthor
    Associate III
    January 21, 2013
    Posted on January 21, 2013 at 03:26

    just to finalize my questions.. hmm what does | do..

    xtian
    xtianAuthor
    Associate III
    January 21, 2013
    Posted on January 21, 2013 at 03:35

    ahh clive is this what implements the pipeline in the ARM M series architecture?

    Tesla DeLorean
    Guru
    January 21, 2013
    Posted on January 21, 2013 at 04:14

    ahh clive is this what implements the pipeline in the ARM M series architecture?

    No, logical OR.

    The & is a logical AND

    You really need to get a decent text on the C language, like K&R
    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..