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

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

一 、DMA简介

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

1 DMA 操作

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

2 中断

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

3 DMA 请求映射

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

在这里插入图片描述

二、代码分析:

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:  /*!<memory base address */
	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
  • 22
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要配置定时器的工作模式为 PWM 模式,然后设置定时器的周期和占空比即可输出 PWM 。以下是使用 GD32F4xx 标准库的代码示例: ```c #include "gd32f4xx.h" void timer_pwm_init(void) { /* 使能定时器时钟 */ rcu_periph_clock_enable(RCU_TIMER0); /* 配置定时器的工作模式为 PWM 模式 */ timer_oc_parameter_struct timer_ocinitpara; timer_parameter_struct timer_initpara; timer_deinit(TIMER0); timer_struct_para_init(&timer_initpara); timer_initpara.prescaler = 0; // 定时器分频系数 timer_initpara.alignedmode = TIMER_COUNTER_EDGE; // 边沿对齐计数模式 timer_initpara.counterdirection = TIMER_COUNTER_UP; // 向上计数模式 timer_initpara.period = 999; // 定时器周期 timer_init(TIMER0, &timer_initpara); /* 配置定时器的输出通道 */ timer_channel_output_struct_para_init(&timer_ocinitpara); timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; // 使能输出通道 timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; // 输出极性为高电平 timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; // 输出互补极性为高电平 timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; // 输出空闲状态为低电平 timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; // 输出互补空闲状态为低电平 timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); /* 设置定时器的占空比 */ timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 500); // 占空比为 50% /* 使能定时器 */ timer_enable(TIMER0); } int main(void) { timer_pwm_init(); while (1) { // do something } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大山很山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值