打印
[其他ST产品]

有没有STM32F103利用定时器实现曼切斯特解码读ID卡的程序思路?

[复制链接]
596|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问,有没有STM32F103利用定时器实现曼切斯特解码读ID卡的程序思路?

使用特权

评论回复
沙发
稳稳の幸福| | 2024-6-30 20:03 | 只看该作者
不会啊,慢切斯特是什么

使用特权

评论回复
板凳
稳稳の幸福| | 2024-6-30 20:04 | 只看该作者

使用特权

评论回复
地板
稳稳の幸福| | 2024-6-30 20:04 | 只看该作者

使用特权

评论回复
5
稳稳の幸福| | 2024-6-30 20:05 | 只看该作者
//定时器配置

void RFIDTim_init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseSt;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_DeInit(RFID_TIM);

    TIM_TimeBaseSt.TIM_Prescaler = 72-1;    //
    TIM_TimeBaseSt.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseSt.TIM_Period = 1000;
    TIM_TimeBaseSt.TIM_ClockDivision =TIM_CKD_DIV1;
    TIM_TimeBaseInit(RFID_TIM, &TIM_TimeBaseSt);
    TIM_Cmd(RFID_TIM, ENABLE);
    DEBUG("time init ok \n");
   
}

//IO及中断配置

void RFID_Exti_Init(void){
    EXTI_InitTypeDef   EXTI_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;

    /* Enable GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    /* Enable AFIO clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


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

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

    /* Configure EXTI0 line */
    EXTI_InitStructure.EXTI_Line = EXTI_Line7;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    EXTI_ClearITPendingBit(EXTI_Line7);            
   
    /* Enable and set EXTI0 Interrupt to the lowest priority */
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}


//RFID初始化

void RFIDInit(void)
{
    DEBUG("Start Init EM4095 RFID Module\r\n");
               
    RFIDTim_init();//定时器配置
   
    RFID_Exti_Init();//IO初始化及中断配置

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

}

中断处理函数

// Interrupt bei Flankenwechsel
void EXTI9_5_IRQHandler(void)
{
    static u8 N = 0;

    if(EXTI_GetITStatus(EXTI_Line7) != RESET)
    {
        if(gFlag == 0x00)
        {
            TT_Buffer[N]= TIM_GetCounter(RFID_TIM); //数组记录计时器计时时间
            TT_voltage[N]=GPIO_ReadInputDataBit(OUT_PORT,OUT_PIN);//数组保存此时IO电平
            TIM_SetCounter(RFID_TIM, 0);//计时器清0
            N++;            
            if(N== 1)//cym
            {
               gFlag = 0xFF;
            }
         }
        EXTI_ClearITPendingBit(EXTI_Line7);
    }
}

//数据解析

unsigned char Decode(void)
{
    u16  min,max,avg,i,n;

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

    //-------------------- STEP1: 找出 [平均值]
    for(i=1; i<256; i++) //---- 从1开始! 0字节是不可靠数据
    {
        if(TT_Buffer[i]<min)
        {
            min = TT_Buffer[i];
        }
        if(TT_Buffer[i]>max)
        {
            max = TT_Buffer[i];
        }
    }

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

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

    //-------------------- STEP2: 提取原始数据
       for(i=1; i<256; i++) //---- 必须从1开始! 0字节是不可靠数据
    {
        if (TT_Buffer[i]<avg )//(abs((int)TT_Buffer[i] - 245)<=70)
        {
            if (TT_voltage[i]==1)
                Bin_Buffer[n++]=0;
            else
                Bin_Buffer[n++]=1;
        }
        else if (TT_Buffer[i]>avg )//(abs((int)TT_Buffer[i] - 485)<=70)
        {
            if (TT_voltage[i]==1)
            {
                Bin_Buffer[n++]=0;
                Bin_Buffer[n++]=0;
            }
            else
            {
                Bin_Buffer[n++]=1;
                Bin_Buffer[n++]=1;
            }
        }
    }

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

    i = n-128;  //------- 有效起始点!
    while(i--)
    {
        if(FindHeader(i))
        {
            if(FindID(i))
            {
                return 1;
            }
        }
    }

    return 0;
}

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

    if((Bin_Buffer[index]==0)&&(Bin_Buffer[index+1]==1))//cym 1/0
    {
        index++;
        index++;
    }
    else
    {
        return (0);
    }

    for(n=0; n<9; n++)
    {
        if((Bin_Buffer[index]==1)&&(Bin_Buffer[index+1]==0))//cym 0/1
        {
            index = index+2;
        }
        else
        {
            return (0);
        }
    }

    return (1);
}

将头后的数据解析为实际的卡号数据。
u8 FindID(u16 i)
{
    u8 n;
    u8 k;
    u8 sum;

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

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

        for(k=0; k<11; k++)
        {
            for(n=0; n<5; n++)
            {
                RFID[k] = RFID[k]<<1;

                if((Bin_Buffer[i]==1)&&(Bin_Buffer[i+1]==0))//cym 0/1
                {
                    RFID[k] |= 0x01;
                }
                i += 2;
            }
        }

    }

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

    //---------------------- X 轴校验
    for(k=0; k<10; k++)
    {
        sum = 0;
        if(RFID[k]&0x01)sum++;
        if(RFID[k]&0x02)sum++;
        if(RFID[k]&0x04)sum++;
        if(RFID[k]&0x08)sum++;
        if(RFID[k]&0x10)sum++;

        if(sum%2) //--- 偶校验出错!
        {
            // MessageBox("X 轴校验出错!");
            return 0;
        }
    }

    //------------------- Y 轴校验
    sum = 0;
    for(k=0; k<11; k++)
    {
        sum ^= RFID[k];
    }

    if(sum&0x1E) //--- 偶校验出错!
    {
        //MessageBox("Y 轴校验出错!");
        return 0;
    }

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

    Vendor  = 0;
    CardIDH = 0;
    CardIDL = 0;

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

    k = RFID[2]<<4;
    k |= RFID[3];
    CardIDH |= k<<8;

    k = RFID[4]<<4;
    k |= RFID[5];
    CardIDH |= k;

    k = RFID[6]<<4;
    k |= RFID[7];
    CardIDL |= k<<8;

    k = RFID[8]<<4;
    k |= RFID[9];
    CardIDL |= k;

    //------------------ STEP4: 显示解码结果
    return 1;
}

使用特权

评论回复
6
4c1l| | 2024-8-31 22:59 | 只看该作者
需要配置STM32F103的定时器来生成定时中断,以便能够准确地采样输入信号。定时器的配置取决于曼切斯特信号的比特率。

使用特权

评论回复
7
4c1l| | 2024-8-31 22:59 | 只看该作者
曼切斯特编码是一种用于同步数据传输的编码方式,它通过信号的跳变来表示数据的“0”和“1”。

使用特权

评论回复
8
LOVEEVER| | 2024-9-13 17:17 | 只看该作者

深入学习一下相关程序编码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

628

主题

2603

帖子

5

粉丝