【GD32定时器】高级定时器生成PWM波+定时器外设配置DMA使用

基本定时器和系统时钟配置可以参考以下文章,
文章链接为:
【GD32系列–基本定时器Timer + 定时1ms 灯光间隔1s闪烁例程】
【GD32】_时钟架构及系统时钟频率配置
【GD32】 TIMER通用定时器学习+PWM输出占空比控制LED

目录标题

  • 一 、DMA简介
    • 1 DMA 操作
    • 2 中断
    • 3 DMA 请求映射
  • 二、代码分析:
    • 1 定时器外设配置DMA使用
    • 2 定时器用来产生PWM信号,实现对外设的控制。

一 、DMA简介

DMA 控制器提供了一种硬件的方式在外设和存储器之间或者存储器和存储器之间传输数据,
而无需 CPU 的介入,从而使 CPU 可以专注在处理其他系统功能上。

1 DMA 操作

DMA 传输分为两步操作:从源地址读取数据,之后将读取的数据存储到目的地址。

2 中断

每个DMA通道都有一个专用的中断。中断事件有三种类型:传输完成,半传输完成和传输错误。
每一个中断事件在DMA_INTF寄存器中有专用的标志位,在DMA_INTC寄存器中有专用的清除
位,在DMA_CHxCTL寄存器中有专用的使能位。

3 DMA 请求映射

多个外设请求被映射到同一个 DMA 通道。这些请求信号在经过逻辑或后进入 DMA。(使用的DMA通道要和外设相对应

【GD32定时器】高级定时器生成PWM波+定时器外设配置DMA使用_第1张图片

二、代码分析:

1 定时器外设配置DMA使用

使用TIMER5_UP对应通道2配置。

1)、使能DMA时钟:

rcu_periph_clock_enable(RCU_DMA);

2)、DMA 通道配置参数

/* DMA channel select */ 
typedef enum
{
   
	DMA_CHO=0,/*!< DMA Channel0 */
	DMA CHI, /*!< DMA Channel1 */ 
	DMA CH2. /*!< DMA Channel2 */
	DMA CH3. /*!< DMA Channel3 */
	DMA CH4,  /*!< DMA Channel4 */
	DMA CH5, /*I< DMA Channel5 */
	DMA CH6/*!< DMA Channel6*/
} dna_channel_enun;
/* DMA initialize struct */
typedef struct
{
   
	uint32_t periph_addr;  /*!< peripheral base address */
	uint32 t periph_width:  /*l< transfer data size of peripheral */
	uint8 t periph_inc:     /*!< peripheral increasing mode */
	uint32_t memory_addr:  /*!
	uint32 t memory_width;  /*!< transfer data size of memory */
	uint8 t memory_inc:     /*!< memory increasing mode */
	uint8 t direction;        /*l< channel data transfer direction */
	uint32_t number;       /*!< channel transfer number */
	uint32_t priority;       /*!< channel priority level */
}dma_parameter_struct;

3)、使能通道,开启DMA

dma_channel_enable(DMA_CH2);

4)、示例:

(uint32_t) destination_address = 0x48000018;
(uint32_t)Toggle_Buffe[50];
void Ti

你可能感兴趣的:(嵌入式软件开发,单片机,嵌入式硬件)