/** @addtogroup timer_file TIMER peripheral API * * @brief Access functions for the Timer/Counter * * @ingroup peripheral_apis * LGPL License Terms @ref lgpl_license * @author @htmlonly © @endhtmlonly 2016 * Maxim Sloyko * */ /* * This file is part of the libopencm3 project. * * Copyright (C) 2017-2018 Unicore MX project * Copyright (C) 2021 Eduard Drusa * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ #include #include /**@{*/ /** @brief Get timer ticks * * @param[in] timer uint32_t timer base * @returns current ticks value */ uint32_t timer_get_ticks(uint32_t timer) { uint32_t ticks; uint32_t cc; /* TODO: Check WTF is this doing? */ cc = TIMER_CC(0, 0); TIMER_TASK_CAPTURE(timer, 0) = 1; ticks = TIMER_CC(timer, 0); TIMER_CC(timer, 0) = cc; return ticks; } /** @brief Set timer mode (counter/timer) * * @param[in] timer uint32_t timer base * @param[in] mode enum timer_mode */ void timer_set_mode(uint32_t timer, enum timer_mode mode) { TIMER_MODE(timer) = mode; } /** @brief Set timer bit mode (width) * * @param[in] timer uint32_t timer base * @param[in] bitmode enum timer_bitmode */ void timer_set_bitmode(uint32_t timer, enum timer_bitmode bitmode) { TIMER_BITMODE(timer) = bitmode; } /** @brief Start the timer * * @param[in] timer uint32_t timer base */ void timer_start(uint32_t timer) { PERIPH_TRIGGER_TASK(TIMER_TASK_START(timer)); } /** @brief Stop the timer * * @param[in] timer uint32_t timer base */ void timer_stop(uint32_t timer) { PERIPH_TRIGGER_TASK(TIMER_TASK_STOP(timer)); } /** @brief Clear the timer * * @param[in] timer uint32_t timer base */ void timer_clear(uint32_t timer) { PERIPH_TRIGGER_TASK(TIMER_TASK_CLEAR(timer)); } /** @brief Set prescaler value * * @param[in] timer uint32_t timer base * @param[in] presc uint8_t prescaler value */ void timer_set_prescaler(uint32_t timer, uint8_t presc) { TIMER_PRESCALER(timer) = presc & TIMER_PRESCALER_MASK; } /** @brief Set compare register * * @param[in] timer uint32_t timer base * @param[in] compare_num uint8_t compare number (0-3) * @param[in] compare_val uint32_t compare value */ void timer_set_compare(uint32_t timer, uint8_t compare_num, uint32_t compare_val) { if (compare_num > 3) { return; } TIMER_CC(timer, compare_num) = compare_val; } /** @brief Get the timer tick frequency * * @param[in] timer uint32_t timer base * @returns frequency of ticking */ uint32_t timer_get_freq(uint32_t timer) { return CLOCK_PCLK/(1<