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红外发送和接收相关推荐

  1. STM32 CAN 发送和接收过滤原理

    通过对 CANBUS 协议的理解,我们知道:CAN 总线上的节点接收或发送数据都是以帧为单位的!!!CAN 协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制.(其 ...

  2. STM32串口发送和接收

    采用标准库 主控STM32F103C8T6 03代码: #include "main.h" #include "led/led.h" #include &quo ...

  3. ESP32实现红外遥控 红外发射与接收实现原理

    文章目录 一,原理 1.1 概括 1.2,时钟 1.3,认识 item 1.4,发射/接收器 1.5 电路原理图 1.5.1,发射电路 1.5.2 ,接收电路 二,红外发射 2.1 整体的思路 2.2 ...

  4. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  5. NXP JN5169 使用红外发送 / 接收

    NXP JN5169 使用红外发送 / 接收 一.红外发送 1.红外发射二极管原理图 2.JN5169 发射端代码 3.STC15W408AS 接收端代码 二.红外接收 一.红外发送 1.红外发射二极 ...

  6. 【单片记笔记】基于STM32F103的NEC红外发送接收使用同一个定时器的一体设计

    红外接收头很常见,具体就不细说了,这里记录重点: NEC的特征 1:使用38 kHz 载波频率 2:引导码间隔是9 ms + 4.5 ms 3:使用16 位客户代码 4:使用8 位数据代码和8 位取反 ...

  7. STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

    STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...

  8. STM32之USART:RXD和TXD管脚互换、接收和发送的电平极性反转、支持数据高位与低位反序发送或接收

    1:支持RXD和TXD管脚互换 在外接RS232芯片将RXD和TXD两根线接反,如果大家知道USART的TXD和RXD管脚可以互换,那么在连接外设RS232芯片时,如果发生错误,就不必再修改硬件,只需 ...

  9. 串口接收标志位语句_如何获取串口的发送和接收的标志位?

    我用C#写了一个小的串口调试软件,并在51的板子上调试成功了,但是换到STM32F103上不行了,由于刚学STM32,还很不熟悉,所以还请各位能否告诉我如何获取串口的发送和接收的标志位.或是帮我把下面 ...

最新文章

  1. json数组 js html标签,js定义json对象数组 json 数组也是数组 //
  2. ruby gsub gsub! chomp chomp! 以及所有类似函数用法及区别
  3. Python第四章__装饰器、迭代器
  4. 正则表达式---------常用字符及其功能
  5. LeetCode 887. Super Egg Drop
  6. 2017.3.13 反素数ant 失败总结
  7. Consider renaming one of the beans or enabling overriding by setting
  8. [译转]深入理解LayoutInflater.inflate()
  9. CS231n-assignment1详解
  10. python 会议室预约系统解决方案_快思聪FUSION会议预约系统
  11. LabVIEW进制转换总结
  12. Mentohust 编译安装方法 (2022)
  13. 计算机应用英语app,学英语必备的9款APP,学生党都在用
  14. js利用数组创建图片对象
  15. 出海竞争加剧,全球头部秀场直播平台LiveMe如何应对新挑战?
  16. ARM GIC (二)GICv3 中断安全态、分组及编程模型
  17. 外接显示器屏幕亮度调到最低还是太亮
  18. usermode linux网络空间,(RHCE笔记)linux基础之三 用户、组及权限
  19. 梦幻西游手游服务器维护时间表,梦幻西游手游4月17日维护更新公告
  20. CDH6 安装 Apache atlas

热门文章

  1. POI 解析Excel,以及引用公式、计算公式的正常解析
  2. WP出现“无法登陆后台连接已重置”的原因及解决方法
  3. solidworks安装问题:安装管理程序无法在此注册表位置生成注册表项: HKLM\Software\Wow6432Node\SolidWorks
  4. MySQL的数据管理
  5. psd文件一键瘦身脚本使用详细步骤
  6. 计算机组成符号,计算机组成原理 符号
  7. 关于百度和Google的中文搜索
  8. 模拟QQ聊天——采用TCP协议的C/S架构实现
  9. 头文件cstring、string、string.h的区别
  10. 【C语言】用函数实现求两个自然数的最大公约数