/// <summary> /// implements bcm2835_pwm_set_clock /// </summary> /// <param name="divisor"></param> public void Set_Clock(PWMClockDivider clockDivider) { /* From Gerts code */ UInt32 divisor = (UInt32)clockDivider & 0xfff; /* Stop PWM clock */ //bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x01); SafeWriteUInt32(bcm2835_clk + (int)OP.BCM2835_PWMCLK_CNTL, OP.BCM2835_PWM_PASSWRD | 0x01); //bcm2835_delay(110); /* Prevents clock going slow */ Wait(110); /* Wait for the clock to be not busy */ //while ((bcm2835_peri_read(bcm2835_clk + BCM2835_PWMCLK_CNTL) & 0x80) != 0) // bcm2835_delay(1); while ((SafeReadUInt32(bcm2835_clk + (int)OP.BCM2835_PWMCLK_CNTL) & 0x80) == 0) { Wait(1); } /* set the clock divider and enable PWM clock */ //bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_DIV, BCM2835_PWM_PASSWRD | (divisor << 12)); SafeWriteUInt32(bcm2835_clk + (int)OP.BCM2835_PWMCLK_DIV, OP.BCM2835_PWM_PASSWRD | (divisor << 12)); //bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x11); /* Source=osc and enable */ SafeWriteUInt32(bcm2835_clk + (int)OP.BCM2835_PWMCLK_CNTL, OP.BCM2835_PWM_PASSWRD | 0x11); }
protected static extern void bcm2835_pwm_set_clock(PWMClockDivider divider);
public static void SetClockDivider(PWMClockDivider divider) { bcm2835_pwm_set_clock(divider); }