Assignment #7: DAC, Build a Function Generator

📚 Assignment 7 CMPE2250: Build a Function Generator

📋 Objective

In this assignment, you will implement a multi-waveform function generator using the STM32 DAC, Timer 6 (TIM6), and Direct Memory Access (DMA).

1️⃣ Part 1: Interrupt-Driven Waveforms

  • Your first task is to generate basic geometric waveforms using a timer interrupt.

  • Configure TIM6 to generate an interrupt at a fixed frequency.

  • Inside the TIM6_DAC_LPTIM1_IRQHandler, implement logic to generate the following waveforms:

    • Ramp Up: Increment the DAC value until it reaches the maximum (4095), then reset to 0.

    • Ramp Down: Decrement the DAC value until it reaches 0, then reset to 4095.

    • Triangular: Increment to 4095, then change direction and decrement back to 0.

2️⃣ Part 2: DMA-Driven Sine Wave

  • Generating a high-frequency sine wave using an ISR consumes too much CPU time. Your next task is to offload this work to the hardware.

    • Use the provided sine_lookup[256] array.

    • Configure TIM6 to generate a TRGO (Trigger Output) instead of triggering an interrupt.

    • Configure the DAC to accept TIM6 as a hardware trigger.

    • Configure DMA1 (and the DMAMUX) to transfer data from the sine_lookup array to the DAC Data Holding Register (DHR12R1).

    • Ensure the DMA is set to Circular Mode with 16-bit (Half-word) transfer sizes.

    • Use a preprocessor directive (#ifdef DMA_ENABLED) to easily switch your code compilation between your Part 1 ISR logic and your Part 2 DMA logic.

const uint16_t sine_lookup[256] = {
  2098,2148,2198,2248,2298,2348,2398,2447,2496,2545,2594,2642,2690,2737,2784,2831,
  2877,2923,2968,3013,3057,3100,3143,3185,3226,3267,3307,3346,3385,3423,3459,3495,
  3530,3565,3598,3630,3662,3692,3722,3750,3777,3804,3829,3853,3876,3898,3919,3939,
  3958,3975,3992,4007,4021,4034,4045,4056,4065,4073,4080,4085,4089,4093,4094,4095,
  4094,4093,4089,4085,4080,4073,4065,4056,4045,4034,4021,4007,3992,3975,3958,3939,
  3919,3898,3876,3853,3829,3804,3777,3750,3722,3692,3662,3630,3598,3565,3530,3495,
  3459,3423,3385,3346,3307,3267,3226,3185,3143,3100,3057,3013,2968,2923,2877,2831,
  2784,2737,2690,2642,2594,2545,2496,2447,2398,2348,2298,2248,2198,2148,2098,2048,
  1997,1947,1897,1847,1797,1747,1697,1648,1599,1550,1501,1453,1405,1358,1311,1264,
  1218,1172,1127,1082,1038,995,952,910,869,828,788,749,710,672,636,600,
  565,530,497,465,433,403,373,345,318,291,266,242,219,197,176,156,
  137,120,103,88,74,61,50,39,30,22,15,10,6,2,1,0,
  1,2,6,10,15,22,30,39,50,61,74,88,103,120,137,156,
  176,197,219,242,266,291,318,345,373,403,433,465,497,530,565,600,
  636,672,710,749,788,828,869,910,952,995,1038,1082,1127,1172,1218,1264,
  1311,1358,1405,1453,1501,1550,1599,1648,1697,1747,1797,1847,1897,1947,1997,2048
};