OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6825|回复: 2

F407,输入捕获红外线,然后通过DMA保存到寄存器,有做过得大牛能进来指教下吗?

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-29
在线时间
3 小时
发表于 2015-5-21 11:05:54 | 显示全部楼层 |阅读模式
5金钱
u8 rfflag=0;//红外接收标志
u8 rfindex=0;//红外接收索引
u8   rfstart=0;//引导码正确,正式开始标志位0:未开始,1:开始,2结束
u8 rfend=0;//连续码
u16 rfcode[34];//32位红外码
u8 resrf;
u16 code1;
u16* codebuf=&code1;


void RF_Init()
{
GPIO_InitTypeDef   GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
TIM_ICInitTypeDef   TIM_ICInitStructure;
DMA_InitTypeDef   DMA_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//TIM1时钟使能 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能 

//GPIOA8  复用功能,上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化

GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1); //GPIOA8复用为TIM1

TIM_TimeBaseStructure.TIM_Prescaler=16400;  ////预分频器
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=10000;   //设定计数器自动重装值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); 
   
  //初始化TIM1输入捕获参数
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //通道1
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //直接连接TI1
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 
TIM_ICInitStructure.TIM_ICFilter = 0x00;//不滤波
TIM_ICInit(TIM1, &TIM_ICInitStructure);//初始化定时器1输入捕获通道

TIM_ITConfig(TIM1,TIM_IT_CC1,ENABLE);//允许C1捕获中断
TIM_Cmd(TIM1,ENABLE ); //使能定时器2

DMA_DeInit(DMA2_Stream3);

while (DMA_GetCmdStatus(DMA2_Stream3) != DISABLE){}//等待DMA可配置 

/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_6;  //通道6
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM1->CCR1;//DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&rfcode;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到寄存器模式
DMA_InitStructure.DMA_BufferSize = 1;//数据传输量 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式 
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;    //关闭FIFO模式     
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA2_Stream3, &DMA_InitStructure);//初始化DMA Stream

TIM_DMAConfig(TIM1,TIM_DMABase_CCR1,TIM_DMABurstLength_1Transfer);//TIM1_CCR1连接DMA,
TIM_DMACmd(TIM1,TIM_DMA_CC1,ENABLE);//使能TIM1通道1到DMA
DMA_Cmd(DMA2_Stream3,ENABLE);//使能DMA2流3
DMA_ITConfig(DMA2_Stream3,DMA_IT_TCIF3,ENABLE);//使能流3中断

// NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级1
// NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
// NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器

NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器

}

void DMA2_Stream3_IRQHandler()
{
printf("IT");

DMA_ClearITPendingBit(DMA2_Stream3,DMA_IT_TCIF3);

}

//void TIM1_CC_IRQHandler()
//{
// if(TIM_GetITStatus(TIM1,TIM_IT_CC1) !=RESET)
// {
// RFY=~RFY;
// if(rfflag==0)//红外接收标志位
// {
// rfflag=1;
// }else if(rfstart==0)
// {
// if((130<TIM1->CCR1)&&(TIM1->CCR1<145))//第一个信号是否是引导
// {
// rfstart=1;//开始接收信号标志位
// rfindex=0;
// }
// else if((110<TIM1->CCR1)&&(120>TIM1->CCR1))
// {
// rfend++;
// resrf=1;
// rfflag=0;
// rfstart=0;
// }
// }
// else if(rfstart==1)
// {
// rfcode[rfindex]=TIM1->CCR1;
// rfindex++;
// if(rfindex==32)
// {
// rfflag=0;
// rfstart=0;
// resrf=1;
// printf("%x\r\n",RF_KEY());
// }
// }
// }
// TIM_SetCounter(TIM1,0);
//   TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); /*清除中断标志位*/
//}

////红外解码
//u8 RF_KEY()
//{
// u8 opcode,fopcode;
// u8 j;
// for(j=16;j<24;j++)
// {
// opcode<<=1;
// if(rfcode[j]>20)opcode|=0x01;
// }
// for(j=24;j<32;j++)
// {
// fopcode<<=1;
// if(rfcode[j]>20)fopcode|=0x01;
// }
// resrf=0;
// return opcode;
//// printf("%u\r\n",opcode);
//// printf("%u\r\n",fopcode);
//}

最佳答案

查看完整内容[请看2#楼]

DMA和定时器初始化顺序换一下就正常了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-29
在线时间
3 小时
 楼主| 发表于 2015-5-21 11:05:55 | 显示全部楼层
DMA和定时器初始化顺序换一下就正常了。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-12-29
在线时间
3 小时
 楼主| 发表于 2015-5-21 15:18:09 | 显示全部楼层
输入捕获中断   检测数据已测试正常
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 18:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表