STM32 считаем пинки кварцевого резонатора.

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
здравствуйте форумчане, может кто знает как заставить таймер в тупую считать пинки резонатора?
C++:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) // колбек по захвату TIM4
{
    if (htim->Instance == TIM4)                          // Прерывание от TIM4
    {

        HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
        if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)         // Переход 0->1 ?
                {
            __HAL_TIM_SET_COUNTER(&htim4, 0x0000);         // Обнуление счётчика
            __HAL_TIM_SET_COUNTER(&htim3, 0x0000);         // Обнуление счётчика

        } else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)  // Переход 1->0 ?
                {
            speed = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4); // Чтение значения в регистре захвата/сравнения
            hitch = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_4); // Чтение значения в регистре захвата/сравнения
        }
    }
}
1612443870674.png
а-ля, как настроить канал, чтобы после обнуления последнего я знал сколько тиков прошло?
зы. шина на которой висит 3 таймер работает на частоте 36Мгц и с установленным предделителем срабатывает каждую миллисекунду.
 

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
C++:
else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)  // Переход 1->0 ?
                {
            speed = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4); // Чтение значения в регистре захвата/сравнения
            hitch = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_4); // Чтение значения в регистре захвата/сравнения
        }
т.е вот, как это реализовано с переменной speed, для начала, тоже самое надо сделать и с переменной hitch, но вот проблема в том, что HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_4); равняется нулю и считать отказывается, хотя третий таймер настроен аналогично работающему четвёртому.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,415
978
58
Марий-Эл
@itsterit, Тогда всё просто. У таймера высталяешь делитель равным нулю. Ловишь прерывание и вечно висишь в нём, так как ядро не будет успевать выполнять запросы.
 

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
интересно, но чутка не то, я хочу реализовать это как ты реализовал в примере с колбеком))
 

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
то есть вот я включил таймер:
1612465264000.png
потом обнуляю его.

и вроде должен получать с него данные:
1612465449213.png
но вот вопрос: можно ли это сделать никак не настраивая каналы?
 

Вложения

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
C++:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) // колбек по захвату TIM4
    {
    if (htim->Instance == TIM4)                          // Прерывание от TIM4 ?
    {

   if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)         // Переход 0->1 ?
        {
        __HAL_TIM_SET_COUNTER(&htim4, 0x0000);         // Обнуление счётчика
        __HAL_TIM_SET_COUNTER(&htim3, 0x0000);         // Обнуление счётчика
        }


     else if ((HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4)) >= hold)

        {
        speed = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);
        retention++;
        }


      else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) // Переход 1->0 ?
        {
         speed = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4); // Чтение значения в регистре захвата/сравнения
         hitch = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_4);
        press++;
        }
    }
    }
 

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
тобишь как его запустить
1612465669477.png

если запущу третий таймер так, то как с него считать значения?
1612465723187.png
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
@itsterit, причем тут CapturedValue ? - это вы взяли режим захвата, он срабатывает по внешнему прерыванию, а вам вроде совсем другое надо.
Если вы хотите посмотреть. сколько прошло системных тиков от момента Х0 до момента Х1. то все проще.
Таймер сам увеличивает свой счетчик на единицу при каждом клоке - вот основной счетчик таймера и запрашивайте.
В начале периода обнулили таймер
C++:
 __HAL_TIM_SET_COUNTER(&htim3, 0x0000);
в конце периода считали значение:
C++:
uint32_t counter = __HAL_TIM_GET_COUNTER(&htim3);
 
  • Лойс +1
Реакции: itsterit

itsterit

✩✩✩✩✩✩✩
25 Сен 2019
19
0
@itsterit, причем тут CapturedValue ? - это вы взяли режим захвата, он срабатывает по внешнему прерыванию, а вам вроде совсем другое надо.
Если вы хотите посмотреть. сколько прошло системных тиков от момента Х0 до момента Х1. то все проще.
Таймер сам увеличивает свой счетчик на единицу при каждом клоке - вот основной счетчик таймера и запрашивайте.
В начале периода обнулили таймер
C++:
 __HAL_TIM_SET_COUNTER(&htim3, 0x0000);
в конце периода считали значение:
C++:
uint32_t counter = __HAL_TIM_GET_COUNTER(&htim3);
спасибо bort707 , приехал домой, проверил - завелось!!!