如何生成没有库的笔记?

时间:2017-03-28 11:09:35

标签: c embedded frequency mikroc

我正在尝试生成注释例如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秒

2 个答案:

答案 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/

来自多维数据集https://electronics.stackexchange.com/questions/179546/getting-pwm-to-work-on-stm32f4-using-sts-hal-libraries

的展开链接

答案 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 处生成中断并在中断处理程序中切换引脚。无论哪种方式都会让处理器在输出音调时自由地做有用的东西。