I want to enable pin 13 on my SAM3X8E using direct port manipulation. On this chip the pin is bit 27 in port B, so I used PIOB->PIO_PER = 1<<27; to enable this pin, but it doesn't work. This pin keeps at 3.08V, the default value of non-initialized pins.

Here's my complete code:

#include <asf.h>

int main (void) {
  // Insert system clock initialization code here (sysclk_init()).
  PIOB->PIO_PER = 1<<27;
  PIOB->PIO_OER = 1<<27;
  while(1) {
    REG_PIOB_ODSR = 1<<27;
    REG_PIOB_ODSR = 0<<27;

Can anyone tell me how I can get this to work?

2 Answers 2


I suggest the following test: Use REG_PIOB_SODR = 1<<27; to set the bit, and REG_PIOB_CODR = 1<<27; to clear it. If that works ok, see about enabling synchronous data output via the port's PIO_OWSR register. (If it doesn't work ok, perhaps review section 31.6, “I/O Lines Programming Example”, on page 629 of Atmel document 11057, the Cortex datasheet.)

Section 31.5.5, “Synchronous Data Output”, on page 623 says in part:

After reset, the synchronous data output is disabled on all the I/O lines as PIO_OWSR resets at 0x0.

I imagine that writes to REG_PIOB_SODR and REG_PIOB_CODR should have effect after you enabled output by setting bits in PIOB->PIO_PER and PIOB->PIO_OER, which you did. However, with the bit in PIO_OWSR being clear, synchronous data output isn't available, so writes to REG_PIOB_ODSR have no effect.

    #define Led_ON  REG_PIOB_ODSR |= 0x8000000
    #define Led_OFF REG_PIOB_ODSR &= ~0x8000000
    //for Arduino Due
    PIOB->PIO_PER |= 0x8000000;//led
    PIOB->PIO_OER |= 0x8000000;//led

And then call Led_ON and Led_OFF

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.