资源简介
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
- 上一篇:SAP系统权限详细操作手册
- 下一篇:Axure RP8.0 项目视频教程
评论
共有 条评论