新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2014-12-29
- 在线时间
- 3 小时
|
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);
//}
|
|