这里没有解析红外的函数,毕竟考虑到学习的红外有几种协议(如:NEC).同时代码存在一些问题(有部分遥控是学习不了的(如:空调、DVD)).
红外数据接收:定时器捕获红外信号(还有一个是通过外部中断的,这里不列出)
红外数据发射:使用PWM输出
下面直接上代码
remote.c
/*remote.c*/
#include "remote.h"
#include "delay.h"
#include "usart.h"
/**
发射:PA7-TIM3-CH2
接收:PC8-TIM8-CH3
TIM8:
下面代码中捕获中断和定时中断分开,不在同一中断函数,所以需要配置两次中断优先级(应该可以合在一起配置)
*/
/**
* @name void Remote_Init(void)
* @description 红外遥控初始化 设置IO以及定时器8的输入捕获
* Infrared remote initializer sets IO and timer 8 input capture
* @notice
*/
void Remote_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE); //使能PORTB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); //TIM8 时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PC8 输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_8); //初始化GPIOC.8
TIM_TimeBaseStructure.TIM_Period = 9999; //设定计数器自动重装值 最大10ms溢出
TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //预分频器,1M的计数频率,1us加1.
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx
TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; // 选择输入端 IC4映射到TI4上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM_ICInitStructure.TIM_ICFilter = 0x03; //IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
TIM_ICInit(TIM8, &TIM_ICInitStructure); //初始化定时器输入捕获通道
TIM_Cmd(TIM8,ENABLE ); //使能定时器4
NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn; //TIM8TIM8捕获比较中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;