RP2040 и таймер

Buldakov
Offline
Зарегистрирован: 17.01.2016

У платы RP2040 надо посчитать количество тактов опорной частоты с определенного момента. Например если частота работы платы 125 МГц а интервал 2 секунды количество тактов должно быть 250М. Может кто нибудь подсказать как это сделать на Си или написать ссылку на статью? 

Buldakov
Offline
Зарегистрирован: 17.01.2016

Пока код такой.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//(RS,E,D4,D5,D6,D7)
int main() {
 unsigned long t1,t2,t3;
    lcd.begin(20, 4);
  
    while (true) {
        t1=micros();
        delayMicroseconds(1000000); 
        t2=micros();
        t3=t2-t1;

    lcd.setCursor(0, 0);
    lcd.print(t1);
    lcd.setCursor(0, 1);
    lcd.print(t2);
    lcd.setCursor(0, 3);
    lcd.print(t3);    
    delay(1000);

    }
}

Считываю значение Т1 затем делаю задержку в 1000000 мкс. (эта задержка только для демонстрации). Затем считываю значение Т2.

Значение Т3 конечный результат, который мне нужен. Но у него точность только 1 мкс. Нашел по ссылке переменную time.monotonic_ns() но не знаю как ее применить в данном коде?

https://digitology.tech/docs/python_3/library/time.html

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

вы в чем программируете? в инете куча рецептов как с LCD1602 работать , а в SDK есть готовый пример, в том числе и с таймерами, а то получается что у вас код под Arduino IDE, а ссылку вы привели для Питона. Определитесь уже.

Buldakov
Offline
Зарегистрирован: 17.01.2016

Я программирую в Arduino IDE. Как работать с таймерами я нашел только для Питона. Поэтому ссылку и написал для питона. Если есть готовый пример для Arduino IDE прошу скинуть ссылку. Я не нашел как работать с таймером. Надо измерить интервал времени между двумя событиями с точностью до десятков наносекунд.

Возможно ли, что это то, что мне надо?

https://habr.com/ru/post/422443/

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Не уверен, но думаю не найдёте такой пример под ide.

Buldakov
Offline
Зарегистрирован: 17.01.2016

Так во 2 посте Вы пишите, что есть готовый пример под SDK. Вот и прошу ссылку на этот пример.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

вот из примеров уже в реальный проект миллисекундный таймер, есть микросекундный, наверняка если покапаться по документации, то есть еще более быстрый счетчик .

bool repeating_timer_callback(struct repeating_timer *t) {
    ++_dmfMillis;
    static unsigned long s1timer = 0;
    if ((_dmfMillis-s1timer) >= 1000UL) {
      s1timer = _dmfMillis;
      if (callbackF1SEChandler) callbackF1SEChandler();
      if (callbackS1SEChandler) callbackS1SEChandler();
    }
    // --
    return true;
}

void startMillisTimer(void) {
    callbackF1SEChandler = NULL;
    add_repeating_timer_ms(1, repeating_timer_callback, NULL, &timer); // start millis timer
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Buldakov пишет:

У платы RP2040 надо посчитать количество тактов опорной частоты с определенного момента. Например если частота работы платы 125 МГц а интервал 2 секунды количество тактов должно быть 250М. Может кто нибудь подсказать как это сделать на Си или написать ссылку на статью? 

а чем определяется "определенный момент"?

Навскидку вроде все просто - на старте запускаете таймер на тактовой частоте, без делителя. В "определенный момент" просто читаете значение его счетчика, вот и все.

Это при условии, что измеряемый интервал меньше времени переполнения. Если больше - придется добавить счетчик числа переполнений на прерывании.