STM32开发笔记93: SX1268驱动程序的移植1

发布者:小熊掌心最新更新时间:2020-03-05 来源: eefocus关键字:STM32  SX1268  驱动程序  移植 手机看文章 扫描二维码
随时随地手机看文章

单片机型号:STM32L053R8T6


本文详述将SX1268官方驱动程序,移植到C++程序设计框架的方法。


1、文件结构

在系统中加入以下文件。

2、屏蔽和硬件相关的数据类型

sx126x.h文件,屏蔽以下语句。暂时屏蔽,后续需要解决。


typedef struct SX126x_s

{

//    Gpio_t        Reset;

//    Gpio_t        BUSY;

//    Gpio_t        DIO1;

//    Gpio_t        DIO2;

//    Gpio_t        DIO3;

//    Spi_t         Spi;

    PacketParams_t PacketParams;

    PacketStatus_t PacketStatus;

    ModulationParams_t ModulationParams;

}SX126x_t;


3、解决TxTimeoutTimer定时器

系统中搜索TxTimeoutTimer定时器,在以下程序中出现。

其在初始化时,指定TxTimeoutTimer定时器的回调函数。


void RadioInit( RadioEvents_t *events )

{

    RadioEvents = events;

 

    SX126xInit( RadioOnDioIrq );

    SX126xSetStandby( STDBY_RC );

    SX126xSetRegulatorMode( USE_DCDC );

 

    SX126xSetBufferBaseAddress( 0x00, 0x00 );

    SX126xSetTxParams( 0, RADIO_RAMP_200_US );

    SX126xSetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );

 

    // Initialize driver timeout timers

    TimerInit( &TxTimeoutTimer, RadioOnTxTimeoutIrq );

    TimerInit( &RxTimeoutTimer, RadioOnRxTimeoutIrq );

 

    IrqFired = false;

}

在数据发送函数中,指定定时器延时时间,并启动定时器。


void RadioSend( uint8_t *buffer, uint8_t size )

{

    SX126xSetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_RADIO_NONE,

                           IRQ_RADIO_NONE );

 

    if( SX126xGetPacketType( ) == PACKET_TYPE_LORA )

    {

        SX126x.PacketParams.Params.LoRa.PayloadLength = size;

    }

    else

    {

        SX126x.PacketParams.Params.Gfsk.PayloadLength = size;

    }

    SX126xSetPacketParams( &SX126x.PacketParams );

 

    SX126xSendPayload( buffer, size, 0 );

    TimerSetValue( &TxTimeoutTimer, TxTimeout );

    TimerStart( &TxTimeoutTimer );

}

在中断处理的IRQ_TX_DONE和IRQ_RX_TX_TIMEOUT事件中,停止定时器。IRQ_TX_DONE是指数据发送完毕,IRQ_RX_TX_TIMEOUT是指发送或接收延时时间到。


可见其正常处理流程是,我发送数据时,让TxTimeoutTimer启动,数据发送完毕或者芯片提示发送超时,都将定时器停止。只有芯片给出不正常反应时,才调用TxTimeoutTimer回调函数,以完成错误处理。


void RadioIrqProcess( void )

{

    if( IrqFired == true )

    {

        BoardDisableIrq( );

        IrqFired = false;

        BoardEnableIrq( );

 

        uint16_t irqRegs = SX126xGetIrqStatus( );

        SX126xClearIrqStatus( IRQ_RADIO_ALL );

 

        if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE )

        {

            TimerStop( &TxTimeoutTimer );

            if( ( RadioEvents != NULL ) && ( RadioEvents->TxDone != NULL ) )

            {

                RadioEvents->TxDone( );

            }

        }

 

        if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE )

        {

            uint8_t size;

 

            TimerStop( &RxTimeoutTimer );

            SX126xGetPayload( RadioRxPayload, &size , 255 );

            SX126xGetPacketStatus( &RadioPktStatus );

            if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )

            {

                RadioEvents->RxDone( RadioRxPayload, size, RadioPktStatus.Params.LoRa.RssiPkt, RadioPktStatus.Params.LoRa.SnrPkt );

            }

        }

 

        if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR )

        {

            if( ( RadioEvents != NULL ) && ( RadioEvents->RxError ) )

            {

                RadioEvents->RxError( );

            }

        }

 

        if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE )

        {

            if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )

            {

                RadioEvents->CadDone( ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ) );

            }

        }

 

        if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT )

        {

            if( SX126xGetOperatingMode( ) == MODE_TX )

            {

                TimerStop( &TxTimeoutTimer );

                if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )

                {

                    RadioEvents->TxTimeout( );

                }

            }

            else if( SX126xGetOperatingMode( ) == MODE_RX )

            {

                TimerStop( &RxTimeoutTimer );

                if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )

                {

                    RadioEvents->RxTimeout( );

                }

            }

        }

 

        if( ( irqRegs & IRQ_PREAMBLE_DETECTED ) == IRQ_PREAMBLE_DETECTED )

        {

            //__NOP( );

        }

 

        if( ( irqRegs & IRQ_SYNCWORD_VALID ) == IRQ_SYNCWORD_VALID )

        {

            //__NOP( );

        }

 

        if( ( irqRegs & IRQ_HEADER_VALID ) == IRQ_HEADER_VALID )

        {

            //__NOP( );

        }

 

        if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR )

        {

            TimerStop( &RxTimeoutTimer );

            if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )

            {

                RadioEvents->RxTimeout( );

            }

        }

    }

}

4、解决RxTimeoutTimer定时器

其在RadioRx函数中,设置定时器延时并启动了定时器。


void RadioRx( uint32_t timeout )

{

    SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_RADIO_NONE,

                           IRQ_RADIO_NONE );

 

    if( timeout != 0 )

    {

        TimerSetValue( &RxTimeoutTimer, timeout );

        TimerStart( &RxTimeoutTimer );

    }

 

    if( RxContinuous == true )

    {

        SX126xSetRx( 0xFFFFFF ); // Rx Continuous

    }

    else

    {

        SX126xSetRx( RxTimeout << 6 );

    }

}

其在RadioRxBoosted函数中,设置定时器延时并启动了定时器。


void RadioRxBoosted( uint32_t timeout )

{

    SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,

                           IRQ_RADIO_NONE,

                           IRQ_RADIO_NONE );

 

    if( timeout != 0 )

    {    

        TimerSetValue( &RxTimeoutTimer, timeout );

        TimerStart( &RxTimeoutTimer );

    }

 

    if( RxContinuous == true )

    {

        SX126xSetRxBoosted( 0xFFFFFF ); // Rx Continuous

    }

    else

    {

        SX126xSetRxBoosted( RxTimeout << 6 );

    }

}

其在RadioSetTxContinuousWave函数中,设置定时器延时并启动了定时器。


void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time )

{

    SX126xSetRfFrequency( freq );

    SX126xSetRfTxPower( power );

[1] [2]
关键字:STM32  SX1268  驱动程序  移植 引用地址:STM32开发笔记93: SX1268驱动程序的移植1

上一篇:STM32开发笔记94: 忽略PlatformIO中的特定警告
下一篇:STM32开发笔记92: SX1268驱动程序设计(时钟)

推荐阅读最新更新时间:2024-11-11 12:28

RTEMS在S3C2440上的移植-(5)
在TQ2440上运行编译生成的Hello World 编译并将编译得到的文件.exe或.bin文件放至合适的位置运行是开始制定三步走计划的第三个步骤。由于生成的文件为.bin文件,猜想是否可以和TQ2440的裸机程序一样通过天嵌官方提供的U-Boot给出的选项直接将程序拷贝到SDRAM中运行?故而进行了以下实验: 1.首先从centos中将.bin文件拷贝到windows中(目前使用的方法还是比较土的,以后研究方便些的方法)。 2.启动天嵌公司提供的DNW工具。 3.连接好开发板的各种连接线,如电源线、串口线、USB线。给开发板供电,并打开开关。此时在DNW上会显示串口信息,选择选项7(见图一)
[单片机]
RTEMS在S3C2440上的<font color='red'>移植</font>-(5)
STM32外围电路硬件解析
复位电路: 复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时,单片机会产生复位。 2. 按键复位:--- 可有可无(看需求) K10按下,产生复位动作 这是阻容复位电路。当复位引脚低电平的时候复位。当上电的瞬间,C13电容开始充电,电容处于短路状态,电容上面的电压为低电平,此时MCU复位引脚被拉低,MCU执行复位,这样就实现了上电的时候复位功能了。 实际上,单片机
[单片机]
<font color='red'>STM32</font>外围电路硬件解析
通过STM32外部中断触发DMA传输
目前STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了DMAMUX模块。有了它一方面使得DMA请求与DMA控制器之间的映射关系更为灵活方便,另一方面也大大拓展了DMA请求事件,不再局限于外设事件,比方基于GPIO的外部中断事件、或者DMA事件本身来触发DMA传输。 关于DMAMUX的基本结构及功能原理,这里就不说了,这里重点介绍基于STM32G4芯片,使用GPIO的外部中断事件触发DMA传输,通过DMA将内存数据传输到GPIO端口的实现过程,包括基于CubeMx的配置、关键代码及注意点。 本演示例程基于STM32G4系列的Nucleo板进行,按键【PC.13】用来触发
[单片机]
STM32之PWM波形输出配置
一. TIMER分类: STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 没有 TIM6 T
[单片机]
<font color='red'>STM32</font>之PWM波形输出配置
STM32单片机I/O的工作模式
最近有个朋友在设计低功耗设备,用的是STM32的主控,他知道我做过很多类似的超低功耗项目,于是向我咨询了一些问题,其中就包括I/O口的几种工作模式。今天我就详细的来总结一下这几种工作模式,让大家在以后的设计中知其然也知其所以然。 先说说GPIO 在聊这8种工作模式之前,我想先说一下GPIO的概念—通用输入输出GeneralPurposeInputOutput简称GPIO,就是芯片引脚可以通过它们输出高、低电平,也可以通过他们输入、读取引脚的电压、电平状态。 下面的8种工作模式我将围绕下图进行分析介绍,读懂这一张图大家基本就可以完全理解STM32的GPIO了。希望大家仔细的看一看。 四种不同的输出模式 推挽输出:该模式下引脚
[单片机]
<font color='red'>STM32</font>单片机I/O的工作模式
【STM32Cube_01】初识 STM32 Cube 生态系统
STM32Cube Ecosystem STM32Cube是ST公司开发的一套生态系统,致力于使STM32的开发变的更简单,并且100%开源免费。 在开始介绍之前,先放上两段ST官方的视频,作以欣赏了解: STM32Cube生态系统宣传片 STM32Cube产品概览 - 使STM32开发更简单 它包括两大部分: PC软件工具:STM32CubeMX、STM32CubeIDE、STM32CubeProgrammer、STM32CubeMnitor等 软件库:STM32 Embedded Software bricks STM32Cube PC Tools STM32Cube MX:适用于任何STM32设备的配
[单片机]
【STM32Cube_01】初识 <font color='red'>STM32</font> Cube 生态系统
stm32关于串口输出的几种常用方式
在使用stm32做项目时,我们常常会使用到串口调试,通过串口来输出我们想要看的相关参数值,这样既方便有快捷。 具体方法有哪些呢,我自己整理了一下,这个也是借鉴别人的用法而已。希望大家可以相互讨论学习。 1、使用printf语句通过串口输出我们想要的参数值 具体的用法:使用之前必须包含相应的头文件#include stdio.h int fputc(int ch, FILE *f)//重定向,让printf输出到串口 { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) ==
[单片机]
<font color='red'>stm32</font>关于串口输出的几种常用方式
stm32的中断与事件
事件:是表示检测有一某件触发事件发生了。 中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。 事件可以触发中断,也可以不触发 中断有可能被更优先的中断屏蔽,事件不会 事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒). 事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved