gossamer 0.0.1
a very lightweight app framework for SAMD and SAML chips
Loading...
Searching...
No Matches
Timer/Counter for Control Applications

Functions for configuring and using the TCC peripheral, a more advanced timer/counter. More...

Enumerations

enum  tcc_prescaler_value_t {
  TCC_PRESCALER_DIV1 = 0 , TCC_PRESCALER_DIV2 = 1 , TCC_PRESCALER_DIV4 = 2 , TCC_PRESCALER_DIV8 = 3 ,
  TCC_PRESCALER_DIV16 = 4 , TCC_PRESCALER_DIV64 = 5 , TCC_PRESCALER_DIV256 = 6 , TCC_PRESCALER_DIV1024 = 7
}
 
enum  tcc_wavegen_t { TCC_WAVEGEN_NORMAL_FREQUENCY = 0 , TCC_WAVEGEN_MATCH_FREQUENCY = 1 , TCC_WAVEGEN_NORMAL_PWM = 2 }
 
enum  tcc_output_matrix_t { TCC_OUTPUT_MATRIX_MODULO_4 = 0 , TCC_OUTPUT_MATRIX_MODULO_2 = 1 , TCC_OUTPUT_MATRIX_ALL_CC0 = 2 , TCC_OUTPUT_MATRIX_WO0_CC0_OTHERS_CC1 = 3 }
 
enum  tcc_channel_polarity_t { TCC_CHANNEL_POLARITY_NORMAL = 0 , TCC_CHANNEL_POLARITY_INVERTED = 1 }
 

Functions

bool tcc_init (uint8_t instance, generic_clock_generator_t clocksource, tcc_prescaler_value_t prescaler)
 Enables the peripheral clock for the TCC and clocks it with the selected clock source. Also resets the TCC to its starting configuration.
 
void tcc_set_run_in_standby (uint8_t instance, bool runStandby)
 Sets whether the TCC should run in standby mode.
 
void tcc_set_wavegen (uint8_t instance, tcc_wavegen_t mode)
 Sets the waveform generation mode for the TCC.
 
void tcc_set_output_matrix (uint8_t instance, tcc_output_matrix_t mode)
 Sets the output matrix for the TCC.
 
void tcc_set_channel_polarity (uint8_t instance, uint8_t channel, tcc_channel_polarity_t polarity)
 Sets the polarity of a channel.
 
void tcc_enable (uint8_t instance)
 Enables the TCC. Make sure to call tcc_init first to set it up.
 
bool tcc_is_enabled (uint8_t instance)
 Checks whether the TCC is enabled.
 
void tcc_set_period (uint8_t instance, uint32_t period, bool buffered)
 Sets the period of the TCC.
 
uint32_t tcc_get_period (uint8_t instance)
 Gets the period of the TCC.
 
void tcc_set_cc (uint8_t instance, uint8_t channel, uint32_t value, bool buffered)
 Sets the value of a compare channel.
 
void tcc_set_count (uint8_t instance, uint32_t value)
 Sets the value of the counter.
 
uint32_t tcc_get_count (uint8_t instance)
 Gets the current value of the counter.
 
void tcc_stop (uint8_t instance)
 Issues a STOP command to the TCC.
 
void tcc_retrigger (uint8_t instance)
 Issues a RETRIGGER command to the TCC.
 
void tcc_update (uint8_t instance)
 Issues an UPDATE command to the TCC.
 
void tcc_disable (uint8_t instance)
 Disables the TCC, but retains all its settings.
 

Detailed Description

Functions for configuring and using the TCC peripheral, a more advanced timer/counter.

Function Documentation

◆ tcc_disable()

void tcc_disable ( uint8_t  instance)

Disables the TCC, but retains all its settings.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.

◆ tcc_enable()

void tcc_enable ( uint8_t  instance)

Enables the TCC. Make sure to call tcc_init first to set it up.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.

◆ tcc_get_count()

uint32_t tcc_get_count ( uint8_t  instance)

Gets the current value of the counter.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
Returns
The current value of the counter.

◆ tcc_get_period()

uint32_t tcc_get_period ( uint8_t  instance)

Gets the period of the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
Returns
The current period of value.

◆ tcc_init()

bool tcc_init ( uint8_t  instance,
generic_clock_generator_t  clocksource,
tcc_prescaler_value_t  prescaler 
)

Enables the peripheral clock for the TCC and clocks it with the selected clock source. Also resets the TCC to its starting configuration.

This just sets up the TCC in its reset state. You are still responsible for configuring it with the options you need for waveform output.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
clocksourceThe clock source to use for the TCC.
prescalerThe prescaler factor, which divides the clock source by a factor:
  • TCC_PRESCALER_DIV1 - clock source unchanged
  • TCC_PRESCALER_DIV2 - clock source divided by 2
  • TCC_PRESCALER_DIV4 - clock source divided by 4
  • TCC_PRESCALER_DIV8 - clock source divided by 8
  • TCC_PRESCALER_DIV16 - clock source divided by 16
  • TCC_PRESCALER_DIV64 - clock source divided by 64
  • TCC_PRESCALER_DIV256 - clock source divided by 256
  • TCC_PRESCALER_DIV102 - clock source divided by 1024
Returns
true if the TCC was set up, false if instance was out of range (i.e. you asked for TCC2, but the microcontroller only has one TCC).
Note
if this function returns false, you shouldn't interact with this TCC instance with any other functions; they don't do the bounds check that this does.

◆ tcc_is_enabled()

bool tcc_is_enabled ( uint8_t  instance)

Checks whether the TCC is enabled.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
Returns
true if the TCC is enabled, false if instance is disabled.

◆ tcc_retrigger()

void tcc_retrigger ( uint8_t  instance)

Issues a RETRIGGER command to the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.

◆ tcc_set_cc()

void tcc_set_cc ( uint8_t  instance,
uint8_t  channel,
uint32_t  value,
bool  buffered 
)

Sets the value of a compare channel.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
channelThe compare channel to set, from 0 to 3 (or 0-1 on some TCCs; check the data sheet)
bufferedIf true, sets the CC value in the buffered register, which will be loaded at the next UPDATE condition. If false, sets the period directly. Note that double buffering is not available on the SAM D11 and SAM D21, and a value of true on those platforms will be ignored.
valueThe value to set the compare channel to. Max 24 bits (16,777,215).

◆ tcc_set_channel_polarity()

void tcc_set_channel_polarity ( uint8_t  instance,
uint8_t  channel,
tcc_channel_polarity_t  polarity 
)

Sets the polarity of a channel.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
channelThe waveform output channel from 0 to 7.
polarityThe polarity to set. One of:
  • TCC_CHANNEL_POLARITY_NORMAL - The output is high when WO[n] is set.
  • TCC_CHANNEL_POLARITY_INVERTED - The output is low when WO[n] is set.

    Inverting one of the waveform outputs is useful to drive a device with a differential signal; inverting several outputs can be useful if you are driving something whose polarity is reversed, like a common anode LED.

◆ tcc_set_count()

void tcc_set_count ( uint8_t  instance,
uint32_t  value 
)

Sets the value of the counter.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
valueThe value to set the counter to. Max 24 bits (16,777,215).

◆ tcc_set_output_matrix()

void tcc_set_output_matrix ( uint8_t  instance,
tcc_output_matrix_t  mode 
)

Sets the output matrix for the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
modeThe output matrix mode to use. One of:
  • TCC_OUTPUT_MATRIX_MODULO_4 - Compare channels CC0-CC3 are distributed across waveform outputs WO[0]-WO[7] in a modulo 4 fashion, such that CC0 controls WO[0] and WO[4], CC1 controls WO[1] and WO[5], CC2 controls WO[2] and WO[6], and CC3 controls WO[3] and WO[7].
  • TCC_OUTPUT_MATRIX_MODULO_2 - Compare channels CC0-CC1 are distributed across waveform outputs WO[0]-WO[7] in a modulo 2 fashion, such that CC0 controls WO0, WO2, WO4, and WO6, and CC1 controls WO1, WO3, WO5, and WO7.
  • TCC_OUTPUT_MATRIX_ALL_CC0 - Compare channel CC0 controls all waveform outputs.
  • TCC_OUTPUT_MATRIX_WO0_CC0_OTHERS_CC1 - Compare channel CC0 controls waveform output WO0, and compare channel CC1 controls all other waveform outputs.

◆ tcc_set_period()

void tcc_set_period ( uint8_t  instance,
uint32_t  period,
bool  buffered 
)

Sets the period of the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
periodThe period to set.
bufferedIf true, sets the period in the buffered register, which will be loaded at the next UPDATE condition. If false, sets the period directly. Note that double buffering is not available on the SAM D11 and SAM D21, and a value of true on those platforms will be ignored.

The period is the value that the counter counts up to before resetting. The frequency of the timer is determined by the period and the prescaler value.

◆ tcc_set_run_in_standby()

void tcc_set_run_in_standby ( uint8_t  instance,
bool  runStandby 
)

Sets whether the TCC should run in standby mode.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
runStandbytrue if the TCC should run in standby mode, false otherwise.

◆ tcc_set_wavegen()

void tcc_set_wavegen ( uint8_t  instance,
tcc_wavegen_t  mode 
)

Sets the waveform generation mode for the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.
modeThe waveform generation mode to use. One of:
  • TCC_WAVEGEN_NORMAL_FREQUENCY - Normal frequency generation. The TOP value is PER, and waveform output WO[n] toggles on a match with a compare channel (n % 4 by default;
See also
tcc_set_output_matrix for other options). This mode results in a square wave with a frequency dependent on the PER register, and a duty cycle that depends on the CCn register.
  • TCC_WAVEGEN_MATCH_FREQUENCY - Match frequency generation. The TOP value is CC0. WO[0] toggles on a match with TOP / CC0 and the counter resets. This results in a square wave with a 50% duty cycle whose frequency depends on CC0.
  • TCC_WAVEGEN_NORMAL_PWM - Normal pulse-width modulation. The TOP value is PER. Waveform output WO[n] is set at the start of the period and cleared on a match with a compare channel (n % 4 by default;
tcc_set_output_matrix for other options). This mode results in a square wave with a frequency defined by the PER register, and a duty cycle defined by the CCn register.

◆ tcc_stop()

void tcc_stop ( uint8_t  instance)

Issues a STOP command to the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.

When a stop is detected while the counter is running, the counter will maintain its current value, and the Stop bit in the Status register will be set (STATUS.STOP).

Note
There is a more complex way to set what happens to the waveform outputs in a stop condition: you can set values for each waveform in the DRVCTRL's Non-Recoverable State Output Enable (DRVCTRL.NREx) and Non- Recoverable State Output Value (DRVCTRL.NRVx) bits. This is not currently implemented; see the data sheet for more information.

◆ tcc_update()

void tcc_update ( uint8_t  instance)

Issues an UPDATE command to the TCC.

Parameters
instanceThe TCC peripheral instance as numbered in the data sheet, or 0.