打印

【STM32F0实验】基于STM32 M0的ASK报警接收系统

[复制链接]
楼主: littleshrimp
手机看帖
扫描二维码
随时随地手机跟帖
21
littleshrimp|  楼主 | 2012-8-27 22:25 | 只看该作者 回帖奖励 |倒序浏览

if(highlevels[j]>10000)//数值大于10000视为1,否则为0

这句话仅适用于在指定速率下解码,如果想兼容不同速率的ASK码,需要判断有效ID区域中的近似数据个数,如果ID正确的话,近似个数只能小于等于2个。然后查找最大值或最大值的近视平均值,以它为参考将相应的“位”转换为01

这里提供一个思路,有兴趣的网友可以自己尝试。

使用特权

评论回复
22
littleshrimp|  楼主 | 2012-8-29 22:53 | 只看该作者
完成ASK的解码后,下一步需要将指定设备的ID绑定到STM32 M0报警主机上。让其只识别指定的报警设备发来的报警信号
绑定的大至的流程就是用户先按一下开发板上的USER按键,然后LED3会闪烁20次,如果再20次以内接收到报警设备ID就将其存入FLASH,存入前先将FLASH内的ID读出(因为写入时一次最少写1024个字节),第一个字为FLASHID的数量,然后通过第一个字将FLASH内的所有ID读出。判断新添加的ID是否已经存在,如果存在则退出。否则,将第一个字加1,并将新ID存入队列结尾入,然后重新写回FLASH
操作FLASH的相关函数
 
/*
          清除绑定数据
*/
void BDClear(void)
{
           FLASH_Unlock();//FLASH解锁
           FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
           if (FLASH_ErasePage(FLASH_USER_START_ADDR)== FLASH_COMPLETE)//擦除FLASH
    {
                   }
                   FLASH_Lock(); //锁定FLASH
}
/*
         获取绑定ID 第0字节为数据长度
*/
void BDGetSlaveID(uint32_t bd_slave_id[])
{
         uint16_t i;
         Address = FLASH_USER_START_ADDR;//定位FLASH起始地址
         bd_slave_id[0]= *(__IO uint32_t *)Address;//读取ID数量
         for(i=1;i<=bd_slave_id[0];i++)
         {
                   Address += 4;
                   bd_slave_id[i]=*(__IO uint32_t *)Address;
         }
}
/*
         判断指定ID是否已经存在
*/
uint8_t ExistingSlaveID(uint32_t bd_slv_id)
{
         uint16_t i;
         BDGetSlaveID(buffer);//查询已经绑定的ID
         if(buffer[0] >= MAX_ID_COUNT) return 1;//如果大于可绑定的最多数量则返回1
         for(i=1;i<=buffer[0];i++)
         {
                   if(buffer[i] == bd_slv_id)return 1;//如果ID已经存在返回1
         }
         return 0;
}
/*
         添加绑定ID
*/
void BDAddSlaveID(uint32_t bd_slv_id)
{
         uint16_t i;
         if(!ExistingSlaveID(bd_slv_id))//如果ID不存在
         {
                   buffer[0]++;//第0个WORD为绑定的ID数量
                   buffer[buffer[0]] = bd_slv_id;//将新ID添加到ID队列结尾
                   Address = FLASH_USER_START_ADDR;//定位FLASH起始地址
                   FLASH_Unlock();//解锁FLASH
                   FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
                   if (FLASH_ErasePage(FLASH_USER_START_ADDR)== FLASH_COMPLETE)//擦除FLASH
                   {
                            for(i=0;i<=buffer[0];i++)
                            {
                                     if (FLASH_ProgramWord(Address, buffer[i]) == FLASH_COMPLETE)//将ID数量及全部ID写回FLASH
                                     {
                                               Address = Address + 4;
                                     }
                            }
                   }
         }
         FLASH_Lock(); //锁定FLASH
}
按键相关函数

  STM_EVAL_LEDInit(LED3);//LED3初始化
  STM_EVAL_LEDInit(LED4);//LED4初始化
  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); //按键初始化

                   if(bd)
                   {
                            /* Turn on LED3 and LED4 */
                            bd=0;
                            for(i=0;i<20;i++)
                            {
                                     STM_EVAL_LEDOn(LED3);//点亮LED3
                                     slave_id=GetSlaveID();//获取触发的报警ID
                                     if(slave_id)        //如果ID不为零
                                     {
                                               BDAddSlaveID(slave_id);//添加ID
                                               STM_EVAL_LEDOn(LED4);//点亮LED4
                                               break;//退出绑定
                                     }
                                     Delay(10000000);
                                     STM_EVAL_LEDOff(LED3);//熄灭LED3
                                     Delay(10000000);
                            }
                   }


/*
         按键中断
*/
void EXTI0_1_IRQHandler(void)
{
  if(EXTI_GetITStatus(USER_BUTTON_EXTI_LINE) != RESET)
  {
    EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE);
  
    bd = 1;
  }  
}

使用特权

评论回复
23
yybj| | 2012-8-29 23:43 | 只看该作者
LZ共享精神值得表扬,相当给力

使用特权

评论回复
24
littleshrimp|  楼主 | 2012-8-31 12:28 | 只看该作者
本帖最后由 littleshrimp 于 2012-8-31 12:30 编辑


完成设备的绑定功能后我们还落下一个功能,就是清除绑定。我们需要增加一些代码在main函数中。当用户按下USER键时LED3闪烁,再次按下USER键系统进入撤布防切换,同时LED4闪烁1次。再次按下会清除已经绑定的ID数据,同时LED4闪烁2次。


接下来是报警的触发,为了便于在STM32F0-Discovery上演示报警防区的提示功能,我们可以选择使用DAC播放不同防区的语音使用户对报警来源加以区分。因为需要录制音频,时间关系,这里使用LED4的闪烁次数来区分报警来源。对已经绑定过的设备。如果其触发报警系统会根据报警IDFLASH的索引位置使LED4闪烁不同的次数。使用语音时只需将不同的索引对应到指定的音频数组并通过DAC输出即可。

下面是修改后的代码:

  while (1)

  {



if(bd == ALARM_SWITCH)//修改防区状态



{







LEDBlink(LED3,1);//




if(alarm_on)




{





alarm_on = 0;





STM_EVAL_LEDOff(LED4);//熄灭LED4




}




else




{





alarm_on = 1;





STM_EVAL_LEDOn(LED4);//点亮LED4




}




STM_EVAL_LEDOff(LED3);//熄灭LED3




bd = NONE;



}



else if(bd == CLEAR_ID)//清除已绑定ID



{




LEDBlink(LED3,1);//




BDClear();//清除绑定数据




LEDBlink(LED4,2);//LED4闪烁2次





bd = NONE;//退出绑定



}



else if(bd == BINDING)//绑定



{




LEDBlink(LED3,1);//




slave_id=GetSlaveID();//获取触发的报警ID




if(slave_id)
//如果ID不为零




{





BDAddSlaveID(slave_id);//添加ID





LEDBlink(LED4,1);//闪亮LED4一次





bd = NONE;//退出绑定




}



}



else



{




if(alarm_on)//如果布防开启




{





slave_id=GetSlaveID();//获取触发的报警ID





if(slave_id)
//如果ID不为零





{






slvId_index = GetSlaveIdIndex(slave_id);






LEDBlink(LED4,slvId_index);//将对应的索引位置输出到LED4





}



}




if(i++>=20)




{







bd = NONE;//退出绑定





i = 0;




}



}
}

使用特权

评论回复
25
littleshrimp|  楼主 | 2012-8-31 12:30 | 只看该作者
到现在为止,所有的功能基本全部实现。
代码和发贴笔记在一楼。

使用特权

评论回复
26
littleshrimp|  楼主 | 2012-9-1 16:40 | 只看该作者
这么酷的帖子我要是不督促你,你若忘记发了,那岂不是论坛的一大损失哦!:lol
21小跑堂 发表于 2012-8-26 01:14

实验俺做了,贴子也发了。您看开发板是不就不往回要了?

使用特权

评论回复
27
aozima| | 2012-10-14 17:26 | 只看该作者
请问有没什么方法可以不通过GPIO就可以判断刚才是上升沿还是下降沿?
怕万一输入信号变化过快,等读GPIO时电平状态已变化。
void TIM2_IRQHandler(void)
{
//判断捕获引脚电平
    if(GPIOA->IDR & GPIO_Pin_1)
    {
        //如果引脚电平为高,说明是上升沿捕获,即前一个电平为低电平.
    }
}

使用特权

评论回复
28
baidudz| | 2012-10-14 23:17 | 只看该作者
相当给力

使用特权

评论回复
29
dfsa| | 2012-10-14 23:24 | 只看该作者
这个笔记和代码对我很有用,多谢分享

使用特权

评论回复
30
秋天落叶| | 2012-10-14 23:33 | 只看该作者
这个产品再完善一下,应该很有市场价值

使用特权

评论回复
31
xsgy123| | 2012-10-14 23:41 | 只看该作者
讲解的相当清晰

使用特权

评论回复
32
weikezhi| | 2012-10-15 11:26 | 只看该作者
很不错,很详细。

使用特权

评论回复
33
zzyaizll| | 2013-2-21 13:12 | 只看该作者
顶一个

使用特权

评论回复
34
拿起书本| | 2013-2-23 03:55 | 只看该作者
楼主的这这种钻研精神令人钦佩啊,顶一下。

使用特权

评论回复
35
sinadz| | 2013-2-23 10:24 | 只看该作者
很有参考价值

使用特权

评论回复
36
火箭球迷| | 2013-2-23 10:39 | 只看该作者
还有没有更多的笔记,很不错

使用特权

评论回复
37
yybj| | 2013-2-23 10:52 | 只看该作者
再改进一下,估计可以做产品了:lol

使用特权

评论回复
38
cjhk| | 2013-2-23 17:55 | 只看该作者
**很不错  呵呵  很好  需要消化一下啊   呵呵  顶一个

使用特权

评论回复
39
hellome11| | 2013-3-22 13:56 | 只看该作者
very good!

使用特权

评论回复
40
pino66| | 2014-7-22 15:17 | 只看该作者
太有用了,最近在学习ASK解码。谢谢楼主分享

使用特权

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

本版积分规则