STM32——DMA篇

技术笔记!

一、DMA介绍(了解)

二、DMA结构框图介绍(熟悉)

三、DMA相关寄存器介绍(熟悉)

四、DMA相关HAL库驱动介绍(掌握)

五、DMA配置步骤(掌握)

六、编程实战(掌握)

DMA_HandleTypeDef g_dma_handler;

uint8_t src_buf[10] = {0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
uint8_t dest_buf[10] = {0};

/* 内存到内存 DMA传输 */
void dma_init(void)
{
    /* 使能DMA1时钟 */
    __HAL_RCC_DMA1_CLK_ENABLE();
    
    g_dma_handler.Instance = DMA1_Channel1;
    g_dma_handler.Init.Direction = DMA_MEMORY_TO_MEMORY;
    
    /* 与目标地址相关 */
    g_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    g_dma_handler.Init.MemInc = DMA_MINC_ENABLE;

    /* 与源地址相关 */
    g_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    g_dma_handler.Init.PeriphInc = DMA_PINC_ENABLE;
    
    g_dma_handler.Init.Priority = DMA_PRIORITY_HIGH;
    g_dma_handler.Init.Mode = DMA_NORMAL;   /* 内存到内存是不支持循环模式 */
    
    HAL_DMA_Init(&g_dma_handler);
    HAL_DMA_Start(&g_dma_handler, (uint32_t)src_buf, (uint32_t)dest_buf, 0);
}

void dma_enable_transmit(uint16_t cndtr)
{
    __HAL_DMA_DISABLE(&g_dma_handler);
    
//    DMA1_Channel1->CNDTR = cndtr;
    g_dma_handler.Instance->CNDTR = cndtr;
    
    __HAL_DMA_ENABLE(&g_dma_handler);
}

int main(void)
{
    uint8_t key;

    HAL_Init();                             /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    delay_init(72);                         /* 延时初始化 */
    usart_init(115200);
    led_init();                             /* 初始化LED */
    key_init();                             /* 初始化按键 */
    beep_init();                            /* 初始化蜂鸣器 */
    LED0(0);                                /* 先点亮LED0 */
    dma_init();
    
    while(1)
    {
        key = key_scan(0);                  /* 得到键值 */
        
        if (key == KEY0_PRES)
        {
            memset(dest_buf, 0, 10);
            dma_enable_transmit(10);
            
            while(1)
            {
                if (__HAL_DMA_GET_FLAG(&g_dma_handler, DMA_FLAG_TC1))
                {
                    __HAL_DMA_CLEAR_FLAG(&g_dma_handler, DMA_FLAG_TC1);
                    printf("传输完成 \r\n");
                    break;
                }
            }
        }

        LED0_TOGGLE();
        delay_ms(200);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值