[其他ST产品] 有没有STM32F103利用定时器实现曼切斯特解码读ID卡的程序思路?

[复制链接]
 楼主| yangjiaxu 发表于 2024-6-29 15:15 | 显示全部楼层 |阅读模式
请问,有没有STM32F103利用定时器实现曼切斯特解码读ID卡的程序思路?
稳稳の幸福 发表于 2024-6-30 20:03 | 显示全部楼层
不会啊,慢切斯特是什么
稳稳の幸福 发表于 2024-6-30 20:04 | 显示全部楼层
稳稳の幸福 发表于 2024-6-30 20:04 | 显示全部楼层
稳稳の幸福 发表于 2024-6-30 20:05 | 显示全部楼层
  1. //定时器配置

  2. void RFIDTim_init(void)
  3. {
  4.     TIM_TimeBaseInitTypeDef TIM_TimeBaseSt;

  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  6.     TIM_DeInit(RFID_TIM);

  7.     TIM_TimeBaseSt.TIM_Prescaler = 72-1;    //
  8.     TIM_TimeBaseSt.TIM_CounterMode = TIM_CounterMode_Up;
  9.     TIM_TimeBaseSt.TIM_Period = 1000;
  10.     TIM_TimeBaseSt.TIM_ClockDivision =TIM_CKD_DIV1;
  11.     TIM_TimeBaseInit(RFID_TIM, &TIM_TimeBaseSt);
  12.     TIM_Cmd(RFID_TIM, ENABLE);
  13.     DEBUG("time init ok \n");
  14.    
  15. }

  16. //IO及中断配置

  17. void RFID_Exti_Init(void){
  18.     EXTI_InitTypeDef   EXTI_InitStructure;
  19.     GPIO_InitTypeDef   GPIO_InitStructure;
  20.     NVIC_InitTypeDef   NVIC_InitStructure;

  21.     /* Enable GPIOA clock */
  22.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  23.     /* Enable AFIO clock */
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


  25.     /* Configure PA.00 pin as input floating */
  26.     GPIO_InitStructure.GPIO_Pin = OUT_PIN;
  27.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  28.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  29.     GPIO_Init(OUT_PORT, &GPIO_InitStructure);

  30.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);//将PA7挂在中断源上

  31.     /* Configure EXTI0 line */
  32.     EXTI_InitStructure.EXTI_Line = EXTI_Line7;
  33.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  34.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  35.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  36.     EXTI_Init(&EXTI_InitStructure);
  37.     EXTI_ClearITPendingBit(EXTI_Line7);            
  38.    
  39.     /* Enable and set EXTI0 Interrupt to the lowest priority */
  40.     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  41.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
  42.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
  43.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  44.     NVIC_Init(&NVIC_InitStructure);

  45. }


  46. //RFID初始化

  47. void RFIDInit(void)
  48. {
  49.     DEBUG("Start Init EM4095 RFID Module\r\n");
  50.                
  51.     RFIDTim_init();//定时器配置
  52.    
  53.     RFID_Exti_Init();//IO初始化及中断配置

  54.     DEBUG("finish init EM4095 RFID Module\r\n");

  55. }

  56. 中断处理函数

  57. // Interrupt bei Flankenwechsel
  58. void EXTI9_5_IRQHandler(void)
  59. {
  60.     static u8 N = 0;

  61.     if(EXTI_GetITStatus(EXTI_Line7) != RESET)
  62.     {
  63.         if(gFlag == 0x00)
  64.         {
  65.             TT_Buffer[N]= TIM_GetCounter(RFID_TIM); //数组记录计时器计时时间
  66.             TT_voltage[N]=GPIO_ReadInputDataBit(OUT_PORT,OUT_PIN);//数组保存此时IO电平
  67.             TIM_SetCounter(RFID_TIM, 0);//计时器清0
  68.             N++;            
  69.             if(N== 1)//cym
  70.             {
  71.                gFlag = 0xFF;
  72.             }
  73.          }
  74.         EXTI_ClearITPendingBit(EXTI_Line7);
  75.     }
  76. }

  77. //数据解析

  78. unsigned char Decode(void)
  79. {
  80.     u16  min,max,avg,i,n;

  81.     min = 0xFF;max = 0xFF;avg = 0xFF;i = 0xFF;n = 0xFF;

  82.     //-------------------- STEP1: 找出 [平均值]
  83.     for(i=1; i<256; i++) //---- 从1开始! 0字节是不可靠数据
  84.     {
  85.         if(TT_Buffer[i]<min)
  86.         {
  87.             min = TT_Buffer[i];
  88.         }
  89.         if(TT_Buffer[i]>max)
  90.         {
  91.             max = TT_Buffer[i];
  92.         }
  93.     }

  94.     //数据过滤
  95.     if(min<100||max>1000)
  96.     {
  97.         //DEBUG("\r\n min: %d max: %d ; |舍弃 ! | \r\n",min,max);
  98.         return 0;
  99.     }

  100.     avg=((min+max)/2);//-----平均值
  101.     n = 0;

  102.     //-------------------- STEP2: 提取原始数据
  103.        for(i=1; i<256; i++) //---- 必须从1开始! 0字节是不可靠数据
  104.     {
  105.         if (TT_Buffer[i]<avg )//(abs((int)TT_Buffer[i] - 245)<=70)
  106.         {
  107.             if (TT_voltage[i]==1)
  108.                 Bin_Buffer[n++]=0;
  109.             else
  110.                 Bin_Buffer[n++]=1;
  111.         }
  112.         else if (TT_Buffer[i]>avg )//(abs((int)TT_Buffer[i] - 485)<=70)
  113.         {
  114.             if (TT_voltage[i]==1)
  115.             {
  116.                 Bin_Buffer[n++]=0;
  117.                 Bin_Buffer[n++]=0;
  118.             }
  119.             else
  120.             {
  121.                 Bin_Buffer[n++]=1;
  122.                 Bin_Buffer[n++]=1;
  123.             }
  124.         }
  125.     }

  126.     //-------------------- STEP3: 查找RFID头标志(9个1)

  127.     i = n-128;  //------- 有效起始点!
  128.     while(i--)
  129.     {
  130.         if(FindHeader(i))
  131.         {
  132.             if(FindID(i))
  133.             {
  134.                 return 1;
  135.             }
  136.         }
  137.     }

  138.     return 0;
  139. }

  140. /*=================== 查找RFID 头标志 9个1
  141. //--- 匹配返回:1
  142. //--- 无效返回:0*/
  143. u8 FindHeader(u16 index)
  144. {
  145.     u8 n;

  146.     if((Bin_Buffer[index]==0)&&(Bin_Buffer[index+1]==1))//cym 1/0
  147.     {
  148.         index++;
  149.         index++;
  150.     }
  151.     else
  152.     {
  153.         return (0);
  154.     }

  155.     for(n=0; n<9; n++)
  156.     {
  157.         if((Bin_Buffer[index]==1)&&(Bin_Buffer[index+1]==0))//cym 0/1
  158.         {
  159.             index = index+2;
  160.         }
  161.         else
  162.         {
  163.             return (0);
  164.         }
  165.     }

  166.     return (1);
  167. }

  168. 将头后的数据解析为实际的卡号数据。
  169. u8 FindID(u16 i)
  170. {
  171.     u8 n;
  172.     u8 k;
  173.     u8 sum;

  174.     //-------------------- STEP1: 提取RFID有效数据
  175.     if(i)
  176.     {
  177.         for(n=0; n<11; n++)RFID[n] = 0x00; //------ Buffer清零

  178.         i = i+20;  //--- 有效数据流

  179.         for(k=0; k<11; k++)
  180.         {
  181.             for(n=0; n<5; n++)
  182.             {
  183.                 RFID[k] = RFID[k]<<1;

  184.                 if((Bin_Buffer[i]==1)&&(Bin_Buffer[i+1]==0))//cym 0/1
  185.                 {
  186.                     RFID[k] |= 0x01;
  187.                 }
  188.                 i += 2;
  189.             }
  190.         }

  191.     }

  192.     //---------------------------- STEP2: 校对数据

  193.     //---------------------- X 轴校验
  194.     for(k=0; k<10; k++)
  195.     {
  196.         sum = 0;
  197.         if(RFID[k]&0x01)sum++;
  198.         if(RFID[k]&0x02)sum++;
  199.         if(RFID[k]&0x04)sum++;
  200.         if(RFID[k]&0x08)sum++;
  201.         if(RFID[k]&0x10)sum++;

  202.         if(sum%2) //--- 偶校验出错!
  203.         {
  204.             // MessageBox("X 轴校验出错!");
  205.             return 0;
  206.         }
  207.     }

  208.     //------------------- Y 轴校验
  209.     sum = 0;
  210.     for(k=0; k<11; k++)
  211.     {
  212.         sum ^= RFID[k];
  213.     }

  214.     if(sum&0x1E) //--- 偶校验出错!
  215.     {
  216.         //MessageBox("Y 轴校验出错!");
  217.         return 0;
  218.     }

  219.     //------------------ STEP3: 获取RFID卡号(4个字节32位)
  220.     for(k=0; k<10; k++)
  221.     {
  222.         RFID[k] = RFID[k]>>1; //---去掉校验值
  223.     }

  224.     Vendor  = 0;
  225.     CardIDH = 0;
  226.     CardIDL = 0;

  227.     k = RFID[0]<<4;
  228.     Vendor = k|RFID[1]; //--- 卡版本或供应商信息

  229.     k = RFID[2]<<4;
  230.     k |= RFID[3];
  231.     CardIDH |= k<<8;

  232.     k = RFID[4]<<4;
  233.     k |= RFID[5];
  234.     CardIDH |= k;

  235.     k = RFID[6]<<4;
  236.     k |= RFID[7];
  237.     CardIDL |= k<<8;

  238.     k = RFID[8]<<4;
  239.     k |= RFID[9];
  240.     CardIDL |= k;

  241.     //------------------ STEP4: 显示解码结果
  242.     return 1;
  243. }
4c1l 发表于 2024-8-31 22:59 | 显示全部楼层
需要配置STM32F103的定时器来生成定时中断,以便能够准确地采样输入信号。定时器的配置取决于曼切斯特信号的比特率。
4c1l 发表于 2024-8-31 22:59 | 显示全部楼层
曼切斯特编码是一种用于同步数据传输的编码方式,它通过信号的跳变来表示数据的“0”和“1”。
LOVEEVER 发表于 2024-9-13 17:17 | 显示全部楼层

深入学习一下相关程序编码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:嵌入式技术专家
简介:擅长电路设计、物联网产品开发、射频产品开发,喜欢打篮球,技术交流,欢迎各位来聊~

783

主题

3316

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部