Как создать заметку без библиотеки?

Я пытаюсь сгенерировать заметку, например Do, частота do 523. Я написал несколько кодов, но у меня не работало Systick 8 МГц

void note1(void){ // Note Do    

    for (int i = 0; i < 523; i++){

        GPIOE->ODR = 0x4000;
        delay_ms(1);
        GPIOE->ODR = 0x0000;
        delay_ms(1);
    }
}

Как мы можем решить эту проблему?

EasyMx Pro v7

Я вызываю эту функцию

void button_handler(void)
{
    note1();

    // Clear pending bit depending on which one is pending
    if (EXTI->PR & (1 << 0)){

        EXTI->PR = (1 << 0);
    }
    else if (EXTI->PR & (1 << 1)){

        EXTI->PR = (1 << 1);
    }       
}

523 раза отправка 1 и 0 и delay_ms 1 = 1 мс

1000 = 1 сек

2 ответа

На STM32 (как я вижу, у вас есть) у вас есть таймеры, которые можно настроить как выход PWM. Поэтому используйте таймер, установите период и значения предварительного масштабирования в соответствии с необходимой частотой и установите коэффициент заполнения на канале на 50%.

Если вам нужен выход ШИМ 523 Гц, тогда установите таймер ШИМ на 523 Гц, используя прескалер и значение периода:

timer_overflow_frequency = timer_input_clock / 
                           (prescaler_value + 1) / 
                           (period_value + 1) ;

Затем для вашего выходного канала установите значение половины периода таймера.

Для стандартной периферийной библиотеки учебник можно использовать здесь: https://stm32f4-discovery.net/2014/05/stm32f4-stm32f429-discovery-pwm-tutorial/

Ссылка для раскрутки для Cube https://electronics.stackexchange.com/questions/179546/getting-pwm-to-work-on-stm32f4-using-sts-hal-libraries

У вас, кажется, есть фундаментальное недоразумение. В вашем коде note1()значение 523 будет влиять только на длительность ноты, а не на ее частоту. С высотой 1 мс и 1 мс, повторяемой 523 раза, вы будете генерировать тон приблизительно 500 Гц в течение приблизительно 1,43 секунды. Я говорю "приблизительно", потому что в цикле будут небольшие издержки, отличные от временных задержек.

Разрешение с задержкой 1 мс недостаточно для генерации точного тона таким образом. Чтобы сделать это так, как вы делаете, каждая задержка должна составлять 1/2 секунды, поэтому для 523 Гц примерно 956 мс. Счетчик итераций цикла должен быть равен футу, например, за 25 секунд, 131 итерации.

Однако если button_handler() как представляется, что это обработчик прерываний, вы действительно не должны тратить 1,46 секунды в обработчике прерываний!

В любом случае это чрезвычайно трудоемкий, ресурсоемкий и неточный метод генерации определенной частоты. STM32 на вашей плате хорошо оснащен аппаратными таймерами с прямым выходом GPIO, которые будут генерировать нужную частоту с нулевой загрузкой программного обеспечения. Даже если ни один из таймеров не сопоставляется с подходящим выходом GPIO, который вам нужно использовать, вы все равно можете получить его, чтобы сгенерировать прерывание со скоростью 1/2f и переключить вывод в обработчике прерываний. В любом случае, процессор будет свободен для выполнения полезных задач во время вывода тона.

Другие вопросы по тегам