找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1662|回复: 5
收起左侧

STM32 TIM14输入捕获设置不对请求帮助

[复制链接]
ID:311400 发表于 2021-9-2 12:22 | 显示全部楼层 |阅读模式
  1. #include "IR.h"
  2. //#include "Application.h"
  3. //#include "CONFIG.h"
  4. //#include "peripheral.h"

  5. extern void KeyAction(u8 code);

  6. const u8 IrCodeMap[][2] = {  //红外键码到标准PC键码的映射表

  7.     {0xF2, '1'}, {0x22, '2'}, {0x0A, '3'},         //'1'->'1'  '2'->'2'   '3'->'3'
  8.     {0x70, '4'}, {0xC8, '5'}, {0x48, '6'},  //'4'->'4'  '5'->'5'   '6'->'6'
  9.     {0xA8, '7'}, {0xCA, '8'}, {0xA2, '9'},         //'7'->'7'  '8'->'8'   '9'->'9'
  10.         {0x8A, '*'}, {0x28,'0'} , {0x18,'#'},         //'*'->'7'  '0'->'0'   '#'->'#'
  11.                                   {0xAA, 0x26} ,                  
  12.         {0x08, 0X25}, {0x32, 0x0D} , {0xEA, 0x27},                  
  13.                                   {0x02, 0x28},
  14. };   

  15. /*******************************************************************************************
  16. Description :
  17. //红外遥控初始化
  18. //设置IO以及定时器3的输入捕获 连接到PA6
  19. *******************************************************************************************/
  20. void Remote_Init(void)                              
  21. {  
  22.         NVIC_InitTypeDef NVIC_InitStructure;
  23.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  24.         TIM_ICInitTypeDef  TIM_ICInitStructure;
  25. #if 0
  26.         GPIO_InitTypeDef GPIO_InitStructure;
  27.         /* GPIOC Periph clock enable */
  28.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  29.         //红外上拉输入 TIM3_CH1 PA6
  30.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);
  31.         GPIO_InitStructure.GPIO_Pin = IR_PINS;
  32.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  33.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  34.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  35.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  36.         GPIO_Init(IR_PORT, &GPIO_InitStructure);
  37. #endif
  38.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);        //TIM3 时钟使能
  39.                                                          
  40.         TIM_TimeBaseStructure.TIM_Period = 10000; //设定计数器自动重装值 最大10ms溢出  
  41.         TIM_TimeBaseStructure.TIM_Prescaler =(48-1);         //预分频器,1M的计数频率,1us加1.           
  42.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  43.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

  44.         TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx

  45.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;  // 选择输入端 IC2映射到TI5上
  46.         TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  47.         TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  48.         TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  49.         TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
  50.         TIM_ICInit(TIM14, &TIM_ICInitStructure);//初始化定时器输入捕获通道

  51.         TIM_Cmd(TIM14,ENABLE );         //使能定时器3

  52.         /* Enable the TIM2 global Interrupt */
  53.         NVIC_InitStructure.NVIC_IRQChannel = TIM14_IRQn;
  54.         NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  55.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  56.         NVIC_Init(&NVIC_InitStructure);

  57.         TIM_ITConfig( TIM14,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断        

  58. }


  59. //遥控器接收状态
  60. //[7]:收到了引导码标志
  61. //[6]:得到了一个按键的所有信息
  62. //[5]:保留        
  63. //[4]:标记上升沿是否已经被捕获                                                                  
  64. //[3:0]:溢出计时器
  65. u8         RmtSta=0;                    
  66. u16 Dval;                //下降沿时计数器的值
  67. u32 RmtRec=0;        //红外接收到的数据                              
  68. u8  RmtCnt=0;        //按键按下的次数         
  69. //定时器5中断服务程序         
  70. void TIM14_IRQHandler(void)
  71. {                              
  72.     if(TIM_GetITStatus(TIM14,TIM_IT_Update)!=RESET)
  73.         {
  74.                 if(RmtSta&0x80)//上次有数据被接收到了
  75.                 {        
  76.                         RmtSta&=~0X10;                                                //取消上升沿已经被捕获标记
  77.                         if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
  78.                         if((RmtSta&0X0F)<14)RmtSta++;
  79.                         else
  80.                         {
  81.                                 RmtSta&=~(1<<7);//清空引导标识
  82.                                 RmtSta&=0XF0;        //清空计数器        
  83.                         }                                                                    
  84.                 }                                                            
  85.         }
  86.          if(TIM_GetITStatus(TIM14,TIM_IT_CC1)!=RESET)
  87.         {         
  88.                 if(READ_IR)//上升沿捕获
  89.                 {

  90.                         TIM_OC1PolarityConfig(TIM14,TIM_ICPolarity_Falling);                //CC1P=1 设置为下降沿捕获                                
  91.                     TIM_SetCounter(TIM14,0);                   //清空定时器值
  92.                         RmtSta|=0X10;                                        //标记上升沿已经被捕获
  93.                 }
  94.                 else //下降沿捕获
  95.                 {                        
  96.                         Dval=TIM_GetCapture1(TIM14);//读取CCR1也可以清CC1IF标志位
  97.                         TIM_OC1PolarityConfig(TIM14,TIM_ICPolarity_Rising); //CC4P=0        设置为上升沿捕获
  98.                         
  99.                         if(RmtSta&0X10)                                        //完成一次高电平捕获
  100.                         {
  101.                                 if(RmtSta&0X80)//接收到了引导码
  102.                                 {
  103.                                        
  104.                                         if(Dval>300&&Dval<800)                        //560为标准值,560us
  105.                                         {
  106.                                                 RmtRec<<=1;        //左移一位.
  107.                                                 RmtRec|=0;        //接收到0           
  108.                                         }
  109.                                         else if(Dval>1400&&Dval<1800)        //1680为标准值,1680us
  110.                                         {
  111.                                                 RmtRec<<=1;        //左移一位.
  112.                                                 RmtRec|=1;        //接收到1
  113.                                         }
  114.                                         else if(Dval>2200&&Dval<2600)        //得到按键键值增加的信息 2500为标准值2.5ms
  115.                                         {
  116.                                                 RmtCnt++;                 //按键次数增加1次
  117.                                                 RmtSta&=0XF0;        //清空计时器               
  118.                                         }
  119.                                 }
  120.                                 else if(Dval>4200&&Dval<4700)                //4500为标准值4.5ms
  121.                                 {
  122.                                         RmtSta|=1<<7;        //标记成功接收到了引导码
  123.                                         RmtCnt=0;                //清除按键次数计数器
  124.                                 }                                                
  125.                         }
  126.                         RmtSta&=~(1<<4);
  127.                 }                                                                                                            
  128.         }
  129. TIM_ClearFlag(TIM14,TIM_IT_Update|TIM_IT_CC1);            
  130. }

  131. /* 红外接收驱动,检测接收到的键码,调度相应动作函数 */
  132. void RemoteDirver(void)
  133. {
  134.          u8 sta=0;      
  135.     u8 t1,t2,i;  
  136.         if(RmtSta&(1<<6))//得到一个按键的所有信息了
  137.         {
  138.             t1=RmtRec>>24;                        //得到地址码
  139.             t2=(RmtRec>>16)&0xff;        //得到地址反码
  140.              if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
  141.             {
  142.                 t1=RmtRec>>8;
  143.                 t2=RmtRec;         
  144.                 if(t1==(u8)~t2)
  145.                         {
  146.                                 sta=t1;//键值正确
  147.                                 RmtSta&=~(1<<6);//清除接收到有效按键标识
  148.                                 if((RmtCnt==0)||(RmtCnt>5))
  149.                                 {
  150.                                         //清除按键次数计数器
  151.                                         for (i=0; i<sizeof(IrCodeMap)/sizeof(IrCodeMap[0]); i++) //遍历映射表
  152.                                         {
  153.                                                 if (sta == IrCodeMap[i][0])  //在表中找到当前接收的键码后,
  154.                                                 {                                  //用对应的映射码执行函数调度,
  155.                                                         KeyAction(IrCodeMap[i][1]);    //直接调用按键动作函数即可。
  156.                                                         break;
  157.                                                 }
  158.                                         }
  159.                                 }
  160.                         }                 
  161.                 }   
  162.                 if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
  163.                 {
  164.                          RmtSta&=~(1<<6);//清除接收到有效按键标识
  165.                         RmtCnt=0;                //清除按键次数计数器
  166.                 }
  167.         }
  168. }
复制代码
回复

使用道具 举报

ID:311400 发表于 2021-9-2 12:24 | 显示全部楼层
if(TIM_GetITStatus(TIM14,TIM_IT_CC1)!=RESET) { } 进不了
回复

使用道具 举报

ID:311400 发表于 2021-9-2 16:44 | 显示全部楼层
芯片是stm32f030f4p6请教下大家
回复

使用道具 举报

ID:891041 发表于 2021-9-2 19:18 | 显示全部楼层
我不太明白 是要用TIM3还是TIM14  注释也全是TIM3的 却用了TIM14  
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_1);是TIM3的
回复

使用道具 举报

ID:311400 发表于 2021-9-2 20:12 来自手机 | 显示全部楼层
原本就是用Tim3的可以正常使用,但我改为Tim14却用不了,可能是我没改对
回复

使用道具 举报

ID:311400 发表于 2021-9-3 09:20 | 显示全部楼层
abob 发表于 2021-9-2 19:18
我不太明白 是要用TIM3还是TIM14  注释也全是TIM3的 却用了TIM14  
GPIO_PinAFConfig(GPIOA, GPIO_PinSour ...

谢谢。改这里就好了GPIO_PinAFConfig(IR_PORT, GPIO_PinSource4, GPIO_AF_4);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表