你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

loraDIO引脚中断不起作用

[复制链接]
吃肉肉,不长肉肉 提问时间:2023-9-27 10:34 / 未解决

主控芯片STM32L151,利用SPI驱动lora模块,现在发现不触发中断,下边先是配置引脚

GPIO_InitTypeDef GPIO_InitStructure;

__HAL_RCC_GPIOB_CLK_ENABLE( ); GPIO_InitStructure.Pin = GPIO_PIN_4; ///DIO1 PB4 GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure );

HAL_NVIC_SetPriority(EXTI4_IRQn, 10, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn);

/DIO0引脚中断/ void EXTI4_IRQHandler(void) { printf("0\r\n"); uint16_t irqRegs;

if(HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != RESET) { printf("0-1\r\n"); HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);

irqRegs = SX126xGetIrqStatus( );
SX126xClearIrqStatus( IRQ_RADIO_ALL );

printf("0-2\r\n"); if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE ) { //!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC SX126xSetOperatingMode( MODE_STDBY_RC ); LoraTxDoneCallback(); printf("1"); }

if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE )
{
    if( RxContinuous == false )
    {
        ///!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
        SX126xSetOperatingMode( MODE_STDBY_RC );

        /// WORKAROUND - Implicit Header Mode Timeout Behavior, see DS_SX1261-2_V1.2 datasheet chapter 15.3
        /// RegRtcControl = @address 0x0902
        SX126xWriteRegister( 0x0902, 0x00 );
        /// RegEventMask = @address 0x0944
        SX126xWriteRegister( 0x0944, SX126xReadRegister( 0x0944 ) | ( 1 << 1 ) );
        /// WORKAROUND END
    }
    SX126xGetPayload( RadioRxPayload, &Radiosize , 255 );
    SX126xGetPacketStatus( &RadioPktStatus );
    LoraRxDoneCallback();
    printf("2");
}

if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR )
{
    if( RxContinuous == false )
    {
        //!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
        SX126xSetOperatingMode( MODE_STDBY_RC );
    }
   LoraRxErrorCallback();
    printf("3");
}

if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE )
{
    //!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
    SX126xSetOperatingMode( MODE_STDBY_RC );
    LoraCadDoneCallback();
    printf("4");
}

if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT )
{
    if( SX126xGetOperatingMode( ) == MODE_TX )
    {
        SX126xSetOperatingMode( MODE_STDBY_RC );
        LoraTxTimeoutCallback( );
        printf("5");
    }
    else if( SX126xGetOperatingMode( ) == MODE_RX )
    {
        SX126xSetOperatingMode( MODE_STDBY_RC );
        LoraRxTimeoutCallback( );
        printf("6");
    }
}

if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR )
{
    if( RxContinuous == false )
    {
        //!< Update operating mode state to a value lower than \ref MODE_STDBY_XOSC
        SX126xSetOperatingMode( MODE_STDBY_RC );
    }
    LoraRxTimeoutCallback( );
    printf("7");
}

} }

可能是那些原因呢,有什么排除办法

收藏 评论1 发布时间:2023-9-27 10:34

举报

1个回答
butterflyspring 回答时间:2023-9-27 11:05:21
手动测试一下中断,也就是自己模拟一个信号,看看是否正常执行。
另外cube库的架构通过回调函数来在中断里添加自己的程序,尽量遵循CUBE库的架构,改变很可能会引起意想不到的问题。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版