当前位置: 首页 > news >正文

住建城乡建设部网站网站建设空间主机的选择

住建城乡建设部网站,网站建设空间主机的选择,自考免费自学网站,免费个人网站平台目录 红外原理 数据码 引导码 连发码 配置捕获引脚 使能引脚时钟 配置定时器 使能定时器时钟 配置输入捕获 中断优先级分组 配置定时器4中断 定时器中断使能 使能定时器 重写定时器中断服务函数 清空定时器中断标志位 例程 例程说明 main.h main.c HongWai…

目录

红外原理

数据码

引导码

连发码

配置捕获引脚

使能引脚时钟

配置定时器

使能定时器时钟

配置输入捕获

中断优先级分组

配置定时器4中断

定时器中断使能

使能定时器

重写定时器中断服务函数

清空定时器中断标志位

例程

例程说明

main.h

main.c

HongWai.h

HongWai.c

红外原理

红外信号的组成:引导码、地址码、地址反码、键码、键反码、连发码(可有可无)

  • 红色:引导码

  • 橙色:地址码

  • 蓝色:地址反码

  • 绿色:键码

  • 白色:键反码

  • 灰色:连发码

数据码

  • 560us的低电平+560us的高电平=数据“0”

  • 560us的低电平+1690us的高电平=数据“1”

引导码

9ms的低电平+4.5ms的高电平=引导码

连发码

9ms的低电平+2.25ms的高电平=连发码

配置捕获引脚

红外接收继续自己搭建电路,红外接收头的输出引脚必须要接到芯片的时钟引脚上

  1. 配置引脚号

  2. 配置引脚速度

  3. 配置引脚的模式

  4. 引脚初始化

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//初始化引脚
GPIO_InitTypeDef GPIO;//配置PB9引脚
GPIO.GPIO_Mode=GPIO_Mode_IPD;//下拉输入
GPIO.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO);//初始化PA0引脚

使能引脚时钟

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB时钟

配置定时器

根据对应的引脚定时器配置对应的定时器。

  1. 配置第一次时钟分频

  2. 配置计数模式

  3. 配置重载值

  4. 配置预分频系数

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);TIM_TimeBaseInitTypeDef DSQ_4;//定时器4//定时器4配置
DSQ_4.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频
DSQ_4.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式
DSQ_4.TIM_Period=10000;//重载值,10ms溢出
DSQ_4.TIM_Prescaler=72-1;//预分频系数,不分频
TIM_TimeBaseInit(TIM4,&DSQ_4);

使能定时器时钟

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器4时钟

配置输入捕获

  1. 配置捕获通道

  2. 配置输入滤波器

  3. 配置捕获方式

  4. 配置输入/捕获预分频器

  5. 配置捕获/比较选择,映射关系?

void TIM_ICInit(TIM_TypeDef *TIMx,TIM_ICInitTypeDef *TIM_ICInitStruct) ;TIM_ICInitTypeDef BuHuo4;//捕获4//PB9 -> TIM4_CH4,输入捕获配置
BuHuo4.TIM_Channel=TIM_Channel_4;//通道4h
BuHuo4.TIM_ICFilter=0x03;//IC1F=0111 配置输入滤波器 8个事件后产生一个输出跳变
BuHuo4.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获
BuHuo4.TIM_ICPrescaler=TIM_ICPSC_DIV1;//输入/捕获1预分频器,无预分频器
BuHuo4.TIM_ICSelection=TIM_ICSelection_DirectTI;//捕获/比较1选择,IC1映射到TI1上
TIM_ICInit(TIM4,&BuHuo4);

中断优先级分组

/*
zu_bie:NVIC_PriorityGroup_0NVIC_PriorityGroup_1NVIC_PriorityGroup_2NVIC_PriorityGroup_3NVIC_PriorityGroup_4
*/
void NVIC_PriorityGroupConfig(zu_bie);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组

配置定时器4中断

  1. 配置中断源

  2. 配置抢占优先级

  3. 配置子优先级

  4. 定时器3中断源使能

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//初始化中断NVIC_InitTypeDef ZhongDuan4;//中断4//定时器4中断配置
ZhongDuan4.NVIC_IRQChannel=TIM4_IRQn;//定时器4中断
ZhongDuan4.NVIC_IRQChannelCmd=ENABLE;
ZhongDuan4.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
ZhongDuan4.NVIC_IRQChannelSubPriority=1;//子优先级
NVIC_Init(&ZhongDuan4);

定时器中断使能

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC4IE捕获中断

使能定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);TIM_Cmd(TIM4,ENABLE);//使能定时器4

重写定时器中断服务函数

        注意:中断服务函数的函数已经固定,重新定义相同名字的函数即可,在定义好的函数里写中断的操作,哪个串口发生中断就得重定义哪个串口中断的函数

void TIM4_IRQHandler(){//定时器4中断服务函数if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){//获取定时器5溢出的中断标志位if(YinDaoMa_flag){//已经捕获到引导码if(DSQ_YiChu_CiShu<=13){//计算溢出次数DSQ_YiChu_CiShu++;}else{YinDaoMa_flag=0;//引导码清零,为下次捕获红外信号做准备BuHuo_flag=1;//记为成功捕获一次红外信号}}}if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET){//发生捕获事件if(BuHuo_ShangShengYan_flag==0){//第一次捕获到上升沿TIM_OC4PolarityConfig(TIM4,TIM_OCPolarity_Low);//配置定时器4通道4的捕获极性,配置为下降沿捕获TIM_SetCounter(TIM4,0);//设置定时器4从0开始计数BuHuo_ShangShengYan_flag=1;//成功捕获到上升沿}else{//捕获到下降沿GaoDianPing_Time=TIM_GetCapture4(TIM4);//获取定时器4通道4的值,高电平的持续时间TIM_OC4PolarityConfig(TIM4,TIM_OCPolarity_High);//配置定时器4通道4的捕获极性,配置为上升沿捕获if(BuHuo_ShangShengYan_flag){//完成一次高电平捕获if(GaoDianPing_Time>4200&&GaoDianPing_Time<4700){//4500,接收到引导码YinDaoMa_flag=1;}else if(YinDaoMa_flag){//接收到引导码后,进行对数据处理if(GaoDianPing_Time>300&&GaoDianPing_Time<800){//560us,接收到数据0data=data<<1;data=data|0;}else if(GaoDianPing_Time>1400&&GaoDianPing_Time<1800){//1680us,接收到数据1data=data<<1;data=data|1;}else if(GaoDianPing_Time>2200&&GaoDianPing_Time<2600){//2500us,接收到连发码YinDaoMa_flag=0;//引导码清零,为下次捕获红外信号做准备BuHuo_flag=1;//记为成功捕获一次红外信号}}BuHuo_ShangShengYan_flag=0;//清零,为下一次捕获上升沿做准备}}}TIM_ClearITPendingBit(TIM4,TIM_IT_CC4|TIM_IT_Update);//清除中断标志位
}

清空定时器中断标志位

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);TIM_ClearITPendingBit(TIM4,TIM_IT_CC4|TIM_IT_Update);//清除中断标志位

例程

例程说明

捕获红外信号,并进行解码

main.h

#ifndef _MAIN_H_
#define _MAIN_H_#include "stm32f10x.h"                  // Device header
#include <string.h>
#include <stdio.h>#include "delay.h"
#include "usart.h"
#include "HongWai.h"#endif

main.c


#include "main.h"u8 BuHuo_flag=0;//捕获成功标志位,0:未捕获一次成功;1:捕获1次成功
u8 BuHuo_ShangShengYan_flag=0;//捕获上升沿标志位,0:未捕获到上升沿;1:捕获到上升沿
u8 DSQ_YiChu_CiShu=0;//定时器溢出次数
u16 GaoDianPing_Time=0;//高电平时间
u8 YinDaoMa_flag=0;//引导码标志位,0:没有接收到引导码;1:接收到引导码
u32 data=0;//红外数据int main() {u8 DiZhiMa=0;//地址码u8 DiZhiMa_FanMa=0;//地址码反码u8 JianMa=0;//键码u8 JianMa_FanMa=0;//键码反码delay_init();HongWai_Init();uart_init(115200);printf("程序开始运行!!!\n");while(1){if(BuHuo_flag){//捕获一次成功DiZhiMa=(u8)(data>>24);DiZhiMa_FanMa=(u8)((data>>16)&0xff);JianMa=(u8)(data>>8);JianMa_FanMa=(u8)data;printf("data:%d  ",data);printf("地址码:%d  ",DiZhiMa);printf("地址码反码:%d  ",DiZhiMa_FanMa);printf("键码:%d  ",JianMa);printf("键码反码:%d\n",JianMa_FanMa);if(DiZhiMa==(u8)(~DiZhiMa_FanMa)){printf("地址码正确!地址码为:%d\n",DiZhiMa);}else{printf("地址码错误!\n");}if(JianMa==(u8)(~JianMa_FanMa)){printf("键码正确!键码为:%d\n",JianMa);}else{printf("键码错误!\n");}BuHuo_flag=0;//开启下一次捕获data=0;//红外数据清零BuHuo_ShangShengYan_flag=0;DSQ_YiChu_CiShu=0;YinDaoMa_flag=0;}}
}void TIM4_IRQHandler(){//定时器4中断服务函数if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET){//获取定时器5溢出的中断标志位if(YinDaoMa_flag){//已经捕获到引导码if(DSQ_YiChu_CiShu<=13){//计算溢出次数DSQ_YiChu_CiShu++;}else{YinDaoMa_flag=0;//引导码清零,为下次捕获红外信号做准备BuHuo_flag=1;//记为成功捕获一次红外信号}}}if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET){//发生捕获事件if(BuHuo_ShangShengYan_flag==0){//第一次捕获到上升沿TIM_OC4PolarityConfig(TIM4,TIM_OCPolarity_Low);//配置定时器4通道4的捕获极性,配置为下降沿捕获TIM_SetCounter(TIM4,0);//设置定时器4从0开始计数BuHuo_ShangShengYan_flag=1;//成功捕获到上升沿}else{//捕获到下降沿GaoDianPing_Time=TIM_GetCapture4(TIM4);//获取定时器4通道4的值,高电平的持续时间TIM_OC4PolarityConfig(TIM4,TIM_OCPolarity_High);//配置定时器4通道4的捕获极性,配置为上升沿捕获if(BuHuo_ShangShengYan_flag){//完成一次高电平捕获if(GaoDianPing_Time>4200&&GaoDianPing_Time<4700){//4500,接收到引导码YinDaoMa_flag=1;}else if(YinDaoMa_flag){//接收到引导码后,进行对数据处理if(GaoDianPing_Time>300&&GaoDianPing_Time<800){//560us,接收到数据0data=data<<1;data=data|0;}else if(GaoDianPing_Time>1400&&GaoDianPing_Time<1800){//1680us,接收到数据1data=data<<1;data=data|1;}else if(GaoDianPing_Time>2200&&GaoDianPing_Time<2600){//2500us,接收到连发码YinDaoMa_flag=0;//引导码清零,为下次捕获红外信号做准备BuHuo_flag=1;//记为成功捕获一次红外信号}}BuHuo_ShangShengYan_flag=0;//清零,为下一次捕获上升沿做准备}}}TIM_ClearITPendingBit(TIM4,TIM_IT_CC4|TIM_IT_Update);//清除中断标志位
}

HongWai.h

#ifndef __HONGWAI_H_
#define __HONGWAI_H_#include "stdio.h"
#include "sys.h"void HongWai_Init();//红外初始化#endif

HongWai.c

//PB9 -> TIM4_CH4#include "HongWai.h"void HongWai_Init(){TIM_TimeBaseInitTypeDef DSQ_4;//定时器4TIM_ICInitTypeDef BuHuo4;//捕获4NVIC_InitTypeDef ZhongDuan4;//中断4GPIO_InitTypeDef GPIO;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器4时钟NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB时钟//定时器4配置DSQ_4.TIM_ClockDivision=TIM_CKD_DIV1;//第一次时钟分频,不分频DSQ_4.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数模式DSQ_4.TIM_Period=10000;//重载值,10ms溢出DSQ_4.TIM_Prescaler=72-1;//预分频系数,不分频TIM_TimeBaseInit(TIM4,&DSQ_4);//PB9 -> TIM4_CH4,输入捕获配置BuHuo4.TIM_Channel=TIM_Channel_4;//通道4BuHuo4.TIM_ICFilter=0x03;//IC1F=0111 配置输入滤波器 8个事件后产生一个输出跳变BuHuo4.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕获BuHuo4.TIM_ICPrescaler=TIM_ICPSC_DIV1;//输入/捕获1预分频器,无预分频器BuHuo4.TIM_ICSelection=TIM_ICSelection_DirectTI;//捕获/比较1选择,IC1映射到TI1上TIM_ICInit(TIM4,&BuHuo4);TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC4IE捕获中断//定时器4中断配置ZhongDuan4.NVIC_IRQChannel=TIM4_IRQn;//定时器4中断ZhongDuan4.NVIC_IRQChannelCmd=ENABLE;ZhongDuan4.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级ZhongDuan4.NVIC_IRQChannelSubPriority=1;//子优先级NVIC_Init(&ZhongDuan4);TIM_Cmd(TIM4,ENABLE);//使能定时器4//配置PB9引脚GPIO.GPIO_Mode=GPIO_Mode_IPD;//下拉输入GPIO.GPIO_Pin=GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO);//初始化PA0引脚
}
http://www.dtcms.com/a/478952.html

相关文章:

  • 阿里美团京东从“三国杀”到“双雄会”:本地生活无限战争的终局猜想
  • wpf之Interaction.Triggers
  • 网站建设新的技术方案企业网站建设东莞
  • SSM管理系统c4ki9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 珠海正规网站制作排名费用多少无锡阿凡达建设
  • asp网站建设 aws西安高校定制网站建设公司推荐
  • PyTorch 实现 MNIST 手写数字识别完整流程(含数据处理、模型构建与训练可视化)
  • 【Java并发编程】概念与核心问题、线程核心、并发控制、线程池、并发容器、并发问题
  • C++模板编程实战记录:SFINAE核心技术深度掌握
  • Spring Boot项目的常用依赖有哪些?
  • 保姆级教程 | ASE学习过程记录分析
  • 网站如何留言免费网站seo排名优化
  • 运维视角:SpringBootWeb框架全解析
  • Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
  • 【组队学习】Post-training-of-LLMs TASK01
  • 涉县网站网络推广培训哪里好
  • Jenkins自动化配置--CICD流水线
  • 网站建设etw深圳租赁住房和建设局网站
  • 人力网站建设的建议wordpress加百度广告代码出问题
  • Mozilla 项目
  • 今日行情明日机会——20251013
  • 关于解决js中MediaRecorder录制的webm视频没有进度条的问题
  • 红日靶场(二)学习过程详细记录
  • 【多线程】门栓/闭锁(Latch/CountDownLatch)
  • [1-02-02].[第01章:HTML + CSS
  • 手机必备网站软件技术专科生的出路
  • 网站空间续费一年多少钱怎么弄推广广告
  • 一个做任务的网站如何绑定域名wordpress
  • 当ubuntu 系统的IP地址修改之后,gitlab服务应该如何修改?
  • 怎么做自己的公司网站本地服务器 wordpress