Files
CHJ/library/inc/lh32m0g3x_dma.h

207 lines
9.2 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
/******************************************************************************
*
* Copyright (c) 2020-2025 Suzhou Legendsemi Technology Co., Ltd.
******************************************************************************
* All rights reserved. Distributed under MIT license.
* The file is encoded in UTF-8 without signature.
* @file lh32m0g30x_dac.h
* @version 2025-09-22
******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __LH32M0G3x_DMA_H
#define __LH32M0G3x_DMA_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "lh32m0xx_lhl.h"
/* Defines -------------------------------------------------------------------*/
/**
* @brief DMA传输模式
* @note EMLM默认始终开启
*/
typedef enum {
DMA_MEMORY_TO_MEMORY = 0u, /*!< 源地址和目的地址主循环内自动递增,结束后自动恢复起始地址 */
DMA_PERIPH_TO_MEMORY, /*!< 源地址次循环内递增,次/主循环结束后自动恢复起始地址;
* */
DMA_MEMORY_TO_PERIPH, /*!< 源地址主循环内递增,主循环结束后自动恢复起始地址;
* / */
DMA_PERIPH_TO_PERIPH, /*!< 源地址和目的地址次循环内递增,次/主循环结束后自动恢复起始地址 */
DMA_FIFO_TO_MEMORY, /*!< 源地址始终固定不变;目的地址主循环内自动递增,结束后自动恢复起始地址 */
DMA_MEMROY_TO_FIFO, /*!< 源地址主循环内自动递增,结束后自动恢复起始地址;目的地址始终固定不变 */
} DMA_TRANS_TYPE_t;
/**
* @brief DMA_Memory_data_size DMA Memory data size
* @note 1使
*/
typedef enum {
DMA_DATA_WIDTH_1B = 0, /*!< Memory data alignment : Byte, 8-bit */
DMA_DATA_WIDTH_2B = 1, /*!< Memory data alignment : HalfWord, 16-bit */
DMA_DATA_WIDTH_4B = 2, /*!< Memory data alignment : Word, 32-bit */
DMA_DATA_WIDTH_16B = 4, /*!< Memory data alignment : 16-byte */
DMA_DATA_WIDTH_32B = 5, /*!< Memory data alignment : 32-byte */
// DMA_DATA_WIDTH_N1B = -1, /*!< Memory data alignment : Negtive Byte, 8-bit */
// DMA_DATA_WIDTH_N2B = -2, /*!< Memory data alignment : Negtive HalfWord, 16-bit */
// DMA_DATA_WIDTH_N4B = -3, /*!< Memory data alignment : Negtive Word, 32-bit */
// DMA_DATA_WIDTH_N16B = -5, /*!< Memory data alignment : Negtive 16-byte */
// DMA_DATA_WIDTH_N32B = -6, /*!< Memory data alignment : Negtive 32-byte */
} DMA_DATA_WIDTH_t;
typedef enum {
DMA_HARDWARE_REQUEST = 0x0u,
DMA_SOFTWARE_REQUEST = 0x1u,
} DMA_REQ_t;
typedef enum {
DMA_CHANNEL_0 = 0x0u,
DMA_CHANNEL_1 = 0x1u,
DMA_CHANNEL_2 = 0x2u,
DMA_CHANNEL_3 = 0x3u,
} DMA_CHANNEL_t;
typedef enum {
TO_DMA_CHANNEL_0 = 0x0u,
TO_DMA_CHANNEL_1 = 0x1u,
TO_DMA_CHANNEL_2 = 0x2u,
TO_DMA_CHANNEL_3 = 0x3u,
TO_DMA_CHANNEL_NONE = 0x10u, /* 参数NONE仅供Chaining_Channel调用 */
} DMA_CHAINING_t;
typedef enum {
DMA_BANDWIDTH_FULL = 0x0u,
DMA_BANDWIDTH_MEDIUM = 0x2u,
DMA_BANDWIDTH_LOW = 0x3u,
} DMA_BANDWIDTH_LIMIT_t;
typedef enum {
DMA_IT_MAJOR = 0x2u,
DMA_IT_HALF = 0x4u,
} DMA_IT_t;
typedef enum {
DMA_DIRECT_MODE = 0x1u, /*!< 直接模式 */
DMA_CHAINING_MODE = 0x2u, /*!< 链式模式 */
DMA_SCATTER_GATHER_MODE = 0x4u, /*!< 分散聚合模式 */
} DMA_MODE_t;
typedef enum {
DMA_CYCLIC_TRANSMISSION = 0x0u, /*!< 循环模式传输Repetition次数后重新开始
* */
DMA_SINGLE_TRANSMISSION = 0x1u, /*!< 单次模式传输Repetition次数后自动停止
* */
DMA_INTERVAL_TRANSMISSION = 0x10u, /*!< 间隔模式传输Repetition次数后重新开始
* Interval决定 */
} DMA_TRANS_MODE_t;
/**
* @brief DMA
*/
typedef struct {
uint32_t Src_Address; /*!< 源地址 */
uint32_t Dest_Address; /*!< 目标地址 */
uint16_t Data_Size; /*!< 以源数据宽度为单位的DMA传输数据量 Max=256Word/1024Byte */
uint16_t Repetition; /*!< 当DMA为重复模式下的循环次数Min=1Max=2^9ELINK=1/2^15ELINK=0*/
int32_t TCD_Address; /*!< DMA_SCATTER_GATHER_MODE下向下一个加载的TCD链表 */
FunctionalState INT_Major; /*!< DMA_SCATTER_GATHER_MODE下使能或禁用主中断 */
FunctionalState INT_Half; /*!< DMA_SCATTER_GATHER_MODE下使能或禁用半中断 */
FunctionalState Auto_Start; /*!< DMA_SCATTER_GATHER_MODE下使能或禁用通道自启动功能*/
DMA_BANDWIDTH_LIMIT_t Bandwidth; /*!< DMA_SCATTER_GATHER_MODE下带宽控制位 */
DMA_CHAINING_t Chaining; /*!< DMA_CHAINING_MODE下指向下一个链式启动的通道 */
DMA_TRANS_MODE_t Trans_Mode; /*!< DMA传输模式单次重复间隔 */
DMA_DATA_WIDTH_t Data_Width; /*!< 数据宽度 */
DMA_TRANS_TYPE_t Direction; /*!< 传输方式:外设<->内存等六种方式地址偏移由Direction和DataWidth共同决定 */
int16_t Src_Interval_Factor; /*!< 在间隔模式下单次DMA操作后源地址偏移量的系数 */
int16_t Dest_Interval_Factor; /*!< 在间隔模式下单次DMA操作后目的地址偏移量的系数 */
} DMA_InitTypeDef;
/**
* @brief DMA Handle
*/
typedef struct {
DMA_CHANNEL_t Channel; /*!< DMA Channel Instance */
DMA_MODE_t Mode; /*!< DMA模式选择 */
DMA_REQ_t Request; /*!< DMA请求源 */
uint8_t TCD_Count; /*!< DMA_SCATTER_GATHER_MODE下TCD描述符数量 */
DMA_DES_N_TypeDef* TCD_List; /*!< DMA_SCATTER_GATHER_MODE下TCD描述符指针 */
DMA_InitTypeDef* TCD_Init; /*!< DMA_SCATTER_GATHER_MODE下DMA初始化参数结构体指针 */
DMA_InitTypeDef Init; /*!< DMA初始化参数结构体 */
} DMA_HandleTypeDef;
/* Declaration ---------------------------------------------------------------*/
LHL_StatusTypeDef LHL_DMA_Init(DMA_HandleTypeDef* handle);
void LHL_DMA_Start(DMA_HandleTypeDef* handle);
void LHL_DMA_Stop(DMA_HandleTypeDef* handle);
void LHL_DMA_SetChainingChannel(DMA_HandleTypeDef* handle, DMA_CHANNEL_t ChainingChannel, FunctionalState NewState);
void LHL_DMA_SetELink(DMA_HandleTypeDef* handle, DMA_CHANNEL_t LinkedChannel, FunctionalState NewState);
void LHL_DMA_SetMLink(DMA_HandleTypeDef* handle, DMA_CHANNEL_t LinkedChannel, FunctionalState NewState);
void LHL_DMA_ITConfig(DMA_HandleTypeDef* handle, uint32_t DMA_IT, FunctionalState NewState);
DMA_IT_t LHL_DMA_GetPending(DMA_CHANNEL_t channel);
void LHL_DMA_ClearPending(DMA_CHANNEL_t channel);
LHL_StatusTypeDef LHL_DMA_GenerateTCD(DMA_HandleTypeDef* handle, DMA_InitTypeDef* DMA_Init, DMA_DES_N_TypeDef* tcd);
LHL_StatusTypeDef LHL_DMA_CopyTCD(DMA_HandleTypeDef* handle, DMA_DES_N_TypeDef* tcd);
LHL_StatusTypeDef LHL_DMA_SGAInit(DMA_HandleTypeDef* handle, DMA_DES_N_TypeDef* tcd);
uint32_t LHL_DMA_GetDestAddress(DMA_CHANNEL_t channel);
uint16_t LHL_DMA_GetCiter(DMA_CHANNEL_t channel);
uint16_t LHL_DMA_GetBiter(DMA_CHANNEL_t channel);
#ifdef __cplusplus
}
#endif
#endif
/*********************************End of File**********************************/