Files
OBD2-car-display/due_obd2/obd2_timer.c
Sem van der Hoeven 5e934a19f1 timer
2023-11-03 00:25:00 +01:00

64 lines
1.9 KiB
C

#include "sam3xa/include/component/component_tc.h"
#include "obd2_timer.h"
void obd2_RTT_init(void)
{
/* enable the timer: reset the RTT
RTT->RTT_MR = RTT_MR_RTTRST;
/* set the alarm value to 0*/
RTT->RTT_AR = 0;
}
void obd2_RTT_enable()
{
/* enable the alarm interrupt and set the prescaler to the processor frequency to generate an interrupt every second*/
RTT->RTT_MR |= RTT_MR_ALMIEN | RTT_MR_RTPRES(CLOCK_FREQ);
/* enable the interrupt*/
NVIC_EnableIRQ(RTT_IRQn);
}
void obd2_RTT_reset()
{
/* To prevent several executions of the interrupt handler,
the interrupt must be disabled in the interrupt handler
and re-enabled when the status register is cleared.
*/
/* disable interrupts */
RTT->RTT_MR &= ~RTT_MR_ALMIEN;
/* clear the status register (reading it clears it)
SAM3X datasheet section 13.4: Reading the RTT_SR status register resets the RTTINC and ALMS fields.
*/
RTT->RTT_SR;
/* set the alarm value to 0*/
RTT->RTT_AR = 0;
/* re-enable the interrupt*/
RTT->RTT_MR |= RTT_MR_ALMIEN;
/* reset the RTT*/
RTT->RTT_MR |= RTT_MR_RTTRST;
}
void obd2_RTT_set_period(__UINT32_TYPE__ period)
{
/* set the prescaler value equal to the clock speed divided by how many milliseconds*/
RTT->RTT_MR |= RTT_MR_RTPRES(CLOCK_FREQ / (1000/period));
}
void obd2_TC_init()
{
/* disable write protection */
pmc_set_writeprotect(false);
// /* set clock source to main clock */
// pmc_mck_set_source(PMC_MCKR_CSS_MAIN_CLK);
/* set the clock to MCK/2, enable the timer/counter 0, enable RC compare trigger and capture mode */
TC0->TC_CHANNEL[0].TC_CCR |= TC_CMR_TCCLKS_TIMER_CLOCK1 | TC_CCR_CLKEN | TC_CMR_CPCTRG & ~(TC_CMR_WAVE);
/* disable the quadrature decoder, to route the IO pins of TIOA and TIOB directly to the timer counter function (36.6.14.1) */
TC0->TC_BMR &= ~(TC_BMR_QDEN);
}
void obd2_TC_start()
{
/* software trigger the timer reset it and start the clock */
TC0->TC_CHANNEL[0].TC_CCR |= TC_CCR_SWTRG;
}