1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/notrynohigh-BabyOS

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
mcu_stm32f10x_dma.c 3.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
notrynohigh Отправлено 4 месяцев назад 8cfdde6
#include "b_config.h"
#include "hal/inc/b_hal_dma.h"
typedef struct
{
volatile uint32_t CCR; /*!< DMA channel x configuration register */
volatile uint32_t CNDTR; /*!< DMA channel x number of data register */
volatile uint32_t CPAR; /*!< DMA channel x peripheral address register */
volatile uint32_t CMAR; /*!< DMA channel x memory address register */
} McuDmaReg_t;
#define DMA1_BASE_ADDR (0x40020000)
#define DMA_CHL_BASE (DMA1_BASE_ADDR + 0x00000008UL)
#define DMA1_CLOCK_ENABLE() B_SET_BIT((*((volatile uint32_t *)(0x40021000 + 0x14))), 0x1)
int bMcuDmaConfig(bHalDmaConfig_t *pconf)
{
if (pconf->chl > B_HAL_DMA_CHL_7)
{
return -1;
}
DMA1_CLOCK_ENABLE();
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + pconf->chl * 0x14);
if (pconf->request == B_DMA_REQ_UART1_RX || pconf->request == B_DMA_REQ_UART2_RX ||
pconf->request == B_DMA_REQ_LPUART1_RX)
{
B_CLEAR_BIT(pdma->CCR, (0x1 << 14));
B_CLEAR_BIT(pdma->CCR, (0x1 << 4));
if (pconf->inc == B_DMA_DEST_ADDR_INC)
{
B_SET_BIT(pdma->CCR, (0x1 << 7)); // memory
B_CLEAR_BIT(pdma->CCR, (0x1 << 6)); // peripheral
}
pdma->CPAR = pconf->src;
pdma->CMAR = pconf->dest;
}
if (pconf->bits == B_DMA_DATA_BIT8)
{
B_MODIFY_REG(pdma->CCR, 0x3 << 8, 0x0);
B_MODIFY_REG(pdma->CCR, 0x3 << 10, 0x0);
}
else if (pconf->bits == B_DMA_DATA_BIT16)
{
B_MODIFY_REG(pdma->CCR, 0x3 << 8, 0x1);
B_MODIFY_REG(pdma->CCR, 0x3 << 10, 0x1);
}
else if (pconf->bits == B_DMA_DATA_BIT32)
{
B_MODIFY_REG(pdma->CCR, 0x3 << 8, 0x2);
B_MODIFY_REG(pdma->CCR, 0x3 << 10, 0x2);
}
B_MODIFY_REG(pdma->CCR, 0x3 << 12, 0x2);
if (pconf->inc == B_DMA_BOTH_INC)
{
B_SET_BIT(pdma->CCR, (0x1 << 7));
B_SET_BIT(pdma->CCR, (0x1 << 6));
}
else if (pconf->inc == B_DMA_NONE_INC)
{
B_CLEAR_BIT(pdma->CCR, (0x1 << 7));
B_CLEAR_BIT(pdma->CCR, (0x1 << 6));
}
if (pconf->is_circular)
{
B_SET_BIT(pdma->CCR, (0x1 << 5));
}
else
{
B_CLEAR_BIT(pdma->CCR, (0x1 << 5));
}
pdma->CNDTR = pconf->count;
return 0;
}
int bMcuDmaStart(bHalDmaChlNumber_t chl)
{
if (chl > B_HAL_DMA_CHL_7)
{
return -1;
}
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + chl * 0x14);
B_SET_BIT(pdma->CCR, (0x1 << 0));
return 0;
}
int bMcuDmaStop(bHalDmaChlNumber_t chl)
{
if (chl > B_HAL_DMA_CHL_7)
{
return -1;
}
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + chl * 0x14);
B_CLEAR_BIT(pdma->CCR, (0x1 << 0));
return 0;
}
int bMcuDmaSetDest(bHalDmaChlNumber_t chl, uint32_t addr)
{
if (chl > B_HAL_DMA_CHL_7)
{
return -1;
}
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + chl * 0x14);
if (B_READ_BIT(pdma->CCR, 0x1 << 4) == 0)
{
pdma->CMAR = addr;
}
else
{
pdma->CPAR = addr;
}
return 0;
}
int bMcuDmaSetCount(bHalDmaChlNumber_t chl, uint32_t count)
{
if (chl > B_HAL_DMA_CHL_7)
{
return -1;
}
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + chl * 0x14);
pdma->CNDTR = count;
return 0;
}
int bMcuDmaGetCount(bHalDmaChlNumber_t chl)
{
if (chl > B_HAL_DMA_CHL_7)
{
return -1;
}
McuDmaReg_t *pdma = (McuDmaReg_t *)(DMA_CHL_BASE + chl * 0x14);
return pdma->CNDTR;
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/notrynohigh-BabyOS.git
git@gitlife.ru:oschina-mirror/notrynohigh-BabyOS.git
oschina-mirror
notrynohigh-BabyOS
notrynohigh-BabyOS
master