我正在尝试生成注释例如Do,do的频率是523。 我写了一些代码但是,我没有工作 Systick 8 mhz
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 ms
1000 = 1秒
答案 0 :(得分:2)
在STM32上(我可以看到你拥有它)你有定时器可以配置为PWM输出。 因此,请根据您所需的频率使用定时器,设置周期和预分频值,并将通道上的占空比设置为50%。
如果需要523Hz PWM输出,则使用预分频器和周期值将定时器PWM设置为523Hz:
timer_overflow_frequency = timer_input_clock /
(prescaler_value + 1) /
(period_value + 1) ;
然后,为您的输出通道设置值定时器周期值的一半。
对于标准外设库,可以从这里使用教程: https://stm32f4-discovery.net/2014/05/stm32f4-stm32f429-discovery-pwm-tutorial/
的展开链接答案 1 :(得分:0)
你似乎有一个根本的误解。在代码note1()
中,值523将仅影响注释的持续时间,其频率为。如果高1ms,1ms低重复523次,则大约 500Hz的音调大约 1.43秒。我说&#34;大约&#34;因为除了时间延迟之外,循环中会有一些小的开销。
时间延迟分辨率1ms不足以以这种方式产生准确的音调。要以你的方式进行,每个延迟需要 1 / 2f 秒,因此对于523Hz大约956ms。循环迭代计数需要 ft ,所以说.25秒,131次迭代。
但是,如果button_handler()
看起来像是一个中断处理程序,那么你真的不应该在中断处理程序中花费1.46秒!
无论如何,这是一种非常费力,CPU密集且不准确的生成特定频率的方法。电路板上的STM32具有直接GPIO输出的硬件定时器,无需软件即可准确生成您需要的频率。即使没有定时器映射到您需要使用的合适GPIO输出,您仍然可以在 1 / 2f 处生成中断并在中断处理程序中切换引脚。无论哪种方式都会让处理器在输出音调时自由地做有用的东西。