silicon EFR32BG22发送单载波

本文开发环境

  • sdk: gecko_sdk_3.1
  • IDE: Simplicity Studio 5.0

在项目初期需要调试天线相关的参数,需要芯片发射一个单载波,也就是频率固定的电磁波,以便调整相关参数。如果条件允许直接使用官方提供的DTM程序即可。但对于没有串口的情况可以在Bluetooth SoC Empty工程的基础上稍作修改即可。
在这里插入图片描述

第一步
安装DTM
在这里插入图片描述

第二步

修改代码,如下

#include "em_common.h"
#include "sl_app_assert.h"
#include "sl_bluetooth.h"
#include "gatt_db.h"
#include "app.h"
#include "sl_bt_api_compatibility.h"

#define SL_STACK_TIMER_PRBS 100
#define SL_STACK_TIMER_TONE 101

enum packet_type {
  PACKET_TYPE_PRBS9 = 0,     // binary 00 -> PRBS9 Packet Payload
  PACKET_TYPE_11110000 = 1,  // binary 00 -> 11110000 Packet Payload
  PACKET_TYPE_10101010 = 2,  // binary 10 -> 10101010 Packet Payload
  PACKET_TYPE_11111111 = 3,  // binary 11 -> On the LE Coded PHY: 11111111
  PACKET_TYPE_MAX
};
enum phy {
  PHY_NONE = 0,
  PHY_1M = 1,
  PHY_2M = 2,
  PHY_CODED_S_8 = 3,
  PHY_CODED_S_2 = 4,
  PHY_MAX
};
// Array for mapping standard UART Test Interface command packet types to bgapi test_packet_type
static test_packet_type_t std_to_bgapi_pkt_types[PACKET_TYPE_MAX] = {
  [PACKET_TYPE_PRBS9] = test_pkt_prbs9,
  [PACKET_TYPE_11110000] = test_pkt_11110000,
  [PACKET_TYPE_10101010] = test_pkt_10101010,
  [PACKET_TYPE_11111111] = test_pkt_11111111
};


void sl_bt_on_event(sl_bt_msg_t *evt)
{
  sl_status_t sc;
  bd_addr address;
  uint8_t address_type;
  uint8_t system_id[8];


  switch (SL_BT_MSG_ID(evt->header)) {
    
    //当收到sl_bt_evt_system_boot_id事件之后不要做任何蓝牙相关的操作,设置一个定时器。
    case sl_bt_evt_system_boot_id:
      sl_bt_system_set_soft_timer(3000,SL_STACK_TIMER_PRBS,1);
      break;
     }
	
	//定时器事件
	case sl_bt_evt_system_soft_timer_id:
      {
        switch(evt->data.evt_system_soft_timer.handle)
        {
        case SL_STACK_TIMER_PRBS:
        		//需要先发该数据
                sc = sl_bt_test_dtm_tx_v4(std_to_bgapi_pkt_types[PACKET_TYPE_PRBS9] ,255,0,PHY_1M,6);
                break;
        case SL_STACK_TIMER_TONE:
          sc = sl_bt_test_dtm_end();
			//这里的第一个参数填0xfe才为单载波
          sc = sl_bt_test_dtm_tx_v4(0xfe ,255,0,PHY_1M,6);
          break;
        default :
          break;
        }
      }
      break;
    case sl_bt_evt_test_dtm_completed_id:
      {
        static int once = 1;
        
        if(once)
          sl_bt_system_set_soft_timer(3000,SL_STACK_TIMER_TONE,1);
        once = 0;
      }
      break;
    default:
    break;
}
EFR32BG22是一款基于Silicon Labs (原EmberZigbee) 的低功耗无线MCU,它支持GPIO (通用输入输出) 功能,包括GPIO中断。GPIO中断用于处理当GPIO线路上发生特定事件(如电平变化、定时到达等)时,系统需要执行的自定义操作。 要在EFR32BG22上添加GPIO中断,你需要按照以下步骤进行: 1. **配置GPIO**: - 首先,在设备树(DT)或代码中配置GPIO,设置其方向为输入或输出,并启用中断功能。 ```c GPIO_InitTypeDef gpio_config; gpio_config.Pin = GPIO_PIN_X; // 替换X为实际GPIO引脚 gpio_config.Mode = GPIO_MODE_IT_FALLING; // 或者GPIO_MODE_IT_RISING,根据需求选择上升沿或下降沿触发 GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_FREQ_LOW; // 设置速度 GPIO_Init(GPIO_PORT_X, &gpio_config); // 替换X为实际GPIO端口 ``` 2. **连接中断服务函数**: - 在CMSIS库提供的`NVIC` API中,注册你的中断服务函数(ISR),该函数会在GPIO中断被触发时被调用。 ```c void EXTI0_IRQHandler(void) { // 在这里处理中断事件 } NVIC_EnableIRQ(EXTI0_IRQn); // 替换EXTI0为你的GPIO中断对应的中断ID ``` 3. **开启中断**: - 启动并使能相应的中断源。 ```c EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志 EXTI_GenerateSWInterrupt(EXTI_Line0); // 触发中断 ``` 4. **处理中断后的操作**: - 中断服务函数结束后,记得更新中断标志和执行必要的后续任务,比如发送数据、更新状态机等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值