STM32红外发送和接收
1、PWM发射脉冲设置**(38KHz,占空比50%,PWM发射端需用定时器的复用端口来实现,TIM_Period = 38KHz/84MHz/2=2262=1131*2,通过仪器进行微调靠近38Hz)**
void PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//系统时钟84MHz
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能PORTF时钟 GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //GPIOD13复用为定时器14
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //GPIOD14复用为定时器14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //GPIOD13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PF9TIM_TimeBaseStructure.TIM_Period = 1105*2; //38KHz波形
TIM_TimeBaseStructure.TIM_Prescaler = 0; //
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); ///* Output Compare Active Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
TIM_OCInitStructure.TIM_Pulse = 557*2; //占空比:50%
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High ; //TIM_OCPolarity_High
TIM_OC2Init(TIM4, &TIM_OCInitStructure); //
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //TIM_OC2PreloadConfig与发射通道匹配/* Output Compare Active Mode configuration: Channel3 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
TIM_OCInitStructure.TIM_Pulse = 557*2; //占空比:50%
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High ; //TIM_OCPolarity_High
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //TIM_ARRPreloadConfig(TIM4, ENABLE);TIM_Cmd(TIM4,DISABLE); //默认定时器处于关闭状态
}
2、PWM发射引脚的控制**(引脚打开要注意模式设置为复用模式,引脚的关闭不能直接关闭,直接使能关闭后发现引脚还是在发射状态,所以将引脚的模式性质进行修改为输入模式后可以直接关闭)**
void PWM_ON(void) //发射引脚打开
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //GPIOF9复用为定时器14
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //GPIOF9复用为定时器14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PF9TIM_Cmd(TIM4,ENABLE);
}
void PWM_OFF(void)//发射引脚关闭
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
TIM_Cmd(TIM4,DISABLE);
TIM4->CR1 |= TIM_CR1_CEN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
3、PWM发射过程中**(要随时控制发射引脚的打开和关闭,否则出现一次关闭后,不执行打开操作将不能再发射脉宽)**
while(bufnum < readData) //2019-4-11 15:30:33
{
times_us = IRred.globe_IRBuf[bufnum];
bufnum ++;
delay_us(times_us);
if(IRflag.globe_pluse38k_flag)
{
IRflag.globe_pluse38k_flag = 0;
PWM_OFF(); //引脚关闭
GPIO_ResetBits(GPIOD,IR_Send_Pin13);
}
else
{
IRflag.globe_pluse38k_flag = 1;
GPIO_SetBits(GPIOD,IR_Send_Pin13);
PWM_ON(); //引脚打开
}
}
4、红外接收**(红外接收口使用定时器复用的捕获功能,且注意就收数据的起始位置从1开始)**
void Remote_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM1_ICInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//TIM1时钟使能
//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复用为TIM1TIM_TimeBaseStructure.TIM_Prescaler=167; 预分频器,1M的计数频率,1us加1.
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=50000; //设定计数器自动重装值 最大50ms溢出
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure); //初始化TIM2输入捕获参数
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //上升沿捕获
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
TIM1_ICInitStructure.TIM_ICFilter = 0x03;//IC1F=0003 8个定时器时钟周期滤波
TIM_ICInit(TIM1, &TIM1_ICInitStructure);//初始化定时器2输入捕获通道
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断
TIM_Cmd(TIM1,DISABLE ); //使能定时器1
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寄存器
}
void TIM1_CC_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_CC1)SET) //处理捕获(CC1IE)中断
{
if((IRflag.globe_IRSave_OPEN_flag1)|| (IRflag.globe_IRSave_CLOSE_flag==1))
{
if(RDATA)//上升沿捕获
{
Dval=TIM_GetCapture1(TIM1);//读取CCR1也可以清CC1IF标志位
TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
TIM_SetCounter(TIM1,0); //清空定时器值
IRred.globe_IRBuf[IRred.globe_datalength] = Dval;
IRred.globe_datalength ++;
if(IRred.globe_datalength>=MAX_IR_BUF){IRred.globe_datalength=MAX_IR_BUF; }}else //下降沿捕获{Dval=TIM_GetCapture1(TIM1);//读取CCR1也可以清CC1IF标志位TIM_OC1PolarityConfig(TIM1,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获TIM_SetCounter(TIM1,0); //清空定时器值IRred.globe_IRBuf[IRred.globe_datalength] = Dval;IRred.globe_datalength ++;if (0 == IRflag.globe_Timer7_flag){IRflag.globe_Timer7_flag = 1;TIM_Cmd(TIM7, ENABLE);TIM_SetCounter(TIM7,0);}if(IRred.globe_datalength>=MAX_IR_BUF){IRred.globe_datalength=MAX_IR_BUF; }} }IRred.time10us_cnt = IRred.globe_datalength;
}
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1); //清除中断标志位
}
STM32红外发送和接收相关推荐
- STM32 CAN 发送和接收过滤原理
通过对 CANBUS 协议的理解,我们知道:CAN 总线上的节点接收或发送数据都是以帧为单位的!!!CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制.(其 ...
- STM32串口发送和接收
采用标准库 主控STM32F103C8T6 03代码: #include "main.h" #include "led/led.h" #include &quo ...
- ESP32实现红外遥控 红外发射与接收实现原理
文章目录 一,原理 1.1 概括 1.2,时钟 1.3,认识 item 1.4,发射/接收器 1.5 电路原理图 1.5.1,发射电路 1.5.2 ,接收电路 二,红外发射 2.1 整体的思路 2.2 ...
- STM32 USART串口DMA 接收和发送的源码详解!
硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...
- NXP JN5169 使用红外发送 / 接收
NXP JN5169 使用红外发送 / 接收 一.红外发送 1.红外发射二极管原理图 2.JN5169 发射端代码 3.STC15W408AS 接收端代码 二.红外接收 一.红外发送 1.红外发射二极 ...
- 【单片记笔记】基于STM32F103的NEC红外发送接收使用同一个定时器的一体设计
红外接收头很常见,具体就不细说了,这里记录重点: NEC的特征 1:使用38 kHz 载波频率 2:引导码间隔是9 ms + 4.5 ms 3:使用16 位客户代码 4:使用8 位数据代码和8 位取反 ...
- STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化
STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...
- STM32之USART:RXD和TXD管脚互换、接收和发送的电平极性反转、支持数据高位与低位反序发送或接收
1:支持RXD和TXD管脚互换 在外接RS232芯片将RXD和TXD两根线接反,如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需 ...
- 串口接收标志位语句_如何获取串口的发送和接收的标志位?
我用C#写了一个小的串口调试软件,并在51的板子上调试成功了,但是换到STM32F103上不行了,由于刚学STM32,还很不熟悉,所以还请各位能否告诉我如何获取串口的发送和接收的标志位.或是帮我把下面 ...
最新文章
- json数组 js html标签,js定义json对象数组 json 数组也是数组 //
- ruby gsub gsub! chomp chomp! 以及所有类似函数用法及区别
- Python第四章__装饰器、迭代器
- 正则表达式---------常用字符及其功能
- LeetCode 887. Super Egg Drop
- 2017.3.13 反素数ant 失败总结
- Consider renaming one of the beans or enabling overriding by setting
- [译转]深入理解LayoutInflater.inflate()
- CS231n-assignment1详解
- python 会议室预约系统解决方案_快思聪FUSION会议预约系统
- LabVIEW进制转换总结
- Mentohust 编译安装方法 (2022)
- 计算机应用英语app,学英语必备的9款APP,学生党都在用
- js利用数组创建图片对象
- 出海竞争加剧,全球头部秀场直播平台LiveMe如何应对新挑战?
- ARM GIC (二)GICv3 中断安全态、分组及编程模型
- 外接显示器屏幕亮度调到最低还是太亮
- usermode linux网络空间,(RHCE笔记)linux基础之三 用户、组及权限
- 梦幻西游手游服务器维护时间表,梦幻西游手游4月17日维护更新公告
- CDH6 安装 Apache atlas
热门文章
- POI 解析Excel,以及引用公式、计算公式的正常解析
- WP出现“无法登陆后台连接已重置”的原因及解决方法
- solidworks安装问题:安装管理程序无法在此注册表位置生成注册表项: HKLM\Software\Wow6432Node\SolidWorks
- MySQL的数据管理
- psd文件一键瘦身脚本使用详细步骤
- 计算机组成符号,计算机组成原理 符号
- 关于百度和Google的中文搜索
- 模拟QQ聊天——采用TCP协议的C/S架构实现
- 头文件cstring、string、string.h的区别
- 【C语言】用函数实现求两个自然数的最大公约数