Как создать заметку без библиотеки?
Я пытаюсь сгенерировать заметку, например 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 и переключить вывод в обработчике прерываний. В любом случае, процессор будет свободен для выполнения полезных задач во время вывода тона.