mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-11-03 22:31:04 +00:00 
			
		
		
		
	
		
			
	
	
		
			575 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			575 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/******************************************************************************
							 | 
						||
| 
								 | 
							
								 * The MIT License
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2010 Michael Hope.
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2012 LeafLabs, LLC
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Permission is hereby granted, free of charge, to any person
							 | 
						||
| 
								 | 
							
								 * obtaining a copy of this software and associated documentation
							 | 
						||
| 
								 | 
							
								 * files (the "Software"), to deal in the Software without
							 | 
						||
| 
								 | 
							
								 * restriction, including without limitation the rights to use, copy,
							 | 
						||
| 
								 | 
							
								 * modify, merge, publish, distribute, sublicense, and/or sell copies
							 | 
						||
| 
								 | 
							
								 * of the Software, and to permit persons to whom the Software is
							 | 
						||
| 
								 | 
							
								 * furnished to do so, subject to the following conditions:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * The above copyright notice and this permission notice shall be
							 | 
						||
| 
								 | 
							
								 * included in all copies or substantial portions of the Software.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
							 | 
						||
| 
								 | 
							
								 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
							 | 
						||
| 
								 | 
							
								 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
							 | 
						||
| 
								 | 
							
								 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
							 | 
						||
| 
								 | 
							
								 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
							 | 
						||
| 
								 | 
							
								 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
							 | 
						||
| 
								 | 
							
								 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
							 | 
						||
| 
								 | 
							
								 * SOFTWARE.
							 | 
						||
| 
								 | 
							
								 *****************************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file libmaple/stm32f1/include/series/dma.h
							 | 
						||
| 
								 | 
							
								 * @author Marti Bolivar <mbolivar@leaflabs.com>;
							 | 
						||
| 
								 | 
							
								 *         Original implementation by Michael Hope
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 DMA series header.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * See /notes/dma-stm32f1.txt for more information.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef _LIBMAPLE_STM32F1_DMA_H_
							 | 
						||
| 
								 | 
							
								#define _LIBMAPLE_STM32F1_DMA_H_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C"{
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <libmaple/libmaple_types.h>
							 | 
						||
| 
								 | 
							
								#include <libmaple/dma_common.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Register maps and base pointers
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 DMA register map type.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Note that DMA controller 2 (register map base pointer DMA2_BASE)
							 | 
						||
| 
								 | 
							
								 * only supports channels 1--5.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef struct dma_reg_map {
							 | 
						||
| 
								 | 
							
								    __io uint32 ISR;            /**< Interrupt status register */
							 | 
						||
| 
								 | 
							
								    __io uint32 IFCR;           /**< Interrupt flag clear register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR1;           /**< Channel 1 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR1;         /**< Channel 1 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR1;          /**< Channel 1 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR1;          /**< Channel 1 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED1;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR2;           /**< Channel 2 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR2;         /**< Channel 2 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR2;          /**< Channel 2 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR2;          /**< Channel 2 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED2;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR3;           /**< Channel 3 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR3;         /**< Channel 3 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR3;          /**< Channel 3 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR3;          /**< Channel 3 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED3;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR4;           /**< Channel 4 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR4;         /**< Channel 4 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR4;          /**< Channel 4 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR4;          /**< Channel 4 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED4;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR5;           /**< Channel 5 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR5;         /**< Channel 5 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR5;          /**< Channel 5 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR5;          /**< Channel 5 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED5;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR6;           /**< Channel 6 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR6;         /**< Channel 6 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR6;          /**< Channel 6 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR6;          /**< Channel 6 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED6;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR7;           /**< Channel 7 configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR7;         /**< Channel 7 number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR7;          /**< Channel 7 peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR7;          /**< Channel 7 memory address register */
							 | 
						||
| 
								 | 
							
								    const uint32 RESERVED7;     /**< Reserved. */
							 | 
						||
| 
								 | 
							
								} dma_reg_map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** DMA controller 1 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1_BASE                       ((struct dma_reg_map*)0x40020000)
							 | 
						||
| 
								 | 
							
								/** DMA controller 2 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2_BASE                       ((struct dma_reg_map*)0x40020400)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 DMA channel (i.e. tube) register map type.
							 | 
						||
| 
								 | 
							
								 * Provides access to an individual channel's registers.
							 | 
						||
| 
								 | 
							
								 * @see dma_tube_regs()
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef struct dma_tube_reg_map {
							 | 
						||
| 
								 | 
							
								    __io uint32 CCR;           /**< Channel configuration register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CNDTR;         /**< Channel number of data register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CPAR;          /**< Channel peripheral address register */
							 | 
						||
| 
								 | 
							
								    __io uint32 CMAR;          /**< Channel memory address register */
							 | 
						||
| 
								 | 
							
								} dma_tube_reg_map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 1 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH1_BASE                ((struct dma_tube_reg_map*)0x40020008)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 2 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH2_BASE                ((struct dma_tube_reg_map*)0x4002001C)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 3 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH3_BASE                ((struct dma_tube_reg_map*)0x40020030)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 4 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH4_BASE                ((struct dma_tube_reg_map*)0x40020044)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 5 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH5_BASE                ((struct dma_tube_reg_map*)0x40020058)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 6 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH6_BASE                ((struct dma_tube_reg_map*)0x4002006C)
							 | 
						||
| 
								 | 
							
								/** DMA1 channel 7 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA1CH7_BASE                ((struct dma_tube_reg_map*)0x40020080)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** DMA2 channel 1 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2CH1_BASE                ((struct dma_tube_reg_map*)0x40020408)
							 | 
						||
| 
								 | 
							
								/** DMA2 channel 2 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2CH2_BASE                ((struct dma_tube_reg_map*)0x4002041C)
							 | 
						||
| 
								 | 
							
								/** DMA2 channel 3 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2CH3_BASE                ((struct dma_tube_reg_map*)0x40020430)
							 | 
						||
| 
								 | 
							
								/** DMA2 channel 4 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2CH4_BASE                ((struct dma_tube_reg_map*)0x40020444)
							 | 
						||
| 
								 | 
							
								/** DMA2 channel 5 register map base pointer */
							 | 
						||
| 
								 | 
							
								#define DMA2CH5_BASE                ((struct dma_tube_reg_map*)0x40020458)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Register bit definitions
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Interrupt status register */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF_BIT 3
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF_BIT 2
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF_BIT 1
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF_BIT  0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF (1 << DMA_ISR_TEIF_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF (1 << DMA_ISR_HTIF_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF (1 << DMA_ISR_TCIF_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF  (1 << DMA_ISR_GIF_BIT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF7_BIT               27
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF7_BIT               26
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF7_BIT               25
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF7_BIT                24
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF6_BIT               23
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF6_BIT               22
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF6_BIT               21
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF6_BIT                20
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF5_BIT               19
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF5_BIT               18
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF5_BIT               17
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF5_BIT                16
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF4_BIT               15
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF4_BIT               14
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF4_BIT               13
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF4_BIT                12
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF3_BIT               11
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF3_BIT               10
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF3_BIT               9
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF3_BIT                8
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF2_BIT               7
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF2_BIT               6
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF2_BIT               5
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF2_BIT                4
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF1_BIT               3
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF1_BIT               2
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF1_BIT               1
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF1_BIT                0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF7                   (1U << DMA_ISR_TEIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF7                   (1U << DMA_ISR_HTIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF7                   (1U << DMA_ISR_TCIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF7                    (1U << DMA_ISR_GIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF6                   (1U << DMA_ISR_TEIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF6                   (1U << DMA_ISR_HTIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF6                   (1U << DMA_ISR_TCIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF6                    (1U << DMA_ISR_GIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF5                   (1U << DMA_ISR_TEIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF5                   (1U << DMA_ISR_HTIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF5                   (1U << DMA_ISR_TCIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF5                    (1U << DMA_ISR_GIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF4                   (1U << DMA_ISR_TEIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF4                   (1U << DMA_ISR_HTIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF4                   (1U << DMA_ISR_TCIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF4                    (1U << DMA_ISR_GIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF3                   (1U << DMA_ISR_TEIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF3                   (1U << DMA_ISR_HTIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF3                   (1U << DMA_ISR_TCIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF3                    (1U << DMA_ISR_GIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF2                   (1U << DMA_ISR_TEIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF2                   (1U << DMA_ISR_HTIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF2                   (1U << DMA_ISR_TCIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF2                    (1U << DMA_ISR_GIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TEIF1                   (1U << DMA_ISR_TEIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_HTIF1                   (1U << DMA_ISR_HTIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_TCIF1                   (1U << DMA_ISR_TCIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_ISR_GIF1                    (1U << DMA_ISR_GIF1_BIT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Interrupt flag clear register */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF7_BIT             27
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF7_BIT             26
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF7_BIT             25
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF7_BIT              24
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF6_BIT             23
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF6_BIT             22
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF6_BIT             21
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF6_BIT              20
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF5_BIT             19
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF5_BIT             18
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF5_BIT             17
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF5_BIT              16
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF4_BIT             15
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF4_BIT             14
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF4_BIT             13
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF4_BIT              12
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF3_BIT             11
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF3_BIT             10
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF3_BIT             9
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF3_BIT              8
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF2_BIT             7
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF2_BIT             6
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF2_BIT             5
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF2_BIT              4
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF1_BIT             3
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF1_BIT             2
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF1_BIT             1
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF1_BIT              0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF7                 (1U << DMA_IFCR_CTEIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF7                 (1U << DMA_IFCR_CHTIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF7                 (1U << DMA_IFCR_CTCIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF7                  (1U << DMA_IFCR_CGIF7_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF6                 (1U << DMA_IFCR_CTEIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF6                 (1U << DMA_IFCR_CHTIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF6                 (1U << DMA_IFCR_CTCIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF6                  (1U << DMA_IFCR_CGIF6_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF5                 (1U << DMA_IFCR_CTEIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF5                 (1U << DMA_IFCR_CHTIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF5                 (1U << DMA_IFCR_CTCIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF5                  (1U << DMA_IFCR_CGIF5_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF4                 (1U << DMA_IFCR_CTEIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF4                 (1U << DMA_IFCR_CHTIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF4                 (1U << DMA_IFCR_CTCIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF4                  (1U << DMA_IFCR_CGIF4_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF3                 (1U << DMA_IFCR_CTEIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF3                 (1U << DMA_IFCR_CHTIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF3                 (1U << DMA_IFCR_CTCIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF3                  (1U << DMA_IFCR_CGIF3_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF2                 (1U << DMA_IFCR_CTEIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF2                 (1U << DMA_IFCR_CHTIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF2                 (1U << DMA_IFCR_CTCIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF2                  (1U << DMA_IFCR_CGIF2_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTEIF1                 (1U << DMA_IFCR_CTEIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CHTIF1                 (1U << DMA_IFCR_CHTIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CTCIF1                 (1U << DMA_IFCR_CTCIF1_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_IFCR_CGIF1                  (1U << DMA_IFCR_CGIF1_BIT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Channel configuration register */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MEM2MEM_BIT             14
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MINC_BIT                7
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PINC_BIT                6
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_CIRC_BIT                5
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_DIR_BIT                 4
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_TEIE_BIT                3
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_HTIE_BIT                2
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_TCIE_BIT                1
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_EN_BIT                  0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MEM2MEM                 (1U << DMA_CCR_MEM2MEM_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PL                      (0x3 << 12)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PL_LOW                  (0x0 << 12)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PL_MEDIUM               (0x1 << 12)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PL_HIGH                 (0x2 << 12)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PL_VERY_HIGH            (0x3 << 12)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MSIZE                   (0x3 << 10)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MSIZE_8BITS             (0x0 << 10)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MSIZE_16BITS            (0x1 << 10)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MSIZE_32BITS            (0x2 << 10)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PSIZE                   (0x3 << 8)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PSIZE_8BITS             (0x0 << 8)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PSIZE_16BITS            (0x1 << 8)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PSIZE_32BITS            (0x2 << 8)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_MINC                    (1U << DMA_CCR_MINC_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_PINC                    (1U << DMA_CCR_PINC_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_CIRC                    (1U << DMA_CCR_CIRC_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_DIR                     (1U << DMA_CCR_DIR_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_DIR_FROM_PER            (0U << DMA_CCR_DIR_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_DIR_FROM_MEM            (1U << DMA_CCR_DIR_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_TEIE                    (1U << DMA_CCR_TEIE_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_HTIE                    (1U << DMA_CCR_HTIE_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_TCIE                    (1U << DMA_CCR_TCIE_BIT)
							 | 
						||
| 
								 | 
							
								#define DMA_CCR_EN                      (1U << DMA_CCR_EN_BIT)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Devices
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern dma_dev *DMA1;
							 | 
						||
| 
								 | 
							
								#if defined(STM32_HIGH_DENSITY) || defined(STM32_XL_DENSITY)
							 | 
						||
| 
								 | 
							
								extern dma_dev *DMA2;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Other types needed by, or useful for, <libmaple/dma.h>.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 dma_tube.
							 | 
						||
| 
								 | 
							
								 * On STM32F1, DMA tubes are just channels.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define dma_tube dma_channel
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief On STM32F1, dma_channel_reg_map is an alias for dma_tube_reg_map.
							 | 
						||
| 
								 | 
							
								 * This is for backwards compatibility. */
							 | 
						||
| 
								 | 
							
								#define dma_channel_reg_map dma_tube_reg_map
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 configuration flags for dma_tube_config
							 | 
						||
| 
								 | 
							
								 * @see struct dma_tube_config
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef enum dma_cfg_flags {
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Source address increment mode
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * If this flag is set, the source address is incremented (by the
							 | 
						||
| 
								 | 
							
								     * source size) after each DMA transfer.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_SRC_INC = 1U << 31,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Destination address increment mode
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * If this flag is set, the destination address is incremented (by
							 | 
						||
| 
								 | 
							
								     * the destination size) after each DMA transfer.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_DST_INC = 1U << 30,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Circular mode
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * This mode is not available for memory-to-memory transfers.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_CIRC = DMA_CCR_CIRC,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /** Transfer complete interrupt enable */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_CMPLT_IE      = DMA_CCR_TCIE,
							 | 
						||
| 
								 | 
							
								    /** Transfer half-complete interrupt enable  */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_HALF_CMPLT_IE = DMA_CCR_HTIE,
							 | 
						||
| 
								 | 
							
								    /** Transfer error interrupt enable */
							 | 
						||
| 
								 | 
							
								    DMA_CFG_ERR_IE        = DMA_CCR_TEIE,
							 | 
						||
| 
								 | 
							
								} dma_cfg_flags;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief STM32F1 DMA request sources.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * IMPORTANT:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 1. On STM32F1, each dma_request_src can only be used by a
							 | 
						||
| 
								 | 
							
								 * particular tube on a particular DMA controller. For example,
							 | 
						||
| 
								 | 
							
								 * DMA_REQ_SRC_ADC1 belongs to DMA1, tube 1. DMA2 cannot serve
							 | 
						||
| 
								 | 
							
								 * requests from ADC1, nor can DMA1 tube 2, etc. If you try to use a
							 | 
						||
| 
								 | 
							
								 * request source with the wrong DMA controller or tube on STM32F1,
							 | 
						||
| 
								 | 
							
								 * dma_tube_cfg() will fail.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 2. In general, a DMA tube can only serve a single request source at
							 | 
						||
| 
								 | 
							
								 * a time, and on STM32F1, Terrible Super-Bad Things will happen if
							 | 
						||
| 
								 | 
							
								 * two request sources are active for a single tube.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * To make all this easier to sort out, these dma_request_src
							 | 
						||
| 
								 | 
							
								 * enumerators are grouped by DMA controller and tube.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @see struct dma_tube_config
							 | 
						||
| 
								 | 
							
								 * @see dma_tube_cfg()
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef enum dma_request_src {
							 | 
						||
| 
								 | 
							
								    /* Each request source encodes the DMA controller and channel it
							 | 
						||
| 
								 | 
							
								     * belongs to, for error checking in dma_tube_cfg(). */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* DMA1 request sources */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 1) */
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_ADC1      = (RCC_DMA1 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM2_CH3  = (RCC_DMA1 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM4_CH1  = (RCC_DMA1 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 2)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI1_RX   = (RCC_DMA1 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART3_TX = (RCC_DMA1 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_CH1  = (RCC_DMA1 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM2_UP   = (RCC_DMA1 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM3_CH3  = (RCC_DMA1 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 3)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI1_TX   = (RCC_DMA1 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART3_RX = (RCC_DMA1 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_CH2  = (RCC_DMA1 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM3_CH4  = (RCC_DMA1 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM3_UP   = (RCC_DMA1 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 4)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI2_RX   = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2S2_RX   = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART1_TX = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2C2_TX   = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_CH4  = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_TRIG = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_COM  = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM4_CH2  = (RCC_DMA1 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 5)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI2_TX   = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2S2_TX   = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART1_RX = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2C2_RX   = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_UP   = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM2_CH1  = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM4_CH3  = (RCC_DMA1 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA1, tube 6)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART2_RX = (RCC_DMA1 << 3) | 6,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2C1_TX   = (RCC_DMA1 << 3) | 6,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM1_CH3  = (RCC_DMA1 << 3) | 6,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM3_CH1  = (RCC_DMA1 << 3) | 6,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM3_TRIG = (RCC_DMA1 << 3) | 6,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /* Tube 7 */
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_USART2_TX = (RCC_DMA1 << 3) | 7,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2C1_RX   = (RCC_DMA1 << 3) | 7,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM2_CH2  = (RCC_DMA1 << 3) | 7,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM2_CH4  = (RCC_DMA1 << 3) | 7,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM4_UP   = (RCC_DMA1 << 3) | 7,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* DMA2 request sources */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA2, tube 1)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI3_RX   = (RCC_DMA2 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2S3_RX   = (RCC_DMA2 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_CH4  = (RCC_DMA2 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_TRIG = (RCC_DMA2 << 3) | 1,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA2, tube 2)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SPI3_TX   = (RCC_DMA2 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_I2S3_TX   = (RCC_DMA2 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_CH3  = (RCC_DMA2 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_UP   = (RCC_DMA2 << 3) | 2,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA2, tube 3)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_UART4_RX  = (RCC_DMA2 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM6_UP   = (RCC_DMA2 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_DAC_CH1   = (RCC_DMA2 << 3) | 3,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA2, tube 4)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_SDIO      = (RCC_DMA2 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_CH2  = (RCC_DMA2 << 3) | 4,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**@{*/
							 | 
						||
| 
								 | 
							
								    /** (DMA2, tube 5)*/
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_ADC3      = (RCC_DMA2 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_UART4_TX  = (RCC_DMA2 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    DMA_REQ_SRC_TIM5_CH1  = (RCC_DMA2 << 3) | 5,
							 | 
						||
| 
								 | 
							
								    /**@}*/
							 | 
						||
| 
								 | 
							
								} dma_request_src;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Convenience routines.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief On STM32F1, dma_is_channel_enabled() is an alias for
							 | 
						||
| 
								 | 
							
								 *        dma_is_enabled().
							 | 
						||
| 
								 | 
							
								 * This is for backwards compatibility.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define dma_is_channel_enabled dma_is_enabled
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define DMA_CHANNEL_NREGS 5     /* accounts for reserved word */
							 | 
						||
| 
								 | 
							
								static inline dma_tube_reg_map* dma_tube_regs(dma_dev *dev, dma_tube tube) {
							 | 
						||
| 
								 | 
							
								    __io uint32 *ccr1 = &dev->regs->CCR1;
							 | 
						||
| 
								 | 
							
								    return (dma_channel_reg_map*)(ccr1 + DMA_CHANNEL_NREGS * (tube - 1));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief On STM32F1, dma_channel_regs() is an alias for dma_tube_regs().
							 | 
						||
| 
								 | 
							
								 * This is for backwards compatibility. */
							 | 
						||
| 
								 | 
							
								#define dma_channel_regs(dev, ch) dma_tube_regs(dev, ch)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static inline uint8 dma_is_enabled(dma_dev *dev, dma_tube tube) {
							 | 
						||
| 
								 | 
							
								    return (uint8)(dma_tube_regs(dev, tube)->CCR & DMA_CCR_EN);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static inline uint8 dma_get_isr_bits(dma_dev *dev, dma_tube tube) {
							 | 
						||
| 
								 | 
							
								    uint8 shift = (tube - 1) * 4;
							 | 
						||
| 
								 | 
							
								    return (dev->regs->ISR >> shift) & 0xF;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static inline void dma_clear_isr_bits(dma_dev *dev, dma_tube tube) {
							 | 
						||
| 
								 | 
							
								    dev->regs->IFCR = (1U << (4 * (tube - 1)));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Deprecated
							 | 
						||
| 
								 | 
							
								 * STM32F1 mode flags for dma_setup_xfer(). Use dma_tube_cfg() instead.
							 | 
						||
| 
								 | 
							
								 * @see dma_tube_cfg()
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef enum dma_mode_flags {
							 | 
						||
| 
								 | 
							
								    DMA_MEM_2_MEM  = 1 << 14, /**< Memory to memory mode */
							 | 
						||
| 
								 | 
							
								    DMA_MINC_MODE  = 1 << 7,  /**< Auto-increment memory address */
							 | 
						||
| 
								 | 
							
								    DMA_PINC_MODE  = 1 << 6,  /**< Auto-increment peripheral address */
							 | 
						||
| 
								 | 
							
								    DMA_CIRC_MODE  = 1 << 5,  /**< Circular mode */
							 | 
						||
| 
								 | 
							
								    DMA_FROM_MEM   = 1 << 4,  /**< Read from memory to peripheral */
							 | 
						||
| 
								 | 
							
								    DMA_TRNS_ERR   = 1 << 3,  /**< Interrupt on transfer error */
							 | 
						||
| 
								 | 
							
								    DMA_HALF_TRNS  = 1 << 2,  /**< Interrupt on half-transfer */
							 | 
						||
| 
								 | 
							
								    DMA_TRNS_CMPLT = 1 << 1   /**< Interrupt on transfer completion */
							 | 
						||
| 
								 | 
							
								} dma_mode_flags;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Keep this around for backwards compatibility, but it's deprecated.
							 | 
						||
| 
								 | 
							
								 * New code should use dma_tube_cfg() instead.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * (It's not possible to fully configure a DMA stream on F2 with just
							 | 
						||
| 
								 | 
							
								 * this information, so this interface is too tied to the F1.) */
							 | 
						||
| 
								 | 
							
								void dma_setup_transfer(dma_dev       *dev,
							 | 
						||
| 
								 | 
							
								                        dma_channel    channel,
							 | 
						||
| 
								 | 
							
								                        __io void     *peripheral_address,
							 | 
						||
| 
								 | 
							
								                        dma_xfer_size  peripheral_size,
							 | 
						||
| 
								 | 
							
								                        __io void     *memory_address,
							 | 
						||
| 
								 | 
							
								                        dma_xfer_size  memory_size,
							 | 
						||
| 
								 | 
							
								                        uint32         mode);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								} // extern "C"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |