打印

基于lks08系列PWM+DMA控制WS2812失败求组

[复制链接]
93|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
111123bghh|  楼主 | 2025-2-16 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打算用081的开发板中定时器3的通道1输出一个pwm控制WS2812但是最后发现DMA能进中断,但是数据搬运没有成功,且用官方的DMA_RX例程 也读不到外设寄存器内的值,请大佬们帮忙看看
我的初始化代码 如下
void Hardware_init(void)
{
    __disable_irq();                  /* 关闭中断 中断总开关 */
    SYS_WR_PROTECT = 0x7a83;          /* 使能系统寄存器写操作*/
    FLASH_CFG |= 0x00080000;          /* enable prefetch ,FLASH预取加速使能*/
    GPIO_init();                      /* GPIO初始化 */
    UTimer_init();                    /* UTimer初始化 */
          SoftDelay(100);                   /* 等待硬件初始化完毕*/
          DMA_init();      
                SoftDelay(100);           /* DMA初始化 */
                NVIC_EnableIRQ(DMA_IRQn);
    NVIC_SetPriority(DMA_IRQn,0);
          SYS_WR_PROTECT = 0x0;             /*关闭系统寄存器写操作*/
    __enable_irq();                   /* 开启中断 */
}
void GPIO_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_StructInit(&GPIO_InitStruct); //初始化结构体

    //配置LED1:P0.6  LED2:P0.7  LED3: P0.3
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIO输出模式
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIO0, &GPIO_InitStruct);

       /* 配置UTimer3 TIM3_CH0: P2.8 */
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIO_Init(GPIO2, &GPIO_InitStruct);
    GPIO_PinAFConfig(GPIO2,GPIO_PinSource_8,AF8_TIMER23); //P0.15复用为timer0的输出模式
       
       /* 配置UTimer3 TIM3_CH0: P2.8 */
    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_Init(GPIO3, &GPIO_InitStruct);
    GPIO_PinAFConfig(GPIO3,GPIO_PinSource_9,AF8_TIMER23); //P0.15复用为timer0的输出模式
}
void UTimer_init(void)
{
  TIM_TimerInitTypeDef TIM_InitStruct;
  TIM_TimerStrutInit(&TIM_InitStruct);                   // Timer结构体初始化
        TIM_InitStruct.EN = ENABLE;                            // 定时器模块使能
  TIM_InitStruct.Timer_ClockDiv = TIM_Clk_Div1;          // 设置Timer模块时钟1分频系数
  TIM_InitStruct.Timer_CH0_WorkMode = TIMER_OPMode_CMP;  // 设置Timer CH0 为比较模式
  TIM_InitStruct.Timer_CH0Output = 0;                    // 计数器回零时,比较模式输出极性控制
  TIM_InitStruct.Timer_CH1_WorkMode = TIMER_OPMode_CMP;  // 设置Timer CH1 为比较模式
  TIM_InitStruct.Timer_CH1Output = 0;                    // 计数器回零时,比较模式输出极性控制
  TIM_InitStruct.Timer_TH = 48000000;                       // 定时器计数门限初始值500us
  TIM_InitStruct.Timer_CMP0 = 24000000;                     // 设置比较模式的CH0比较初始值25%转空比
  TIM_InitStruct.Timer_CMP1 = 0;                     // 设置比较模式的CH1比较初始值24000//
  TIM_InitStruct.Timer_IRQEna = Timer_IRQEna_CH1;        // 开启Timer模块比较中断
  TIM_TimerInit(TIMER3, &TIM_InitStruct);
        UTIMER_RE        =BIT11;
        TIM_TimerCmd(TIMER3, ENABLE); /* Timer0 模块使能 */
}
u32 buff[4]={0x002dc260,0x002dc280,0x002dc240,0x002dc220};
u32 buff1[4]={0};
void DMA_init(void)
{
    DMA_InitTypeDef DMA_InitStruct;
    DMA_StructInit(&DMA_InitStruct);
    DMA_InitStruct.DMA_IRQ_EN = DMA_TCIE    ;       // DMA 传输完成中断使能
    DMA_InitStruct.DMA_DIR = MEMORY2PERI;           // 内存至外设
    DMA_InitStruct.DMA_CIRC = DISABLE;              // 关闭循环传输模式
    DMA_InitStruct.DMA_PINC = DISABLE;               // 外设地址每轮内是否递增,高有效
    DMA_InitStruct.DMA_MINC = ENABLE;               // 内存地址第二轮是否在第一轮地址的基础上递增(轮内地址一定递增),高有效
    DMA_InitStruct.DMA_PBTW = DMA_WORD_TRANS;       // 外设访问位宽, 0:byte, 1:half-word, 2:word
    DMA_InitStruct.DMA_MBTW = DMA_WORD_TRANS;       // 内存访问位宽, 0:byte, 1:half-word, 2:word
    DMA_InitStruct.DMA_REQ_EN = DMA_CH2_TIMER3_REQ_EN; // CAN DMA请求使能,高有效
    DMA_InitStruct.DMA_TIMES = 1;                   // DMA 通道 x 每轮数据搬运次数 1~511
    DMA_InitStruct.DMA_ROUND = 4;                   // DMA 通道 x 采样轮数 1~255
    DMA_InitStruct.DMA_CPAR = (u32) & UTIMER_UNT0_CMP1;      // DMA 通道 x 外设地址
    DMA_InitStruct.DMA_CMAR = (u32) buff;         // DMA 通道 x 内存地址
    DMA_Init(DMA_CH2, &DMA_InitStruct);
    DMA_CHx_EN(DMA_CH2,ENABLE);      
}

使用特权

评论回复
沙发
111123bghh|  楼主 | 2025-2-16 16:09 | 只看该作者
破案了 手册上说08系列不支持TIMER+DMA组合 ,不看手册就会狠狠浪费时间,我现在感觉腰子都再痛

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝