Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
hardware_dma_controller.c@1:c125f4e65df7, 2021-11-03 (annotated)
- Committer:
- rajathr
- Date:
- Wed Nov 03 05:31:26 2021 +0000
- Revision:
- 1:c125f4e65df7
- Parent:
- 0:716b93ab9a58
Commit as on 3rd Nov at 1.31 AM
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rajathr | 0:716b93ab9a58 | 1 | #include "gpio.h" |
rajathr | 0:716b93ab9a58 | 2 | #include "hardware_dma_controller.h" |
rajathr | 0:716b93ab9a58 | 3 | #include "stm32f4xx_rcc_mort.h" |
rajathr | 0:716b93ab9a58 | 4 | #include "hardware_adc.h" |
rajathr | 0:716b93ab9a58 | 5 | |
rajathr | 0:716b93ab9a58 | 6 | //Defining Base Addresses and Registers |
rajathr | 0:716b93ab9a58 | 7 | #define DMA2_BASE_ADDRESS ((uint32_t)0x40026400) |
rajathr | 0:716b93ab9a58 | 8 | #define DMA2_LISR_REGISTER (DMA2_BASE_ADDRESS + 0x00) |
rajathr | 0:716b93ab9a58 | 9 | #define DMA2_HISR_REGISTER (DMA2_BASE_ADDRESS + 0x04) |
rajathr | 0:716b93ab9a58 | 10 | #define DMA2_LIFCR_REGISTER (DMA2_BASE_ADDRESS + 0x08) |
rajathr | 0:716b93ab9a58 | 11 | #define DMA2_HIFCR_REGISTER (DMA2_BASE_ADDRESS + 0x0C) |
rajathr | 0:716b93ab9a58 | 12 | #define DMA2_S0CR_REGISTER (DMA2_BASE_ADDRESS + 0x10) |
rajathr | 0:716b93ab9a58 | 13 | #define DMA2_S0NDTR_REGISTER (DMA2_BASE_ADDRESS + 0x14) |
rajathr | 0:716b93ab9a58 | 14 | #define DMA2_S0PAR_REGISTER (DMA2_BASE_ADDRESS + 0x18) |
rajathr | 0:716b93ab9a58 | 15 | #define DMA2_S0M0AR_REGISTER (DMA2_BASE_ADDRESS + 0x1C) |
rajathr | 0:716b93ab9a58 | 16 | #define DMA2_S0M1AR_REGISTER (DMA2_BASE_ADDRESS + 0x20) |
rajathr | 0:716b93ab9a58 | 17 | #define DMA2_S0FCR_REGISTER (DMA2_BASE_ADDRESS + 0x24) |
rajathr | 0:716b93ab9a58 | 18 | |
rajathr | 0:716b93ab9a58 | 19 | //Defining bits and flags |
rajathr | 0:716b93ab9a58 | 20 | //DMA_SxCR: DMA STREAM X CONFIGURATION REGISTER |
rajathr | 0:716b93ab9a58 | 21 | #define DMA_SxCR_CHANNEL_2_SELECT (((uint32_t)2)<<25) //To Select Channel 2 |
rajathr | 0:716b93ab9a58 | 22 | #define DMA_SxCR_MSIZE_HALF_WORD (((uint32_t)1)<<13) //The location memory is 16 bits in length |
rajathr | 0:716b93ab9a58 | 23 | #define DMA_SxCR_PSIZE_HALF_WORD (((uint32_t)1)<<11) //The peripheral data size is 16 bits in length |
rajathr | 0:716b93ab9a58 | 24 | #define DMA_SxCR_MINC_INCREMENT (((uint32_t)1)<<10) //Increment the place where you store the data each transfer |
rajathr | 0:716b93ab9a58 | 25 | #define DMA_SxCR_CIRC_ENABLE (((uint32_t)1)<<8) //Enable circular mode |
rajathr | 0:716b93ab9a58 | 26 | #define DMA_SxCR_DIR_PERTOMEM 0 |
rajathr | 0:716b93ab9a58 | 27 | #define DMA_SxCR_STREAM_ENABLE 1 |
rajathr | 0:716b93ab9a58 | 28 | |
rajathr | 1:c125f4e65df7 | 29 | |
rajathr | 1:c125f4e65df7 | 30 | #define ADC_REGISTER_BASE_ADDRESS ((uint32_t)0x40012000) |
rajathr | 1:c125f4e65df7 | 31 | #define ADC_3_BASE_ADDRESS (ADC_REGISTER_BASE_ADDRESS + 0x200) |
rajathr | 1:c125f4e65df7 | 32 | #define ADC_3_DR_REGISTER (ADC_3_BASE_ADDRESS + 0x4C) |
rajathr | 1:c125f4e65df7 | 33 | |
rajathr | 1:c125f4e65df7 | 34 | |
rajathr | 1:c125f4e65df7 | 35 | uint16_t adcDmaDataStorageBuffer_3_Channel[3]; //Variable Definition to store read values |
rajathr | 1:c125f4e65df7 | 36 | uint16_t adcDmaDataStorageBuffer_1_Channel[1]; //Variable Definition to store read value |
rajathr | 0:716b93ab9a58 | 37 | |
rajathr | 0:716b93ab9a58 | 38 | |
rajathr | 0:716b93ab9a58 | 39 | //FUNCTION GIVEN BY PROFESSOR TO SETUP DMA TO READ VALUES FROM 3 PINS |
rajathr | 0:716b93ab9a58 | 40 | void initDMAForAdc3_1Channel(void) |
rajathr | 0:716b93ab9a58 | 41 | { |
rajathr | 1:c125f4e65df7 | 42 | uint32_t * reg; |
rajathr | 0:716b93ab9a58 | 43 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* Enable the clock */ |
rajathr | 0:716b93ab9a58 | 44 | |
rajathr | 0:716b93ab9a58 | 45 | // Configure Stream 0 to use Channel 2 - ADC3 |
rajathr | 0:716b93ab9a58 | 46 | reg = (uint32_t *)DMA2_S0CR_REGISTER; |
rajathr | 0:716b93ab9a58 | 47 | *reg = DMA_SxCR_CHANNEL_2_SELECT + DMA_SxCR_MSIZE_HALF_WORD + DMA_SxCR_PSIZE_HALF_WORD + DMA_SxCR_DIR_PERTOMEM +DMA_SxCR_CIRC_ENABLE; |
rajathr | 0:716b93ab9a58 | 48 | |
rajathr | 0:716b93ab9a58 | 49 | //We will transfer 1 data registers for 1 channels of ADC |
rajathr | 0:716b93ab9a58 | 50 | reg = (uint32_t *)DMA2_S0NDTR_REGISTER; |
rajathr | 0:716b93ab9a58 | 51 | *reg = 1; |
rajathr | 0:716b93ab9a58 | 52 | |
rajathr | 0:716b93ab9a58 | 53 | //We will transfer from the ADC3 Data Register |
rajathr | 0:716b93ab9a58 | 54 | reg = (uint32_t *)DMA2_S0PAR_REGISTER; |
rajathr | 0:716b93ab9a58 | 55 | *reg = ADC_3_DR_REGISTER; //THIS FUNCTION IS DEFINED IN HARDWARE ADC |
rajathr | 0:716b93ab9a58 | 56 | |
rajathr | 0:716b93ab9a58 | 57 | //We will transfer to the adcDmaDataStorageBuffer we created |
rajathr | 0:716b93ab9a58 | 58 | reg = (uint32_t *)DMA2_S0M0AR_REGISTER; |
rajathr | 1:c125f4e65df7 | 59 | *reg = (uint32_t)&adcDmaDataStorageBuffer_1_Channel[0]; //QUESTION - WHY IS THIS ZERO??? DIDNT UNDERSTAND THIS STATEMENT |
rajathr | 0:716b93ab9a58 | 60 | |
rajathr | 0:716b93ab9a58 | 61 | } |
rajathr | 0:716b93ab9a58 | 62 | |
rajathr | 0:716b93ab9a58 | 63 | |
rajathr | 0:716b93ab9a58 | 64 | |
rajathr | 0:716b93ab9a58 | 65 | //FUNCTION GIVEN BY PROFESSOR TO SETUP DMA TO READ VALUES FROM 3 PINS |
rajathr | 0:716b93ab9a58 | 66 | void initDMAForAdc3_3Channels(void) |
rajathr | 0:716b93ab9a58 | 67 | { |
rajathr | 1:c125f4e65df7 | 68 | uint32_t * reg; |
rajathr | 0:716b93ab9a58 | 69 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* Enable the clock */ |
rajathr | 0:716b93ab9a58 | 70 | |
rajathr | 0:716b93ab9a58 | 71 | // Configure Stream 0 to use Channel 2 (ADC3) |
rajathr | 0:716b93ab9a58 | 72 | reg = (uint32_t *)DMA2_S0CR_REGISTER; |
rajathr | 0:716b93ab9a58 | 73 | *reg = DMA_SxCR_CHANNEL_2_SELECT + DMA_SxCR_MSIZE_HALF_WORD + DMA_SxCR_PSIZE_HALF_WORD + DMA_SxCR_MINC_INCREMENT + DMA_SxCR_DIR_PERTOMEM +DMA_SxCR_CIRC_ENABLE; |
rajathr | 0:716b93ab9a58 | 74 | |
rajathr | 0:716b93ab9a58 | 75 | //We will transfer 3 data registers for 3 channels of ADC |
rajathr | 0:716b93ab9a58 | 76 | reg = (uint32_t *)DMA2_S0NDTR_REGISTER; |
rajathr | 0:716b93ab9a58 | 77 | *reg = 3; |
rajathr | 0:716b93ab9a58 | 78 | |
rajathr | 0:716b93ab9a58 | 79 | //We will transfer from the ADC3 Data Register |
rajathr | 0:716b93ab9a58 | 80 | reg = (uint32_t *)DMA2_S0PAR_REGISTER; |
rajathr | 1:c125f4e65df7 | 81 | *reg = ADC_3_DR_REGISTER; //THIS FUNCTION IS DETECTED |
rajathr | 0:716b93ab9a58 | 82 | |
rajathr | 0:716b93ab9a58 | 83 | //We will transfer to the adcDmaDataStorageBuffer we just created |
rajathr | 0:716b93ab9a58 | 84 | reg = (uint32_t *)DMA2_S0M0AR_REGISTER; |
rajathr | 1:c125f4e65df7 | 85 | *reg = (uint32_t)& adcDmaDataStorageBuffer_3_Channel[0]; |
rajathr | 0:716b93ab9a58 | 86 | |
rajathr | 0:716b93ab9a58 | 87 | } |
rajathr | 0:716b93ab9a58 | 88 | |
rajathr | 0:716b93ab9a58 | 89 | |
rajathr | 0:716b93ab9a58 | 90 | void enableDMAForAdc3_3channels (void) |
rajathr | 0:716b93ab9a58 | 91 | { |
rajathr | 0:716b93ab9a58 | 92 | uint32_t * reg; |
rajathr | 0:716b93ab9a58 | 93 | reg = (uint32_t *)DMA2_S0CR_REGISTER; |
rajathr | 0:716b93ab9a58 | 94 | *reg = *reg | DMA_SxCR_STREAM_ENABLE; |
rajathr | 0:716b93ab9a58 | 95 | } |
rajathr | 0:716b93ab9a58 | 96 | |
rajathr | 0:716b93ab9a58 | 97 | void enableDMAForAdc3_1channels (void) |
rajathr | 0:716b93ab9a58 | 98 | { |
rajathr | 0:716b93ab9a58 | 99 | uint32_t * reg; |
rajathr | 0:716b93ab9a58 | 100 | reg = (uint32_t *)DMA2_S0CR_REGISTER; |
rajathr | 0:716b93ab9a58 | 101 | *reg = *reg | DMA_SxCR_STREAM_ENABLE; |
rajathr | 0:716b93ab9a58 | 102 | } |
rajathr | 0:716b93ab9a58 | 103 | |
rajathr | 0:716b93ab9a58 | 104 | |
rajathr | 0:716b93ab9a58 | 105 | |
rajathr | 1:c125f4e65df7 | 106 | uint16_t returnADC3StoredValue3Channel(uint8_t index) |
rajathr | 0:716b93ab9a58 | 107 | { |
rajathr | 1:c125f4e65df7 | 108 | return adcDmaDataStorageBuffer_3_Channel[index]; |
rajathr | 0:716b93ab9a58 | 109 | } |
rajathr | 0:716b93ab9a58 | 110 | |
rajathr | 0:716b93ab9a58 | 111 | |
rajathr | 1:c125f4e65df7 | 112 | uint16_t returnADC3StoredValue1Channel(uint8_t index) |
rajathr | 1:c125f4e65df7 | 113 | { |
rajathr | 1:c125f4e65df7 | 114 | return adcDmaDataStorageBuffer_1_Channel[index]; |
rajathr | 1:c125f4e65df7 | 115 | } |
rajathr | 1:c125f4e65df7 | 116 | |
rajathr | 0:716b93ab9a58 | 117 | |
rajathr | 0:716b93ab9a58 | 118 | |
rajathr | 0:716b93ab9a58 | 119 |