STM32红外发射的实现

发布者:Susan苏最新更新时间:2017-10-29 来源: eefocus关键字:STM32  红外发射 手机看文章 扫描二维码
随时随地手机看文章

一、环境:
         公司所采用的是STM32F103RBT6芯片,本人开发是基于官方提供的V3.5.0的函数库。
二、所要实现的功能是:
         1.  开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。
         2.  上位机通过串口程序,发送学习来的码,可控制红外设备。
         3.  发送时共有四路,上位机发送码子时,可选择通道。

三、实现:

         0.  在写功能之前先要对我们所用的模块和时钟进行初始化。
                       (此部分 自己看手册)
         1.  开发板能够学习由遥控器发送来的红外码,并在串口上打印出来。

              红外的学习功能我是利用中断+定时,来记录红外码高低电平的时间长度,程序如下:

 

void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line7) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line7);
if(num == 0)
{
TIM_Cmd(TIM2, ENABLE); 
TIM_SetCounter(TIM2, 0x0000);
}
else
{
Ir_data[2*(num-1)] = TIM_GetCounter(TIM2);
Ir_data[2*num-1] = (TIM_GetCounter(TIM2) >> 8);
TIM_SetCounter(TIM2, 0x0000);
}
num++;
}
}

此部分代码记录了红外高低电平的时长,并保存在数组Ir_data中,在主程序while(1)里可设置相应的标识打印出这些数据。

 2.  上位机通过串口程序,发送学习来的码,可控制红外设备。

 3.  发送时共有四路,上位机发送码子时,可选择通道。

   二和三的功能我用一个函数实现了,因为,功能三,只需要有相应的标识就行了,函数如下:

 

void send_IrDa(void)
{
unsigned char i;
uint16_t TIMPeriod;

TIM_Cmd(TIM2, ENABLE); 


for(i = 0; i < LENGTH/2 - 1; i++)
{
TIMPeriod = ((Ir_data[2*i + 1] << 8) | Ir_data[2*i]);
if(TIMPeriod == 0)
break;
TIM_SetAutoreload(TIM2, TIMPeriod);
while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);


switch(Ir_data[LENGTH-1])
{
case 1:
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_1) ? GPIO_ResetBits(GPIOB, GPIO_Pin_1) : GPIO_SetBits(GPIOB, GPIO_Pin_1); 
break;   
case 2:
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) ? GPIO_ResetBits(GPIOB, GPIO_Pin_12) : GPIO_SetBits(GPIOB, GPIO_Pin_12); 
break;   
case 4:
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_13) ? GPIO_ResetBits(GPIOB, GPIO_Pin_13) : GPIO_SetBits(GPIOB, GPIO_Pin_13);  
break;  
case 8:
GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_14) ? GPIO_ResetBits(GPIOB, GPIO_Pin_14) : GPIO_SetBits(GPIOB, GPIO_Pin_14);  
break;  
default:
printf("\nERROR about channel choose\n");
break;
}
}


while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);


TIM_Cmd(TIM2, DISABLE); 
GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14);
}

想必大家看了代码都知道了,我是利用最后一个字节选择的发送通道,具体是由函数中的switch语句实现的。
把保存在数组中的红外码通过定时器,还原出接受到得红外码子。

附:想必大家都知道红外的发送时需要载波信号的,利用此芯片的PWM功能我也产生了38K的载波信号,代码如下:

TIM_TimeBaseStructure.TIM_Period = 210; 
TIM_TimeBaseStructure.TIM_Prescaler = 8;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 105;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;


TIM_OC3Init(TIM3, &TIM_OCInitStructure);

TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);


TIM_ARRPreloadConfig(TIM3, ENABLE);

TIM_Cmd(TIM3, ENABLE);


关键字:STM32  红外发射 引用地址:STM32红外发射的实现

上一篇:STM32 串口发送数据(发送一个字节,以及数组)
下一篇:STM32日志之总结篇1--跑马灯实验

推荐阅读最新更新时间:2024-03-16 15:42

STM32启动文件选择的区别
说的直白点就是以下区别,在选择启动文件的时候有选择性区别! startup_stm32f10x_cl.s 互联型的STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量
[单片机]
关于STM32运行时程序卡在B.处的解决方法
背景: 程序运行时,发现程序卡死在B.处。 解决方法: 程序卡死在B.处说明有中断没有处理,导致程序进入中断后无法跳出。 之后查看程序发现,程序中定义了一个中断,但是之前一次偶然把中断处理程序屏蔽了,导致没有中断处理函数。 程序如下: //开启了EXTI15_10_IRQn中断 void nirq_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pin =GPIO_PIN_13; GPIO_InitStructure.Mode =GPIO_MODE_IT_FALLING ; GPIO_Init
[单片机]
ad7606与stm32连接电路介绍
AD7606/AD7606-6/AD7606-4为Analog Device公司生产的16位同步采样模数数据采集系统(DAS),分别有 8、6、4个采集通道。 输入箝位保护,以承受最高达±16.5V的电压 40 dB 二阶抗混叠滤波器 跟踪保持放大器 16 位电荷再分配逐次逼近型 ADC内核 数字滤波器 2.5V基准电压源及缓冲 高速串行和并行接口 5V单电源供电 支持真正±10V 或±5V 的双极性信号输入 所有的通道均能以高达 200 kSPS 的速率进行采样 内置低噪声、高输入阻抗的信号调理电路,其等效输入阻抗完全独立于采样率且固定为 1MΩ 内置2.5V 带隙电压基准和基准缓冲电路,其温度系数典型值为±10ppm/℃,
[单片机]
ad7606与<font color='red'>stm32</font>连接电路介绍
STM32 模拟I2C (STM32F051)
/** ****************************************************************************** * @file i2c simu.c * @brief simulation function * @CPU STM32F051 * @compiler Keil uVision V4.74 * @author MetalSeed * @copyright WSHHB * @version V1.0.0 * @date 18-Sept-2014 * @modifydate20-Sept-2014 ***
[单片机]
stm32 SysTick系统定时器
它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取 当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数 如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号 void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //1us次数 fac_ms=(u16)fac_us*1000; //1ms次
[单片机]
<font color='red'>stm32</font> SysTick系统定时器
STM32库函数开发使用总结
一、外设常具备的几类寄存器 控制寄存器xxx_CR (Control/Configuration Register): 用来配置、控制响应外设的工作方式,如GPIOx_CRL、AFIO_EXTICR1~AFIO_EXTICR4。 数据寄存器xxx_DR (Data Register) : 存储量外设进行输入输出的数据,如GPIOx_IDR、GPIOx_ODR、USART_DR等。 状态寄存器xxx_SR(Status Register): 实时的更新存储着外设的当前运行状态,主要是一些标志位,如USART_SR、ADC_SR等。 二、控制外设的常见操作 设置工作模式、使能外设等  常在初始化外设时完成,调用函数xxx_I
[单片机]
STM32之USART(one)
USART我们一般是用在调试程序时输出调试信息,或者是用来做串行通讯。 看到ST的手册USART的功能有多么强大,其实我们很少用到那么多功能,再者我对那些部分也不是很熟,所以我们先说一下我们最常用最简单的部分,以后如果用到其他的模式我们再来看,我们的内存是有限的,所以将这些最常用的知识常驻内存吧。 好了,那我们下边来看USART: 使USART正常使用,我们总结下步骤吧 1.要使用一个模块第一我们就要先时能相应的时钟,相应的,如果某个模块不再使用了要关闭相应的始终,这样的点点滴滴我们就能降低我们系统的功耗。 2.配置相应的引脚 3.配置USART的波特率,帧格式等 4.然后就是发送接收的事了
[单片机]
<font color='red'>STM32</font>之USART(one)
完善STM32产品线 意法发布STM32 F3系列
今年5月份,意法半导体发布了基于ARM Cortex-M0架构的STM32 F0系列入门型微控制器,至此,STM32系列产品已经拥有了基于Cortex-M系列内核的完整解决方案,从入门级的微控制器STM32 F0到内置DSP和FPU的高性能微控制器STM32 F4系列,至此,细心认识也许会产生疑问:F3在哪里?它在STM32家族中的地位又将如何?9月13日,意法半导体的32位微控制器产品线经理 Jean-Marc Mathieu专程抵京,为业界揭开了STM32 F3系列产品的神秘面纱。 这套搭载ARM Cortex-M4内核的STM32 F3系列产品不仅内置了DSP和FPU功能,且拥有无与伦比的模拟外设组合,定位介于F1
[单片机]
完善<font color='red'>STM32</font>产品线 意法发布<font color='red'>STM32</font> F3系列
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved