• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-18
  • 语言: 其他
  • 标签: TM1804  PWM+DMA  

资源简介

STM32驱动TM1804 灯带,实现方法PWM+DMA不占用CPU内存

资源截图

代码片段和文件信息

#include “Tm1803.h“
#include “IIC.h“

u8 LEDbuffer[LED_BUFFER_SIZE]={0};


void TIM4_PWM_Init(u16 arru16 psc)  //LED驱动 psc=0
{  
RCC->APB1ENR|=1<<2;  //TIM4时钟使能
RCC->APB2ENR|=1<<3;     //使能PORTB时钟

GPIOB->CRL&=0XF0FFFFFF; //PB6 
GPIOB->CRL|=0X0B000000; //复用功能输出    

TIM4->ARR=arr; //设定计数器自动重装值 
TIM4->PSC=psc; //预分频器不分频

TIM4->CCMR1|=6<<4;   //CH1 PWM模式1

TIM4->CCMR1|=1<<3;      //CH1预装载使能  

TIM4->CCER|=1<<0;    //OC1 输出使能 (0<<1 输出极性高)   

TIM4->DIER |= 0x0200; //开启DMA通道传输

MYDMA_Config(DMA1_Channel1(u32)&TIM4->CCR1(u32)LEDbufferLED_BUFFER_SIZE);
// TIM4->CR1|=0x01;     //使能定时器3  
}


u16 DMA1_MEM_LEN;

void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHxu32 cparu32 cmaru16 cndtr)
{
RCC->AHBENR|=1<<0; //开启DMA1时钟
delay_ms(50);  //等待DMA时钟稳定
DMA_CHx->CPAR=cpar;    //DMA1 外设地址 
DMA_CHx->CMAR=(u32)cmar;  //DMA1存储器地址
DMA1_MEM_LEN =cndtr;   //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr;     //DMA1传输数据量
DMA_CHx->CCR=0X00000000; //复位
DMA_CHx->CCR|=1<<4;   //从存储器读
DMA_CHx->CCR|=1<<1; //允许传输完成中断
DMA_CHx->CCR|=1<<5;   //普通模式1 循环发送 0 不循环发送
DMA_CHx->CCR|=0<<6;  //外设地址非增量模式
DMA_CHx->CCR|=1<<7;    //存储器增量模式
DMA_CHx->CCR|=1<<8;    //外设数据宽度为16位
DMA_CHx->CCR|=0<<10;  //存储器数据宽度8位
DMA_CHx->CCR|=1<<13;  //高等优先级
DMA_CHx->CCR|=0<<14;  //非存储器到存储器模式

MY_NVIC_Init(00DMA1_Channel1_IRQChannel2);//组2,低优先级 
}

//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0);  //关闭DMA传输 
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1传输数据量 
DMA_CHx->CCR|=1<<0;           //开启DMA传输
}

void DMA1_Channel1_IRQHandler(void) //DMA发送数据完成中断函数
{
if(DMA1->ISR&(1<<1)) //发送完成
{
DMA1->IFCR|=1<<1; //清除通道1传输完成标志
DMA1_Channel1->CCR&=~(1<<0);  //关闭DMA传输
TIM4->CR1&= 0xfe;             //不使能定时器3 
}
}


void LedDrive(u8 *bufu8 Redu8 Greenu8 Blue)
{
u16 i;
for(i=0;i<8;i++)
{
buf[i]  = ((Red< buf[8+i] = ((Green< buf[16+i] = ((Blue< }
}

void SetLedColor(u8 indexu8 Redu8 Greenu8 Blue)
{
u8 temp[24]={0};
u8 i;
for(i=0;i<8;i++)
temp[i] = ((Green< for(i=0;i<8;i++)
temp[8+i]= ((Red< for(i=0;i<8;i++)
temp[16+i]= ((Blue<
for(i=0;i<24;i++)
LEDbuffer[LED_RESET_CODE+index*24+i]=temp[i];
}
void DMA_Send_Data(void)
{
MYDMA_Enable(DMA1_Channel1);
TIM4->CR1|=0x01;     //使能定时器3
}
extern u8 abc;
void TM1803_send(void)
{
//u16 i;
LedDrive(LEDbuffer25500);
MYDMA_Enable(DMA1_Channel1);
TIM4->CR1|=0x01;     //使能定时器3
}



 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-03-12 17:14  TM1804 PWM+DMA驱动不占内存\
     文件        2880  2018-03-08 10:52  TM1804 PWM+DMA驱动不占内存\tm1804.c
     文件         494  2018-03-08 11:20  TM1804 PWM+DMA驱动不占内存\Tm1804.h

评论

共有 条评论

相关资源