Hi all,
I need to generate two 1 MHz signals with opposite phases. However once I configure the decode mode as "Individual" I don't have output signals. In case of "Common" mode, I have two same output signals but this is not what I want. Under debugger I have different register values especially for EVENTS_SEQxxx.
1. Individual mode

2. Common mode

Here is the code:
/* PWM for 1 MHz square signal generation */
#define PWM_OUTPUT_PIN_0 11//22//4 // First 1 MHz signal
#define PWM_OUTPUT_PIN_1 12//23//5 // Second 1 MHz signal (inverted)
// Define PWM sequence for complementary 1 MHz signals
// static uint16_t pwm_seq[2] = {8, 8}; // 50% duty cycle for both channels
static uint16_t pwm_seq[4] = {
8, // CH0: Normal (rising edge)
8 | (1 << 15), // CH1: Inverted (falling edge)
};
void io_pwm_init(void) {
nrf_clock_hfclk_t HF_CLk;
/* Check if the high frequency crystal isn't enabled */
HF_CLk = nrf_clock_hf_src_get();
if (HF_CLk != NRF_CLOCK_HFCLK_HIGH_ACCURACY)
{
/* Enable the high frequency clock */
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
{
/* Do nothing while waiting for the clock to start */
}
}
// Select GPIOs for PWM output
NRF_PWM0->PSEL.OUT[0] = PWM_OUTPUT_PIN_0 | (PWM_PSEL_OUT_CONNECT_Connected << PWM_PSEL_OUT_CONNECT_Pos);
NRF_PWM0->PSEL.OUT[1] = PWM_OUTPUT_PIN_1 | (PWM_PSEL_OUT_CONNECT_Connected << PWM_PSEL_OUT_CONNECT_Pos);
// Set PWM mode (Up mode)
NRF_PWM0->MODE = PWM_MODE_UPDOWN_Up << PWM_MODE_UPDOWN_Pos;
// Set the prescaler keep 16 MHz PWM base clock
NRF_PWM0->PRESCALER = PWM_PRESCALER_PRESCALER_DIV_1; // 16 MHz clock
// Set the maximum count value for 1 MHz frequency
NRF_PWM0->COUNTERTOP = 16; // 16 MHz / 16 = 1 MHz
// Assign sequence to PWM
NRF_PWM0->SEQ[0].PTR = (uint32_t)pwm_seq;
NRF_PWM0->SEQ[0].CNT = 2;
NRF_PWM0->SEQ[0].REFRESH = 0;
NRF_PWM0->SEQ[0].ENDDELAY = 0;
// Configure decoder to use individual values
NRF_PWM0->DECODER = PWM_DECODER_LOAD_Individual << PWM_DECODER_LOAD_Pos;
//NRF_PWM0->DECODER = PWM_DECODER_LOAD_Common << PWM_DECODER_LOAD_Pos;
// Enable the PWM peripheral
NRF_PWM0->ENABLE = 1;
// NRF_PWM0->LOOP = 0; // Ensure it does not stop after one cycle
NRF_PWM0->LOOP = (PWM_LOOP_CNT_Msk & (0 << PWM_LOOP_CNT_Pos)); // Infinite looping
// Start the PWM sequence
NRF_PWM0->TASKS_SEQSTART[0] = 1;
}
Thanks for your help.
BR,
Hulu