- 2024-04-30
-
发表了主题帖:
AndroidBLE_osc_申请权限
这个软件的功能是通过蓝牙接收温度数据并绘制温度变化曲线
# 1.获取权限
安卓的BLE需要在AndroidManifest.xml里声明需要的权限。包括蓝牙权限,定位权限,在安卓12以后又增加了一些权限
```xml
```
# 2.动态申请
其中定位权限以及安卓12新增权限需要动态申请。因此下面需要在MainActivity里申请权限
```java
protected void onResume() {
super.onResume();
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission was granted, start scanning
Toast.makeText(this, "已授予许可", Toast.LENGTH_SHORT).show();
} else {
// Permission denied, show a message
Log.w("permission","Location permission is required to scan for BLE devices");
Toast.makeText(this, "Location permission is required to scan for BLE devices", Toast.LENGTH_SHORT).show();
finish();
}
return;
}
}
}
```
其中onResume方法绘制主界面显示之前就区申请权限,onRequestPermissionsResult方法处理相关权限申请失败/成功后内容例如向用户提示申请成功/失败。
这是onResume方法返回的权限请求码,onRequestPermissionsResult通过请求码来处理响应的权限申请结果。
```
private static final int REQUEST_ENABLE_BT = 1;
private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
```
# 3.主函数需要判断设备是否支持BLE,蓝牙是否打开
```java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_SHORT).show();
finish();
return;
}
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
```
- 2024-04-15
-
回复了主题帖:
elfboard配置交叉编译
Jacktang 发表于 2024-4-11 07:34
又写到博客里啦啊
直接写到咱们eeworld呗
我不是很懂,请教下有什么区别,怎么操作
- 2024-04-10
-
发表了主题帖:
elfboard配置交叉编译
1.首先下载ubuntu/Lubuntu18.04版本
这是因为开发板的ubuntu版本是18.04 ,过高过低版本会导致引用的库版本过高
2.设置共享剪贴板 ---安装sudo apt vm-tool
# 设置共享文件夹详细教程
3.安装交叉工具链
官方给的交叉编译工具链设置一直有问题。
这里直接使用 从apt上安装arm工具链
```
sudo apt install gcc-arm-linux-gnueabihf
```
编译命令
```
arm-linux-gnueabihf-gcc led.c
```
[4.windows用ssh](http://4.windows)连接ubuntu
`sudo apt-get install ssh`
`sudo service ssh start`
vscode上安装ssh插件
config文件 配置ubuntu名 ,ip地址 ,端口号
sx
192.168.221.130
22
known_hosts文件
保存ubuntu的密钥 ,删除密钥后需要重新输入密码
5.发送bin文件给开发板
scp led root@192.168.0.232:/home/root
scp 文件 发送地址
给bin文件所在文件夹设置可执行权限
` chmod -R 777 /home/root`
运行可执行文件
./a.out
- 2024-01-22
-
回复了主题帖:
EFR32_BLE开发记录
damiaa 发表于 2024-1-21 18:32
上次改了下esp32蓝牙配置wifi的那个例子,搞了android上的配置软件,还学了一段时间的android。 现在又差不 ...
我之前准备在Android上做BLE上位机。看了安卓开发课后觉得安卓上BLE开发太麻烦了。转而用python
- 2024-01-20
-
回复了主题帖:
BLE基础外设使用
极限零 发表于 2024-1-20 13:03
发贴时可以直接用,点完了直接粘代码就行,操作很简单
回贴时有高级模式,进入之后和上面的是 ...
好的
- 2024-01-19
-
回复了主题帖:
BLE基础外设使用
极限零 发表于 2024-1-19 11:41
感谢分享,不过希望楼主可以使用编辑器的高级模式,该模式有专门的代码块编辑,会使代码看起来更方便简洁, ...
有高级模式的截图吗
- 2024-01-17
-
回复了主题帖:
EFR32_BLE开发记录
Jacktang 发表于 2024-1-17 07:45
EFR32的BLE配置工具的三件事情介绍的比较清楚明白
- 2024-01-16
-
发表了日志:
EFR32_BLE开发记录
-
发表了主题帖:
EFR32_BLE开发记录
什么是BLE
BLE:低功耗蓝牙,采用蓝牙4.0技术具有低成本,短距离特点。可以用于电子手环,蓝牙门锁等场景。
BLE如何进行通信
广播
BLE分为:中心设备和外设设备。
外设设备用GAP协议以广播形式告知中心设备,本机蓝牙可以被链接。中心设备可选择对发送过来的广播数据回复。回复的内容有设备名称,设备地址。也可不回复。
连接建立后就以client-server方式联系
中心设备(手机)作为client
外设设备(手环)作为serve
GATT协议
链接建立后,中心设备与外设设备用GATT协议通信
蓝牙应用层的协议,以profile文件的形式存储。
Profile文件结构如下
Service1
Characterisitic1
Characterisitic2
Service2
Characterisitic
….
每个profile包含若干个service,每个service包含若干个characteristic
而characteristic包含Properties ,value。
Properties 规定了cilent应以怎样的方式处理characteristic的内容
Properties的属性如下
属性名称
描述
read
支持 read 操作
write
支持 write 操作
notify
支持 notify 操作
indicate
支持 indicate 操作
当service端的蓝牙 characteristicr是Indicate 属性
客户端就必须要以indicate方式来读写characteristic
不能用其他三种。
无论是service还是characteristic最后都被封装成(Attribute
)att数据包。
ATT协议包括三部分 handle ,type,value
Handle: Attribute句柄。Client要访问Server的Attribute,都是通过这个句柄来访问的
在蓝牙数据包中一般都有这个值
Type :由UUID来定义。蓝牙联盟有统一的UUID设备标识。
具体使用使用时可以自定义也可用蓝牙联盟的。
Value:蓝牙数据包具体携带的值。
EFR32的BLE配置工具
到此我们只关心三件事情。
1.创建我们自定义的service和characteristic
2.用自定义的的characteristic向client发送数据
3.client接收数据
而GAP 和GATT都由EFR32的蓝牙SDK完成。
为了方便起见,我们首先分析一下EFR32的温度传感器例程代码。
在使用IDE的配置工具配置自定义的BLE任务
EFR32把蓝牙程序分成了两部分,一部分是bootloader,另一部分是蓝牙程序。
在下载蓝牙例程,需要先下载蓝牙的bootloader
导入一个蓝牙温度的例程
下载
https://www.silabs.com/documents/public/software/android-efr-connect.apk
如图所示
打开串口
打开IDE
看到有BLE组件
EFR32开发蓝牙工程分析及自定义一个蓝牙任务发送数据
蓝牙工程分析
先来找蓝牙发送函数
搜索字符串“Temperature:”在工程中位置
在app.c的app_periodic_timer_cb函数里
这个函数是定时器的回调函数
周期性的获取温度值,并通过app_log_info和sl_bt_ht_temperature_measurement_indicate发送到串口与蓝牙。
sl_sensor_rht_get是温度获取函数
那么谁来调用app_periodic_timer_cb函数呢?
在app.的sl_bt_ht_temperature_measurement_indication_changed_cb
函数里调用用了app_periodic_timer_cb
通过源码可知,这个函数是在蓝牙连接建立后,client访问server中characteristic中的temperature_measurement子项时调用的。
调用方式是indicate。意思是server端发送完成后,client需要回复确认收到。
在sl_bt_ht_temperature_measurement_indication_changed_cb
进行了开启定时器,绑定回调函数操作
那sl_bt_ht_temperature_measurement_indication_changed_cb
是谁在调用?
是sl_bt_ht_on_event在调用
sl_bt_ht_on_event是蓝牙温度测量事件函数。
这个函数完成了温度测量的 characteristic从开始发送到发送完成关闭定时器的操作。
关心这几个部分。
sl_bt_gatt_server_write_attribute_value
在本地 GATT 数据库中写入属性值。如果本地 GATT 数据库中的属性具有指示或通知属性,且客户端已启用通知或指示功能,则写入该属性的值不会触发向远程 GATT 客户端发送通知或指示。
gattdb_temperature_measurement
case sl_bt_evt_gatt_server_characteristic_status_id:
*@brief表示本地客户端特征配置
*描述符被远程GATT客户端更改,或者来自的确认
*远程GATT客户端在成功接收
*指示
*
来梳理下sl_bt_ht_on_event完成的事情
刚开始进入蓝牙温度任务
先执行 health_thermometer_init();
往蓝牙gatt数据库中写入temperature_type的属性。
温度数据发送都是按照这个属性(att)发送的
之后case sl_bt_evt_gatt_server_characteristic_status_id
说temperature_type的属性的蓝牙通信建立。
gattdb_temperature_measurement == evt->data.evt_gatt_server_characteristic_status.characteristic
判断蓝牙句柄拿到的uuid是否是gatt数据库中有的
(sl_bt_gatt_server_client_config == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags
客户端的characteristic已经改变
执行sl_bt_ht_temperature_measurement_indication_changed_cb
当蓝牙温度att通信关闭执行
case sl_bt_evt_connection_closed_id:
sl_bt_connection_closed_cb(evt->data.evt_connection_closed.reason,
evt->data.evt_connection_closed.connection);
break;
接下来看看sl_bt_ht_on_event是由谁调用
在sl_bluebooth.c的sl_bt_process_event里调用。
这是处理蓝牙任务函数包括
sl_bt_in_place_ota_dfu_on_event(evt);
sl_gatt_service_device_information_on_event(evt);
sl_bt_ht_on_event(evt);
sl_bt_on_event(evt);//这是个虚函数里面没有代码
与配置工具对应
在在sl_bluebooth.c的sl_bt_step里调用。sl_bt_step轮询蓝牙堆栈中的事件并进行处理
在sl_event_handler.c的sl_stack_process_action调用sl_bt_step
在sl_system_process_action.c的sl_system_process_action调用sl_stack_process_action
sl_system_process_action进行系统初始化和操作处理
*此函数调用一组自动生成的函数,这些函数位于`autogen/sl_event_handler.c`中。
可以使用事件处理程序组件提供的事件处理程序API为以下事件注册处理程序:
* - platform_init -> sl_platform_init()
* - driver_init -> sl_driver_init()
* - service_init -> sl_service_init()
* - stack_init -> sl_stack_init()
* - internal_app_init -> sl_internal_app_init()
sl_system_process_action()在main函数while中调用
到这里已经把应用相关代码过了一遍
如图
我们只需要关心
修改sl_bt_ht_on_event函数变成我们自己的
仿照修改即可
接下来看看发送函数
sc = sl_bt_ht_temperature_measurement_indicate(app_connection,
temperature,
false);
app_connection,蓝牙句柄
temperature温度值
false是摄氏度/true是华氏温度
在sl_bt_ht_temperature_measurement_indicate里进行了温度的数据封装操作
temperature_measurement_val_to_buf
把温度数据封装到五个字节的数据包里
第一个字节是温度类型
其余是温度值
uint32_t tmp_value = ((uint32_t)value & 0x00ffffffu) \
| ((uint32_t)(-3) << 24);
buffer[0] = fahrenheit ? TEMPERATURE_MEASUREMENT_FLAG_UNITS : 0;
buffer[1] = tmp_value & 0xff;
buffer[2] = (tmp_value >> 8) & 0xff;
buffer[3] = (tmp_value >> 16) & 0xff;
buffer[4] = (tmp_value >> 24) & 0xff;
要转回去
a= (data[4]<<8)|data[3];
a=(a<<8)|data[2];
a=(a<<8)|data[1];
a=a&0xffffff;
用最底层sl_bt_gatt_server_send_indication发送
sc = sl_bt_gatt_server_send_indication(
connection,
gattdb_temperature_measurement,
sizeof(buf),
buf);
connection句柄
gattdb_temperature_measurement gatt的属性
sizeof(buf),数据包大小
buf数据包 是一个指针类型const uint8_t* value
自定义GATT的service characteristic 并发送
进入blue配置工具
配置GATT数据库
如图
GATT数据库
再添加一个
接下修改即可
在Health_Thermometer添加
void demo_init()
{
}
void sl_bt_demo_on_event(sl_bt_msg_t *evt)
{
// Handle stack events
switch (SL_BT_MSG_ID(evt->header)) {
case sl_bt_evt_system_boot_id:
demo_init();
break;
case sl_bt_evt_connection_closed_id:
sl_bt_demo_connection_closed_cb(evt->data.evt_connection_closed.reason,
evt->data.evt_connection_closed.connection);
break;
case sl_bt_evt_gatt_server_characteristic_status_id:
if (gattdb_test == evt->data.evt_gatt_server_characteristic_status.characteristic) {
// client characteristic configuration changed by remote GATT client
if (sl_bt_gatt_server_client_config == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags) {
sl_bt_demo_indication_changed_cb(
evt->data.evt_gatt_server_characteristic_status.connection,
(sl_bt_gatt_client_config_flag_t)evt->data.evt_gatt_server_characteristic_status.client_config_flags);
}
// confirmation of indication received from remove GATT client
else if (sl_bt_gatt_server_confirmation == (sl_bt_gatt_server_characteristic_status_flag_t)evt->data.evt_gatt_server_characteristic_status.status_flags) {
sl_bt_demo_indication_confirmed_cb(
evt->data.evt_gatt_server_characteristic_status.connection);
} else {
}
}
break;
default:
break;
}
}
App.c里添加
//demo code
#include "gatt_db.h"
static app_timer_t app_periodic_timer1;
static uint8_t app_connection1 = 0;
void demo_timer_cb()
{printf("demo_timer_cb()");
uint8_t c=10;
sl_bt_gatt_server_send_indication(
app_connection1,
gattdb_test,//要发送数据的characteristic
1,
&c);
}
/**************************************************************************//**
demo
* Indication changed callback
*
* Called when indication of temperature measurement is enabled/disabled by
* the client.
*****************************************************************************/
void sl_bt_demo_indication_changed_cb(uint8_t connection,
sl_bt_gatt_client_config_flag_t client_config)
{
app_connection1 = connection;
// Indication or notification enabled.
if (sl_bt_gatt_disable != client_config) {
// Start timer used for periodic indications.
app_timer_start(&app_periodic_timer1,
1 * 1000,
demo_timer_cb,
NULL,
true);
// Send first indication.
demo_timer_cb();
}
// Indications disabled.
else {
// Stop timer used for periodic indications.
(void)app_timer_stop(&demo_timer_cb);
}
}
void sl_bt_demo_connection_closed_cb(uint16_t reason, uint8_t connection)
{
(void)reason;
(void)connection;
sl_status_t sc;
// Stop timer.
sc = app_timer_stop(&app_periodic_timer1);
}
并在sl_bt_process_event添加sl_bt_demo_on_event
结果如图
主要参考
Silabs的蓝牙demo文档
UG103.14: Bluetooth® LE Fundamentals (silabs.com)
QSG169: Bluetooth® Quick-Start Guide for SDK v3.x and Higher (silabs.com)
ug434-bluetooth-c-soc-dev-guide-sdk-v3x.pdf (silabs.com)
博客园夜行过客专栏
https://www.cnblogs.com/yongdaimi/category/1543239.html
龙言飞语
https://zhuanlan.zhihu.com/p/346972549
-
发表了主题帖:
BLE基础外设使用
创建工程
选择 New project wizard
点击next
双击empty c project。
选择copy contents
点finish
进入software component,添加外设组件。
外设
VCOM
install
Platform->driver->swo
Platform->peripheral->usart
Services->peripheral-> Automatic Device Initialization
Services: IO Stream: USARTInstall
创建一个vcom实例
Services :IO Stream: Retarget STDIOInstall
导入以下头文件到app.c
#include <stdio.h>
#include <string.h>
#include "em_chip.h"
#include "sl_iostream.h"
#include "sl_iostream_init_instances.h"
#include "sl_iostream_handles.h"
const char str1[] = "IOstream USART example\r\n\r\n";
sl_iostream_write(sl_iostream_vcom_handle, str1, strlen(str1));
这样就可以用l_iostream_write写入数据到串口
Printf 重定向
在software component搜索tiny printf
在third party ->unitl->tiny printf
GPIO
Led
Platform:driver:led:Generic LED API
点击install
点击done创建一个实例
#include "sl_simple_led.h"
里是led的功能函数
sl_simple_led_init(&simple_led0_context);初始化
sl_simple_led_turn_on点灯
sl_simple_led_turn_off关灯
sl_simple_led_toggle反转
sl_simple_led_get_state获取灯的状态
typedef struct {
GPIO_Port_TypeDef port; ///< LED port
uint8_t pin; ///< LED pin
sl_led_polarity_t polarity; ///< Initial state of LED
} sl_simple_led_context_t;//LED初始化结构体
底层头文件
#include "em_gpio.h
GPIO_PinOutClear()Set bits in DOUT register for a port to 0. GPIO_PortOutSet Set bits GPIO data out register to 1.
GPIO_PortOutToggleToggle pins in GPIO port data out register.
GPIO_PinOutGetGet current setting for a pin in a GPIO port data out regisl_simple_led_context_t *led = context;ster.
初始化过程
sl_simple_led_context_t simple_led0_context = {
.port = SL_SIMPLE_LED_LED0_PORT,
.pin = SL_SIMPLE_LED_LED0_PIN,
.polarity = SL_SIMPLE_LED_LED0_POLARITY,
};初始化结构体
sl_simple_led_context_t *led = context;
CMU_ClockEnable(cmuClock_GPIO, true);//时钟使能
GPIO_PinModeSet(led->port,
led->pin,
gpioModePushPull,
!led->polarity);
配置引脚
Button
Platform:driver:led:Generic LED button API
创建一个button实例
void button_init()
{
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortB,
2,
gpioModeInput,
0);
//初始化输入模式
//浮空输入gpioModeInput,
gpioModeInputPull,上来下拉由第四个参数决定 1上拉/0下拉
}
GPIO_PinInGet(gpioPortB,2)获取b2的输入电平
time
sleeptimer
service:time:sleeptimer
Sleepimer驱动程序使用低频实时时钟外设提供软件定时器、延迟、计时和日期功能。睡眠定时器使用一个硬件定时器并创建多个软件定时器实例。睡眠定时器可用于创建与电源管理紧密集成的定时器。电源管理器需要精确的计时,以使所有时钟按时准备就绪,因此唤醒发生得更早一点,为系统在正确的时间做好准备。
sl_sleeptimer_init();//初始化睡眠定时器
sl_sleeptimer_timer_handle_t handle;
sl_sleeptimer_start_periodic_timer(&handle,1000,timecallback,NULL,0,true);开启定时周期回调
void timecallback()//回调函数
{
printf("1");
printf("sl_simple_button_get_state %d\r\n",GPIO_PinInGet(gpioPortB,2));
}
Silicon lab的定时器有用了app_timer封装了一层sleeptime使用
用法一样只不过少了初始化步骤
static app_timer_t app_periodic_timer;
sc = app_timer_start(&app_periodic_timer,
SL_BT_HT_MEASUREMENT_INTERVAL_SEC * 1000,
app_periodic_timer_cb,
NULL,
true);//开启定时器
app_periodic_timer_cb(&app_periodic_timer, NULL);//重写写定时回调函数 执行定时任务
temp
platform:driver:tempdev
温度驱动器使用一些EFR32和EFM32设备上的EMU内部温度传感器测量温度。特定于应用程序的回调函数可以注册,并将在给定的温度阈值上调用。EMU内部温度传感器在EM0-EM4H中运行,能够在温度变化时唤醒核心。EMU温度传感器连续运行,每250毫秒进行一次测量。对于适用勘误表EMU_E201的设备,温度驱动器执行一种变通方法,根据测量的温度调整EMU设置。有关此勘误表解决方法的更多信息,请参阅应用说明AN1027。
导入 #include "tempdrv.h"
TEMPDRV_Init();
printf("TEMPDRV_GetTemp %d\r\n",TEMPDRV_GetTemp());
-
发表了日志:
BLE基础外设使用
- 2024-01-15
-
回复了主题帖:
EFR32MG24开发板介绍及IDE使用
lugl4313820 发表于 2024-1-15 19:39
大佬有蓝牙的教程吗?这开发板不便宜呀,320大洋呀!
不是大佬,我也是刚接触,没有蓝牙的教程,但有蓝牙的例程
-
发表了主题帖:
EFR32MG24开发板介绍及IDE使用
板卡如图
板上的资源有
EFR32MG24无线SOC,Jlinlk调试器(可用作虚拟串口),两颗用户按键,两颗LED灯,板载天线。
片上资源有
包含:32个GPIO,其中20个GPOIO通过排座引出。1536kb的flash,256kb的ram。8通道dma控制器。一个可配置为UART/SPI/SmartCard (ISO 7816)/IrDA/I2S的通信接口。2个EUSART增强型的usart。2个支持SMBus的I2C接口。9个定时器包含2个32位定时器,3个16位定时器,1个24位的低功耗定时器,1个32位RTC定时器,一个32位极低功耗的定时器用于从能量模式唤醒,2个看门狗定时器。1个增强型ADC最高16位 76.9ksps,12位 1Msps采样率。2个模拟比较器。2个12位500 ksps采样率的DAC。内置温度传感器。支持jtag/swd调试。
基于ARM cm33内核,时钟72Mhz
开发工具介绍
EFR32支持MDK,IAR,Silicon IDE开发,其中官方例程只有IAR和Silicon IDE版本。Silicon IDE功能非常强大,首先IDE基于Eclipse开发的,内置芯片的软件包software component,可直接从IDE下载芯片的SDK以及无线分析工具。
开始界面
在debug adapters窗口会发现所连接的芯片。
点击INSTALL按钮
选择install by connecting device 后会自动下载芯片支持的SDK。包括蓝牙SDK和外设库文件,BLE网络配置器,网络分析仪用于抓包,BLE GATT 配置器,GNU ARM工具链等。
当在welcome界面点击start后会进入如下界面。
包含四部分
Overview
Example
Document
Component tools
Overview
介绍了所连接调试器类型,mcu类型,sdk版本。
芯片相关的文档。
开发板下相关的文档
exampe
1.包含无线连接的例程
2.没有无线连接的例程
3.组网协议相关的例程 zigbe,buletooth mesh等
4.用户开发用的demo例程
5.有关低功耗,蓝牙通信解决方案的例程
3.document
1.芯片相关:数据手册,应用指南,电气规范,快速开始等
2.技术相关:蓝牙,zigbee组网协议,bootloader等
4.component tools
提供网络强度,数据抓包,flash下载,能耗分析等
工程模板导入及编译下载
点击create new project,在example里搜索blink bare metal。无通信的Led的例程。点击next
到如图
填写合适的工程名称,选择一个工程创建位置,最后一个选择以怎样的方式使用SDK的库文件。
选择copy所需的库文件以及所需的文件到工程目录。
点击finish完成创建。
右击工程目录,或者 菜单栏 的project
Build project 生成可执行文件,bin,hex,elf文件等。
点击RUN AS下载程序
也可使用simplicity commder下载程序
在selec kit选择440322824
选择flash选项
Browse选择bin文件,点击flash即可。重启开发板
Hex文件在C:\Users\18739\SimplicityStudio\v5_workspace\blink_baremetal\GNU ARM v12.2.1 - Default\blink_baremetal\GNU ARM v12.2.1 - Default下
结果如图
LED闪烁
-
发表了主题帖:
EFR32MG24工程文件分析
1.工程目录分析
Include文件夹包含工程所需的头文件路径
首先,右键项目名,Properties → \rightarrow → C/C++ General → \rightarrow → Paths and Symbol
然后,选择GNU C 在Includes标签下选择Add,将你工程的head文件夹添加进来,就找得到头文件
Autogen 由software component工具生成,每个工程各不相同,里面都是组件的驱动文件例如蓝牙硬件的驱动,gatt协议,gatt数据库,命令行组件等。
Config配置文件目录,存放各个组件的配置,例如led硬件引脚定义,时钟配置等
Gecko_sdk_4.4.0:EFR32的sdk目录:app目录存储了mcu,board的example,hardware存储了开发板的支持库,platform存储了外设库函数,cmsis头文件等。GNUARM存储了编译后的可执行文件和分散加载文件,util中存储了第三方库 例如tiny printf。
App.c和app.h用户代码文件。Main函数主程序。
.Pintool 用于分配引脚功能
.Slcp文件工程的配置文件,可以在此去图形化配置芯片功能
2.softrware component 简介
点击slcp文件,到如图界面
再点software component ,到如图
左边是芯片支持的组件,以层级形式排列。右边是具体的LED组件,它在platform->LED->simple led下,右边视图里显示了组件描述,该组件依赖的其他组件,相关文档.
下图显示了simple led的组件依赖。
包括Led的驱动文件,片上外设的用到的驱动文件时钟管理单元,GPIO库文件,设备状态文件。在之后写的代码分析中会看到组件的源代码在工程中的使用。
该如何找需要的组件。
以button为例。
一个组件一个组件的看。
右上角的搜索框搜button
左侧会显示,含有button关键字的所有组件。
点击install添加simple button库,他会自动下载相关依赖。
创建具体的button实例并起个名字,之后选择done。
添加了一个bt0的实例
-
发表了日志:
EFR32MG24工程文件分析