DW1000学习之路(三)--------DW1000的中断处理问题

         我使用的是STM32F103对DW1000进行处理,F103的外部中断线配置我就不再这里说了,网上的资源一找一大把。

         STM32的对应的中断服务函数里只是在有外部中断的情况下,执行port_deca_isr()函数,该函数为DW1000官方命名的void(*port_deca_isr_t)(void);定义的函数指针。该函数通过执行port_set_deca_isr()的时候赋值,赋值的函数为官方例程中的void dwt_isr(void)函数,而在这个函数中赋值了四个回调函数,当然是函数指针,对应了dwt_local_data_t这个结构体下的四个成员,分别是发送的配置时间,接收的接收完成事件,超时事件,错误事件。

         说了这么一大堆,似乎有些绕绕弯弯,但是没办法,官方就是这么写的,简而言之,就是写几个函数,函数类型为void(*dwt_cb_t)(const dwt_cb_data_t *)的函数,对应着上一段所说的几个事件,并通过设置回调函数dwt_setcallbacks(),将你所写的函数名字放进去,中断产生之后就执行了这些你写的函数。继而设置所需要的中断源。这样,等到相应的中断事件产生之后,就会执行中断,然后根据中断事件来执行上面说的回调函数。

       dwt_isr()官方函数在deca_device.c官方文件里两千一百行,看得懂就看一下,看不懂的话就跳过去吧

       我只写了接收的三个事件。名字分别为rx_cb_ok,rx_cb_error,rx_cb_to;好了,下面写主函数所需要的配置。

int main(void)
{
    int i;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    DW1000_IRQ_Init();
    DW1000_SPI_Init();
    if(DW1000_Wakeup() != DWT_SUCCESS)
        while(1);
    USART1_Init(115200);//将波特率设置为115200
    reset_DW1000();
    spi_set_rate_low();
    if (dwt_initialise(DWT_LOADNONE) == DWT_ERROR)
        USART1_SendStr("DW1000 INIT FAILED\r\n");
    spi_set_rate_high();
    //dwt_forcetrxoff();
    dwt_configure(&config);//多么眼熟的配置,没错和上两篇一摸一样。
/**
*@brief  :之前一直没有说到一个问题就是上面dwt_configure()函数执行的时候,DW1000需要为空闲状态
*         也就是说不能处于接收接收状态,如果处于接收状态,则使用dwt_forcetrxoff()函数关闭就好
*/
    //中断服务处理
    port_set_deca_isr(dwt_isr);//传参为dw1000的中断服务函数例程
    dwt_setcallbacks(NULL,&rx_cb_ok,&rx_cb_to,&rx_cb_error);//第一个用于发送我没有写,后三个为接收的三个中断事件,函数名字上面有写
    //dwt_enableframefilter(DWT_FF_DATA_EN);//帧过滤,使能则DW1000自动过滤掉帧数不匹配的数据,但是不使能也能正常接收
    while(1);//这里我就不写了,不同的功能不同的写法,不同的要求不一样的写法,建议使用一个标志位,判断标志位来决定主函数的功能
}

rx_cb_ok函数如下

/**
*@struct member:dwt_cb_data_t 结构体成员
    uint32 status;      //initial value of register as ISR is entered
    uint16 datalength;  //length of frame
    uint8  fctrl[2];    //frame control bytes
    uint8  rx_flags;    //RX frame flags, see above
*/
/**
*@note         :dwt_cb_data_t 该结构体已经通过dwt_isr()函数全部赋值过了
*/
static __INLINE void rx_cb_ok(const dwt_cb_data_t *data)
{
    u8 buf[127];//数据最大长度为127
    u8 len;//数据长度,我只是读出来而已,不使用。需要用的话应该定义为全局变量,上同
    len=data.datalength-2;
    dwt_readrxdata(buf,len,0);//将接收到的数据放入buf,为0代表从第0位开始读,此数根据自己定义的通讯协议还有帧过滤来决定
}

rx_cb_to函数如下

static __INLINE void rx_cb_to(const dwt_cb_data_t *data)
{
    //嘿嘿,偷个懒,不写了,反正正常执行不会到这里,就算到这里了重新使能接收就可以了
    dwt_rxenable(DWT_START_RX_IMMEDIATE);
}

rx_cb_error函数如上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值