HC32L17x的LL驱动库之dma
#include "hc32l1xx_ll_dma.h"///
//函 数:
//功 能:
//输入参数:
//输出参数:
//说 明:
//
uint8_t LL_DMA_DeInit(DMA_TypeDef* DMAx, uint32_t Channel)
{__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);Channel <<= 4;dmac += Channel;WRITE_REG((*dmac), 0);dmac = &(DMAx->CONFB0);dmac += Channel;WRITE_REG((*dmac), 0);return 0;
}///
//函 数:
//功 能:
//输入参数:
//输出参数:
//说 明:
//
uint8_t LL_DMA_Init(DMA_TypeDef* DMAx, uint32_t Channel, LL_DMA_InitTypeDef* DMA_InitStruct)
{//---设置优先级LL_DMA_SetPrority(DMAx, DMA_InitStruct->Prority);//---配置触发请求LL_DMA_SetTrigSource(DMAx, Channel, DMA_InitStruct->PeriphRequest);//---设置数据块大小LL_DMA_SetDataBlockSize(DMAx, Channel, DMA_InitStruct->DataSize);//---计算数块个数DMA_InitStruct->PeriphRequest = DMA_InitStruct->NbData / DMA_InitStruct->DataSize;DMA_InitStruct->NbData = DMA_InitStruct->PeriphRequest;//---判断是否有数据if ((DMA_InitStruct->NbData % DMA_InitStruct->DataSize)!=0){DMA_InitStruct->NbData +=1;}LL_DMA_SetDataBlockNum(DMAx, Channel, DMA_InitStruct->NbData);//---设置传输模式LL_DMA_SetTransferMode(DMAx, Channel, DMA_InitStruct->Mode);//---设置数据位宽LL_DMA_SetDataWidth(DMAx, Channel, DMA_InitStruct->DataWidth);//---设置DMA源地址自增模式LL_DMA_SetSourceAddrIncreaseMode(DMAx, Channel, DMA_InitStruct->PeriphOrM2MSrcIncMode);//---设置DMA目的地址自增模式LL_DMA_SetDestinateAddrIncreaseMode(DMAx, Channel, DMA_InitStruct->MemoryOrM2MDstIncMode);//---设置DMA源地址自动重载LL_DMA_EnableSourceAddrReload(DMAx, Channel);//---设置DMA目的地址自动重载LL_DMA_EnableDestinateAddrReload(DMAx, Channel);//---禁用DMA传输完成配置LL_DMA_SetChannelMode(DMAx, Channel,LL_DMA_CHANNEL_SINGLE);//---设置源地址LL_DMA_SetSourceAddr(DMAx, Channel, DMA_InitStruct->PeriphOrM2MSrcAddress);//---设置目的地址LL_DMA_SetDestinateAddr(DMAx, Channel, DMA_InitStruct->MemoryOrM2MDstAddress);return 0;
}
#ifndef HC32L1XX_LL_DMA_H_
#define HC32L1XX_LL_DMA_H_#ifdef __cplusplus
extern "C" {
#endif #include "hc32l1xx.h"///#define LL_DMA_CHANNEL_0 0#define LL_DMA_CHANNEL_1 1#define LL_DMA_PRIO_FIXED DMA_CONF_PRIO_FIXED #define LL_DMA_PRIO_CIRCLE DMA_CONF_PRIO_CIRCLE#define LL_DMA_HALT_ALL DMA_CONF_HALT_ALL#define LL_DMA_HALT_CH0S DMA_CONF_HALT_CH0S#define LL_DMA_HALT_CH0D DMA_CONF_HALT_CH0D#define LL_DMA_HALT_CH1S DMA_CONF_HALT_CH1S#define LL_DMA_HALT_CH1D DMA_CONF_HALT_CH1D#define LL_DMA_HALT_NULL DMA_CONF_HALT_NULL#define LL_DMA_TRIGS_SOFTWARE DMA_CONFA_TRIGS_SOFTWARE #define LL_DMA_TRIGS_RX_SPI0 DMA_CONFA_TRIGS_RX_SPI0 #define LL_DMA_TRIGS_TX_SPI0 DMA_CONFA_TRIGS_TX_SPI0 #define LL_DMA_TRIGS_RX_SPI1 DMA_CONFA_TRIGS_RX_SPI1 #define LL_DMA_TRIGS_TX_SPI1 DMA_CONFA_TRIGS_TX_SPI1 #define LL_DMA_TRIGS_SQR_ADC DMA_CONFA_TRIGS_SQR_ADC #define LL_DMA_TRIGS_JQR_ADC DMA_CONFA_TRIGS_JQR_ADC #define LL_DMA_TRIGS_LCD DMA_CONFA_TRIGS_LCD #define LL_DMA_TRIGS_RX_UART0 DMA_CONFA_TRIGS_RX_UART0 #define LL_DMA_TRIGS_TX_UART0 DMA_CONFA_TRIGS_TX_UART0 #define LL_DMA_TRIGS_RX_UART1 DMA_CONFA_TRIGS_RX_UART1 #define LL_DMA_TRIGS_TX_UART1 DMA_CONFA_TRIGS_TX_UART1 #define LL_DMA_TRIGS_RX_LPUART0 DMA_CONFA_TRIGS_RX_LPUART0 #define LL_DMA_TRIGS_TX_LPUART0 DMA_CONFA_TRIGS_TX_LPUART0 #define LL_DMA_TRIGS_RX_LPUART1 DMA_CONFA_TRIGS_RX_LPUART1 #define LL_DMA_TRIGS_TX_LPUART1 DMA_CONFA_TRIGS_TX_LPUART1 #define LL_DMA_TRIGS_DAC DMA_CONFA_TRIGS_DAC #define LL_DMA_TRIGS_CAPTURE_CHA_TIM0 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM0#define LL_DMA_TRIGS_CAPTURE_CHB_TIM0 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM0 #define LL_DMA_TRIGS_CAPTURE_CHA_TIM1 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM1#define LL_DMA_TRIGS_CAPTURE_CHB_TIM1 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM1#define LL_DMA_TRIGS_CAPTURE_CHA_TIM2 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM2#define LL_DMA_TRIGS_CAPTURE_CHB_TIM2 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM2#define LL_DMA_TRIGS_CAPTURE_CHA_TIM3 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM3#define LL_DMA_TRIGS_CAPTURE_CHB_TIM3 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM3#define LL_DMA_TRIGS_CAPTURE_CHA_TIM4 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM4#define LL_DMA_TRIGS_CAPTURE_CHB_TIM4 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM4#define LL_DMA_TRIGS_CAPTURE_CHA_TIM5 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM5#define LL_DMA_TRIGS_CAPTURE_CHB_TIM5 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM5#define LL_DMA_TRIGS_CAPTURE_CHA_TIM6 DMA_CONFA_TRIGS_CAPTURE_CHA_TIM6#define LL_DMA_TRIGS_CAPTURE_CHB_TIM6 DMA_CONFA_TRIGS_CAPTURE_CHB_TIM6#define LL_DMA_TRIGS_RX_UART2 DMA_CONFA_TRIGS_RX_UART2 #define LL_DMA_TRIGS_TX_UART2 DMA_CONFA_TRIGS_TX_UART2 #define LL_DMA_TRIGS_RX_UART3 DMA_CONFA_TRIGS_RX_UART3 #define LL_DMA_TRIGS_TX_UART3 DMA_CONFA_TRIGS_TX_UART3 #define LL_DMA_DATA_BLOCK_SIZE_1 1#define LL_DMA_DATA_BLOCK_SIZE_2 2#define LL_DMA_DATA_BLOCK_SIZE_3 3#define LL_DMA_DATA_BLOCK_SIZE_4 4#define LL_DMA_DATA_BLOCK_SIZE_5 5#define LL_DMA_DATA_BLOCK_SIZE_6 6#define LL_DMA_DATA_BLOCK_SIZE_7 7#define LL_DMA_DATA_BLOCK_SIZE_8 8#define LL_DMA_DATA_BLOCK_SIZE_9 9#define LL_DMA_DATA_BLOCK_SIZE_10 10#define LL_DMA_DATA_BLOCK_SIZE_11 11#define LL_DMA_DATA_BLOCK_SIZE_12 12#define LL_DMA_DATA_BLOCK_SIZE_13 13#define LL_DMA_DATA_BLOCK_SIZE_14 14#define LL_DMA_DATA_BLOCK_SIZE_15 15#define LL_DMA_DATA_BLOCK_SIZE_16 16#define LL_DMA_MODE_BLOCK DMA_CONFB_MODE_BLOCK#define LL_DMA_MODE_BURST DMA_CONFB_MODE_BURST#define LL_DMA_DATA_WIDTH_8BITS DMA_CONFB_WIDTH_8BITS#define LL_DMA_DATA_WIDTH_16BITS DMA_CONFB_WIDTH_16BITS#define LL_DMA_DATA_WIDTH_32BITS DMA_CONFB_WIDTH_32BITS#define LL_DMA_DATA_ADDR_INCREASE 0#define LL_DMA_DATA_ADDR_FIXED 1#define LL_DMA_CHANNEL_SINGLE DMA_CONFB_MSK_SINGLE #define LL_DMA_CHANNEL_CONTINUOUS DMA_CONFB_MSK_CONTINUOUS#define LL_DMA_STATE_INIT DMA_CONFB_STATE_INIT#define LL_DMA_STATE_ADDR DMA_CONFB_STATE_ADDR#define LL_DMA_STATE_DMA DMA_CONFB_STATE_DMA#define LL_DMA_STATE_SRC DMA_CONFB_STATE_SRC#define LL_DMA_STATE_DST DMA_CONFB_STATE_DST#define LL_DMA_STATE_FIS DMA_CONFB_STATE_FIS#define LL_DMA_STATE_SUSPEND DMA_CONFB_STATE_SUSPEND/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_Enable(DMA_TypeDef* DMAx){SET_BIT(DMAx->CONF, DMA_CONF_EN);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_Disable(DMA_TypeDef* DMAx){CLEAR_BIT(DMAx->CONF, DMA_CONF_EN);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_IsEnabled(DMA_TypeDef* DMAx){return (uint32_t)(READ_BIT(DMAx->CONF, DMA_CONF_EN) == DMA_CONF_EN);}/////函 数: //功 能: 设置优先级//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetPrority(DMA_TypeDef* DMAx,uint32_t priority){MODIFY_REG(DMAx->CONF, DMA_CONF_PRIO, priority);}/////函 数: //功 能: 获取优先级//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetPrority(DMA_TypeDef* DMAx){return (uint32_t)(READ_BIT(DMAx->CONF, DMA_CONF_EN)& DMA_CONF_PRIO);}/////函 数: //功 能: 暂停//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_Suspend(DMA_TypeDef* DMAx, uint32_t halt){MODIFY_REG(DMAx->CONF, DMA_CONF_HALT, halt);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_Resume(DMA_TypeDef* DMAx, uint32_t halt){MODIFY_REG(DMAx->CONF, DMA_CONF_HALT, ~halt);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnableChannel(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFA_ENS);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableChannel(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);CLEAR_BIT(DMAx->CONF, DMA_CONFA_ENS);}/////函 数: //功 能: //输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_IsEnabled_Channel(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);return (uint32_t)(READ_BIT(DMAx->CONF, DMA_CONFA_ENS) == DMA_CONFA_ENS);}/////函 数: //功 能: 暂停//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SuspendChannel(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch<<4);SET_BIT((*dmac), DMA_CONFA_PAS);}/////函 数: //功 能: 恢复//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_ResumeChannel(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFA_PAS);}/////函 数: //功 能: 软件触发启动//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SoftwareStart(DMA_TypeDef* DMAx,uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFA_STS);}/////函 数: //功 能: 软件触发停止//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SoftwareStop(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFA_STS);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetTrigSource(DMA_TypeDef* DMAx, uint32_t ch, uint32_t trig){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFA_TRIGS, trig);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetTrigSource(DMA_TypeDef* DMAx,uint32_t ch, uint32_t trig){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFA_TRIGS) & trig);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDataBlockSize(DMA_TypeDef* DMAx, uint32_t ch, uint32_t size){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);size -= 1;if (size>15){size = 0;}size <<= DMA_CONFA_BCS_POS;MODIFY_REG((*dmac), DMA_CONFA_BCS, size);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetDataBlockSize(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFA_BCS)>> DMA_CONFA_BCS_POS);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDataBlockNum(DMA_TypeDef* DMAx, uint32_t ch, uint32_t num){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);num -= 1;dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFA_TCS, num);}/////函 数: //功 能: 设置触发源//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetDataBlockNum(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFA0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFA_TCS)>> DMA_CONFA_TCS_POS);}/////函 数: //功 能: 设置数据长度//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t ch, uint32_t length){__IO uint32_t* dmac = NULL;uint32_t datablocksize = 0; dmac = &(DMAx->CONFA0);dmac += (ch << 4);//---计算数据块的大小datablocksize= LL_DMA_GetDataBlockSize(DMAx,ch)+1;//---计算数据块ch = length / datablocksize;if ((length % datablocksize)!=0){ch += 1;}ch -= 1;//---将数据写入MODIFY_REG((*dmac), DMA_CONFA_TCS, ch);}/////函 数: //功 能: 设置DMA工作模式//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetTransferMode(DMA_TypeDef* DMAx, uint32_t ch, uint32_t mode){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFB_MODE, mode);}/////函 数: //功 能: 获取DMA工作模式//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetTransferMode(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_MODE)& DMA_CONFB_MODE);}/////函 数: //功 能: 设置数据宽度//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDataWidth(DMA_TypeDef* DMAx, uint32_t ch, uint32_t width){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFB_WIDTH, width);}/////函 数: //功 能: 获取数据宽度//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetDataWidth(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_WIDTH) >> DMA_CONFB_WIDTH_POS);}/////函 数: //功 能: 设置源地址自增模式//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetSourceAddrIncreaseMode(DMA_TypeDef* DMAx, uint32_t ch, uint32_t mode){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);mode <<= DMA_CONFB_FS_POS;MODIFY_REG((*dmac), DMA_CONFB_FS, mode);}/////函 数: //功 能: 获取源地址自增模式//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetSourceAddrIncreaseMode(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_FS) >> DMA_CONFB_FS_POS);}/////函 数: //功 能: 设置目的地址自增模式//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDestinateAddrIncreaseMode(DMA_TypeDef* DMAx, uint32_t ch, uint32_t mode){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);mode <<= DMA_CONFB_FD_POS;MODIFY_REG((*dmac), DMA_CONFB_FD, mode);}/////函 数: //功 能: 获取目的地址自增模式//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetDestinateAddrIncreaseMode(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_FD) >> DMA_CONFB_FD_POS);}/////函 数: //功 能: 使能数据块和数据块数量自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnableDataBlockReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFB_RC);}/////函 数: //功 能: 使能数据块和数据块数量自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableDataBlockReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFB_RC);}/////函 数: //功 能: 使能源地址自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnableSourceAddrReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFB_RS);}/////函 数: //功 能: 不使能源地址自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableSourceAddrReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFB_RS);}/////函 数: //功 能: 使能目的地址自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnableDestinateAddrReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFB_RD);}/////函 数: //功 能: 不使能目的地址自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableDestinateAddrReload(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFB_RD);}/////函 数: //功 能: 使能错误中断//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnabledIT_Error(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFB_ERR_IE);}/////函 数: //功 能: 不使能错误中断//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableIT_Error(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFB_ERR_IE);}/////函 数: //功 能: 是否使能传输完成中断//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_IsEnabled_IT_Error(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_ERR_IE));}/////函 数: //功 能: 使能传输完成中断//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_EnabledIT_Complete(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);SET_BIT((*dmac), DMA_CONFB_FIS_IE);}/////函 数: //功 能: 不使能传输完成中断//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_DisableIT_Complete(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);CLEAR_BIT((*dmac), DMA_CONFB_FIS_IE);}/////函 数: //功 能: 是否使能传输完成中断//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_IsEnabled_IT_Complete(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_FIS_IE));}/////函 数: //功 能: 获取传输状态//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_TransferState(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_STATE));}/////函 数://功 能:中断标志//输入参 数://输出参 数://说 明://static inline uint32_t LL_DMA_IsActiveFlag(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_STATE));}/////函 数://功 能:中断标志//输入参 数://输出参 数://说 明://static inline uint32_t LL_DMA_IsActiveFlag_Complete(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_STATE)&LL_DMA_STATE_FIS);}/////函 数://功 能:清除中断标志//输入参 数://输出参 数://说 明://static inline void LL_DMA_ClearFlag(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFB_STATE, 0);}/////函 数: //功 能: 设置DMA通道模式//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetChannelMode(DMA_TypeDef* DMAx, uint32_t ch, uint32_t mode){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);MODIFY_REG((*dmac), DMA_CONFB_MSK, mode);}/////函 数: //功 能: 获取DMA通道模式//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetChannelMode(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->CONFB0);dmac += (ch << 4);return (uint32_t)(READ_BIT((*dmac), DMA_CONFB_MSK) & DMA_CONFB_MSK);}/////函 数: //功 能: 设置源地址//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetSourceAddr(DMA_TypeDef* DMAx, uint32_t ch,uint32_t addr){__IO uint32_t* dmac = NULL;dmac = &(DMAx->SRCADR0);dmac += (ch << 4);WRITE_REG((*dmac), addr);}/////函 数: //功 能: 获取源地址//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetSourceAddr(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->SRCADR0);dmac += (ch << 4);return READ_REG((*dmac))& DMA_SRC_ADDR;}/////函 数: //功 能: 使能目的地址自动重载//输入参 数: //输出参 数: //说 明: //static inline void LL_DMA_SetDestinateAddr(DMA_TypeDef* DMAx, uint32_t ch, uint32_t addr){__IO uint32_t* dmac = NULL;dmac = &(DMAx->DSTADR0);dmac += (ch << 4);WRITE_REG((*dmac),addr);}/////函 数: //功 能: 不使能目的地址自动重载//输入参 数: //输出参 数: //说 明: //static inline uint32_t LL_DMA_GetDestinateAddr(DMA_TypeDef* DMAx, uint32_t ch){__IO uint32_t* dmac = NULL;dmac = &(DMAx->DSTADR0);dmac += (ch << 4);return READ_REG((*dmac)) & DMA_DST_ADDR;}typedef struct{uint32_t Prority;uint32_t PeriphRequest;uint32_t DataSize;uint32_t NbData;uint32_t Mode; uint32_t DataWidth;uint32_t PeriphOrM2MSrcIncMode; uint32_t MemoryOrM2MDstIncMode; uint32_t PeriphOrM2MSrcAddress;uint32_t MemoryOrM2MDstAddress;} LL_DMA_InitTypeDef;//===函数定义uint8_t LL_DMA_Init(DMA_TypeDef* DMAx, uint32_t Channel, LL_DMA_InitTypeDef* DMA_InitStruct);uint8_t LL_DMA_DeInit(DMA_TypeDef* DMAx, uint32_t Channel);///
#ifdef __cplusplus
}
#endif #endif /* HC32L1XX_LL_DMA_H_ */
相关文章:
HC32L17x的LL驱动库之dma
#include "hc32l1xx_ll_dma.h"/// //函 数: //功 能: //输入参数: //输出参数: //说 明: // uint8_t LL_DMA_DeInit(DMA_TypeDef* DMAx, uint32_t Channel) {__IO uint32_t* dmac NULL;dmac &(DMAx->CONFA0);Channel << 4;dmac …...
SSM项目 替换为 SpringBoot
一、运行SSM项目 保证项目改为SpringBoot后运行正常,先保证SSM下运行正常。 项目目录结构 创建数据库,导入sql文件 查看项目中连接数据jar版本,修改对应版本,修改数据库配置信息 配置启动tomcat 运行项目,测试正常…...
RL笔记:动态规划(2): 策略迭代
目录 0. 前言 (4.3) 策略迭代 Example 4.2: Jack’s Car Rental Exercise 4.4 Exercise 4.5 Exercise 4.6 Exercise 4.7 0. 前言 Sutton-book第4章(动态规划)学习笔记。本文是关于其中4.2节(策略迭代)。 (4.3) 策略迭代 基…...
2023软件测试金三银四常见的软件测试面试题-【测试理论篇】
三、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, 我…...
蓝桥训练第二周
1 ,泛凯撒加密 内存限制:128 MB时间限制:1.000 S 题目描述 众所周知,在网络安全中分为明文和密文,凯撒加密是将一篇明文中所有的英文字母都向后移动三位(Z的下一位是A),比如a向后…...
详讲函数知识
目录 1. 函数是什么? 2. C语言中函数的分类: 2.1 库函数: 2.2 自定义函数 函数的基本组成: 3. 函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): …...
gin 框架初始教程文档
一 、gin 入门1. 安装gin :下载并安装 gin包:$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中:import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...
Maven的下载和安装【详细】
文章目录一、什么是Maven?二、Maven的安装与配置2.1下载Maven安装包2.2配置Maven环境变量2.3验证三、Idea配置Maven3.1配置 setting.xml文件3.2Idea配置Maven一、什么是Maven? Apache Maven是个项目管理和自动构建工具,基于项目对象模型&…...
[数据结构]:04-循环队列(数组)(C语言实现)
目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是为了…...
buu [GWCTF 2019]BabyRSA 1
题目描述: import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…...
codeforces 1669F
题意: alice和bob从数组两边的吃糖果, 数组的值就是糖果重量 要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果 这题最先想到的是前后缀相加 模拟一个前缀和 和 后缀和 在n/2的位置向前找前缀和 在n/2的位置向后找后缀和 找到第一个前缀和后缀和的下标输出就好 …...
高数考试必备知识点
三角函数与反三角函数的知识点 正弦函数 ysin x, 反正弦函数 yarcsin x • y sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x (π/2) kπ 为对称轴 • y arcsin x, x∈[–1,1]…...
[蓝桥杯] 二分与前缀和习题练习
文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...
SpringMvc中HandlerAdapter组件的作用
概述 我们在使用springMVC时,都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件,为什么呢? springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用,这里使用适配器模式的…...
FreeRTOS优先级翻转
优先级翻转优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未…...
服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】
我是用的xshell连接的云服务器,今天想在服务器上面部署一个前后端分离【springbootvue】项目,打开我的云服务器才发现,过期了,然后又买了一个,里面环境啥都没有,正好出一期教程,方便大家也方便自…...
golang项目----家庭收支记账软件
家庭收支记账软件实现基本功能(先使用面向过程,后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程,后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一:先完成可以显示…...
中国LNG市场投资机会研究
中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场,尤其是在政府大力推动清洁能源发展的背景下,LNG市场投资机会正在不断扩大。首先,政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...
Elasticsearch:索引数据是如何完成的
在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...
处理器管理
处理器状态处理器管理是操作系统中重要组成部分,负责管理、调度和分配计算机系统的重要资源——处理器,并控制程序执行由于处理器管理是操作系统最核心的部分,无论是应用程序还是系统程序,最终都要在处理器上执行以实现其功能&…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
