自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(115)
  • 收藏
  • 关注

原创 ESP-IDF:错误代码和错误辅助函数

错误处理:保证应用程序的健壮性,常见错误分成两类,如下所示可恢复的错误:通过函数的返回值(错误码)表示的错误使用 throw 关键字抛出的 C++ 异常不可恢复(严重)的错误:断言失败(使用 assert 宏或者其它类似方法,可参考 Assertions)或者直接调用 abort() 函数造成的错误CPU 异常:访问受保护的内存区域、非法指令等系统级检查:看门狗超时、缓存访问错误、堆栈溢出、堆栈粉碎、堆栈损坏等错误的处理主要是处理可恢复错误,不可恢复错误的排查另开一篇研究。

2024-07-26 10:24:48 1526

原创 ESP32和mDNS学习

目录mDNS的作用mDNS涉及到的标准文件组播地址IPv4 多播地址IPv6 多播地址预先定义好的组播地址mDNS调试工具例程mDNS如何开发和使用注册服务查询服务mDNS的作用mDNS 是一种组播 UDP 服务,用来提供本地网络服务和主机发现。你要和设备通信,需要记住IP地址不好记。用了mDNS只要几个名字就行。你需要快速知道局域网内是否有你想要的服务,用mDNS查一下就行。这个协议只在局域网内有效。先简单了解下什么是组播–一种被预先定义好的IP地址数字。用于实现一对多的通信。组播是一对

2024-07-25 11:17:42 1367

原创 zephyr BLE创建自定义服务

定义 GATT 服务及其特性的 128 位 UUID。包括服务UUID,特征的UUID。0X000015230X12120XEFDE0x15230x000015240x12120xefde0x15230x000015250x12120xefde0x1523创建服务并将其添加到蓝牙 LE 堆栈。通过宏BT_GATT_SERVICE_DEFINE()静态创建和添加服务创建并添加自定义按钮特征。创建自定义LED特征实现上面的read_button和write_led函数。

2024-07-17 17:22:08 459

原创 蓝牙BLE的数据交换

不同的 GATT 操作在两个连接的蓝牙 LE 设备之间表示和交换数据GATT分为GATT服务器和GATT客户端。服务器可以直接向客户端发送数据,或者客户端可以从服务器轮询数据。为了让客户端知道从服务器请求什么,它需要知道 GATT 服务器提供哪些服务和特性。因此,客户端将在连接开始时执行服务发现。服务可以有零个或多个特征定义(通常称为特性)。特征至少由两个属性组成,也可以由多个属性组成。特征由三部分组成:特征声明属性:保存有关特征值属性的元数据。特征值属性:保存实际的用户数据。

2024-07-17 11:33:18 766

原创 zephyr BLE连接过程和连接参数更新实例

1.引入连接头文件定义连接和断开的回调函数将回调函数放入bt_conn_cb 类型变量,待会注册回调函数需要用到。注册回调函数编译和运行。

2024-07-17 10:38:03 239

原创 蓝牙BLE连接过程和参数

低功耗蓝牙中实现双向通信的最常见方式是使用连接对于简单的应用程序,默认连接参数可能工作得很好,但您也可以调整这些参数以最适合您的应用程序,为您提供最低的功耗,或实现您需要的吞吐量。

2024-07-17 09:42:43 561

原创 zephyr设置BLE广播数据实例

这个宏,默认会开启广播支持 ( BT_BROADCASTER) ,使用softDevice控制器 ( BT_LL_CHOICE= BT_LL_SOFTDEVICE),发射功率为0dBm( BT_CTLR_TX_PWR = BT_CTLR_TX_PWR_0)。广播参数的控制,广播参数放在bt_le_adv_param变量里面。由于此变量需要初始化内容太多,因此使用宏 BT_LE_ADV_PARAM()来帮助初始化。3.修改广播的内容,主要是修改flag的内容,在第7步,函数是动态更新广播数据。

2024-07-16 17:05:34 1093

原创 蓝牙BLE广播

这里只讨论蓝牙BLE广播这部分可以看蓝牙标准Core Specification V5.3的卷3 Host part C。当然广播参数那一块和“控制器”层有关,只需要了解广播参数的含义和设置方法就行,控制器的细节不太容易理解。

2024-07-15 11:38:44 1152

原创 心率服务heart rate profile和service解析

用于健身应用的心率传感器主要是两个关键的标准文件prifile是总的:描述要实现心率测量,需要定义两个角色(一个收,一个发)。每个角色要定义什么服务。角色之间是怎么建立连接的,还有安全要求。(这一部分通常有例程,关心的较少)service是分的,讲了怎么表示心率数据。心率服务的数据包含的特征。(一般后面代码用到这一份标准多。所以下面的内容,也是会先profile一个章节,然后service一个章节。我当期看的版本是2011-07-12。

2024-07-12 16:11:26 971

原创 ATT 和 GATT:数据表示和交换

BLE的通信和以太网,wifi有个重大的不同是:BLE通信的设备往往有特定的功能。且这个功能不会在运行中发生变化。因此蓝牙设备通信的时候,只能访问预先定义好的(也就是配置文件profile)的功能。那profile里写了啥?写了服务,服务里写了各种功能属性(如温度,湿度,开关状态等非常多)。怎样表示属性,使用ATT(属性协议),很多零散的属性,怎么组织起来,设备之间怎么沟通,就通过GATT协议来实现。所以ATT是GATT协议的基石。GATT实现了通信的整个过程的各种细节。

2024-07-11 13:00:47 470

原创 2.GAP:通用访问协议

设备要连接上,必须有人发起连接,有人接收连接。主要是有些场景,设备直接不需要建立连接,他只需要周期性的广播自己的信息,或者持续的监听有没有设备广播新的数据就行。GAP的Peripheral,负责广播自己,让有需要和我通信的人可以连接我,平时无线电关闭状态。这两种角色,可以认为是Central(中央设备)和Peripheral(外围设备)的特殊用法。GAP的Central是负责扫描(或叫接收)蓝牙广播的,常见为手机,PC这种设备。只要是设备之间多起来,就可以形成网络,那么他们就会有网络关系,也就是拓扑结构。

2024-07-11 11:54:14 399

原创 1.浅谈蓝牙BLE的总体框架

这里只展开BLE这一部分,框图如下所示蓝牙也是使用分层的结构组织代码。:是自己的业务逻辑实现的地方。当然应用程序需要根据BLE的规定,实现配置文件(profile)、服务(service)和特征(character)。:这一部分实现蓝牙如何存储和交互数据,也涉及到数据加密的部分:控制层将蓝牙数据通过无线电发送出去,这一部分是硬件强相关的,且往往是闭源的。nordic的这部分也是闭源。Controller可以先不研究,一般都挺稳定的,毕竟nordic需要自己负责这部分的稳定性。

2024-07-11 11:15:10 405

原创 Nordic 蓝牙5产品简介

nRF52系列多协议 SoC性能卓越,支持蓝牙 5。nRF52840 支持蓝牙 5 的所有新功能,而其他成员支持除长距离模式之外的所有蓝牙 5 功能。nRF52 系列设备涵盖从基本到通用再到高度复杂的蓝牙 5 设备。该系列中的所有设备均由合格、高性能、生产级软件堆栈支持。如下图,之前只有1Mbit速度,现在最大可以选择2Mbit。使用拓展广播,将数据引导到非广播通道发送,提升广播容量。增加了发射功率,提高了距离。

2024-07-11 10:51:18 309

原创 驱动OLED SSD1306的笔记

这里用的OLED模块是SSD1306的。

2024-03-08 15:55:06 431

原创 ESP32 操作AT24C32或AT24C64

容量有两个型号AT24C32/64 提供32,768/65,536 bits ,也就是4096字节(4k字节)或8192字节(8K字节)Flash 在写入前,需要擦除,且擦除是按照page进行的。比如spi flash。设备地址,如果引脚A0~A2都接地,则IIC地址为0x50.EEPROM在写入前不需要擦除page,直接写入就行。使用16bit来确定存储的地址。有引脚可以配置IIC的地址。电压2.7V-5.5V。每个page 32字节。

2024-01-28 10:32:56 1105

原创 ESP32操作DS18B20

供电电压3-5.5V待机电流750nA,活动电流1mA一线通信方式,信号引脚为开漏结构硬件供电方式有两种接法。常规供电或总线总线。

2024-01-26 15:20:25 1898

原创 esp32 操作DS1307时钟芯片

有VCC供电,IIC活动状态是1.5mA,待机状态200μA,电池电流5nA(MAX=50nA)无VCC供电的时候,电池电流,300nA(时钟运行),10nA(时钟停止)供电电压是4.5-5.5V,不支持3.3VIIC频率最大400kHZ。

2024-01-26 11:25:47 1674

原创 mobaxterm免费版使用的一个坑记录

mobaxterm工具使用

2022-09-25 23:43:25 1367 1

原创 NRF52832 SAADC 多通道双缓冲的理解

为了实现ADC采样速度更快,可以使用双缓冲功能。先说下SAADC的工作模式一、SAADC的工作模式根据规格书SAADC共有4中工作模式:one shot、Continuous mode、Oversampling、Scan mode。one shot:一次触发,只运行单个通道,采样一次。Continous mode:持续触发模式,本质是通过timer定时去不断的one shot。Oversampling:过采样,是为了提高信噪比,增加数据的准确性。缺点是采样速度变慢,数据变的平滑。Scan mod

2021-11-16 11:31:01 2483 1

原创 N76E003 串口ISP如何使用

1.所需硬件, N76E003开发板,USB2TTL串口线,NU-LI烧录器2.所需软件。官网ISP源码。对应的工程是如图所示工程。https://github.com/OpenNuvoton/N76E003-BSP3.和普通的工程一样,使用NU-LINK将工程烧录进IC就行。4.将串口线连接到UART0接口。P0.6和P0.75.打开ISP程序。如下1.选择UART,2.选择对应串口号,3.选择APROM。4.选择dataflash(如果没有设计这部分就不选)5.设置setting(注意根据情

2021-04-30 15:52:50 1175 1

原创 N76E003使用DATAFLASH调试技巧总结

使用内置的FLASH做DATAFLASH是经常做的事情。1.N76E003的page是128字节。因此每次擦写都是128字节2.写入前需要先擦除,否则写入的数据会出问题。3.烧录程序的时候。需要看是全片擦除还是部分擦除,还是不擦出。全片擦除会把写进去的数据擦除掉。4.有建议说从末尾倒着写dataflash。目的是防止覆盖了代码。看需求把。感觉做好空间规划就行。倒着写不太符合思维。5.可以用debug的memory窗口查看到flash的数据,如图6....

2021-04-30 10:50:49 1279

原创 N76E003 串口的时候用和printf初始设置

N76E003的共两个串口。每个串口有多种工作模式。具体可以看规格书以及BSP包例程。为方便日后使用。做简要的总结。1.初始化开发中。常用的是串口模式1.其初始化代码如下:因为串口的发送需要用到定时器(产生波特率需要用到)。UART0可选择有TIMER1和timer3。UART1只有TIMER3UART0void InitialUART0_Timer1(UINT32 u32Baudrate); //T1M = 1, SMOD = 1void InitialUART0_Timer3(UINT3

2021-04-29 11:21:52 1051

原创 新唐M0内核。接口的TTL电平和斯密特电平的使用

TTL电平在默认情况下。接口是TTL电平的。其高低电平的阈值如下举个例子。当电源电压为3.3V的时候。IO口电压为1V是。MCU就认为是低电平。当为1.08V是,IO口就认为是高电平。连个阈值的宽度只有0.08V。非常小。、斯密特电平有些项目需要把阈值拉宽,防止误触发和抖动。可以使用斯密特电平来实现。举例。斯密特触发下。如在3.3V供电的情况。低于0.99V为低电平。高于2.31V为高电平。这里有个很重要的。规格书只是给出了最大值和最小值,没有给典型值。我实测是高于2.8V为高电平。 低于

2021-04-25 10:29:07 1029

原创 NRF52 SAADC操作和对输入电压的要求

NRF52 内部的AD是逐次逼近型,差分输入AD。其主要特性记录如下:1.单端模式下的话。反向端N就会接地。2.输入电压不能低于0V。当小幅度低于0V的时候,会产生一个负数的输出。3.输入电压不能超过3.6V。超过之后,就会被内部的电路钳制。导致测量数据出错。4.AD带接口电阻(RESP或RESN)。但是没有看到电阻的阻值。只看到可以上拉,可以下拉。一般都是选择不使用。5.AD带有增益选择GAIN。这个增益是为了测量准确性。当测量信号小(如小于1V)时。可以使用高增益来实现测量。当测量信号比较

2021-04-23 17:40:24 698

原创 新唐M0 内核 FLASH操作认识和总结

本文不对代码做详细解析。先说结论,和常见问题结论结论1:FLASH在操作的时候,需要先“擦除”。然后在“写入”。结论2:擦除需要一整块擦除。不能只擦除某几个字节。结论3:写入是可以按照字节这样写入的。但是“结论1”的存在。导致写入也整片写入。否则数据就会丢失。结论4:写入可以写0 。不能写1.如果要写1.必须先“擦除”。问题:如果不按照如上结论来做。会怎样呢?分析如下。============================ 验证1=============================

2021-04-23 15:03:56 1703 1

原创 python 用字典实现类似switch的命令行功能选择

python没有switch关键字。所以如果想实现类似下面的C++代码。可以使用多重if-else实现。这里提供一个用字典实现的方法。1.构建一个字典。前面key的数字代表用户输入的功能序号。后面的value代表对应的功能函数。这些函数就是一个普通函数根据业务需求另外实现。不做具体展开 self.choices = { "1": self.generate_hex, "2": self.generate_OTA_file,

2021-04-16 17:34:48 488

原创 NRF52832 开启看门狗

配置SDK.CONFIG,如下两个需要使能。添加库文件初始化 //Configure WDT. nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG; err_code = nrf_drv_wdt_init(&config, wdt_event_handler); APP_ERROR_CHECK(err_code); err_code = nrf_drv_wdt_channel_alloc(

2021-04-13 15:33:29 383

原创 NRF52832 错误代码8198的处理

在开发过程中,发生如下错误提示。<error> app: ERROR 8198 [Unknown error code] at F:\project\my-test-embedded\tools\uart_ble_nRF5_SDK_15.2.0_9412b96\examples\ble_peripheral\ble_app_uart\main.c:329PC at: 0x0002E957通过查看代码,发现是进入sleep的时候,发生了错误。此错误的原因是。正在debug的过程中。1.因

2021-04-13 12:25:04 3799 2

原创 NRF52832添加UUID后,提示NRF_ERROR_NO_MEM

通过DEBUG跟踪后,发现是调用函数err_code = sd_ble_uuid_vs_add(&base_uuid, &p_led->uuid_type);是发生错误。提示sd_ble_uuid_vs_add是softdevice的函数。通过查阅资料。发现是sdk_config.h没有相应增加宏NRF_SDH_BLE_VS_UUID_COUNT的数量。导致错误参考资料https://devzone.nordicsemi.com/f/nordic-q-a/36218/sd_

2021-04-08 18:03:46 760

原创 NRF52832 BLE手机控制LED灯亮灭

手机APP使用到的是NORDIC官网下载的nRF ConnectBLE通信的载体都是通过数据文件或属性文件来实现。也就是profile。他们的层级关系是这样的在BLE协议栈里面可以定义很多的profile。定义很多的server,每个server也可以定义很多的characteristic。--------------------------------------------------分割线-----------------------------------------例程解析main函数

2021-04-08 16:52:52 868

原创 NRF52832串口的使用

在开发nrf52832主要遇到如下问题。但仍然有printf重定向问题未解决。因不影响项目使用。先把过程记录下来。方便日后翻阅。NRF52832的串口有一个例程:nRF5_SDK_15.2.0_9412b96\examples\peripheral\uart\pca10040\blank\ses串口有普通的uart和使用TE的uart。TE就是TASK and event。是IC内部的一个工作机制。将事件和任务关联起来。目的是快速响应。两种串口使用的初始化函数不同。如下是例程的串口初始化代码

2021-04-07 10:49:04 2408

原创 NRF52832 ADC的采样触发和采样速度的分析

如何使用ADC 能找到一些例程。但是ADC是怎么控制采样速度的。有两种AD的采样模式:阻塞(blocking mode)和非阻塞(no-blocking mode)阻塞模式:调用函数:nrf_drv_saadc_sample_convert完成采样。采样完成后return采样值。非阻塞模式:此模式触发方式有两种CPU显式触发或使用PPI。1.CPU显式调用函数nrf_drv_saadc_sample实现触发。触发后会调用ADC初始化时写入的回调函数。2.使用PPI,调用函数nrf_drv_sa

2021-04-06 15:39:00 2950

原创 nrf52832-SDK 外设例程如何打开RTT调试输出

1.设置编译输出为DEBUG。2.需要配置SDK_CONFIG.h才能设置NRF_LOG_BACKEND_RTT_ENABLED宏为1其初始化代码如下: uint32_t err_code = NRF_LOG_INIT(NULL); NRF_LOG_DEFAULT_BACKENDS_INIT();//输出错误log信息的函数NRF_LOG_ERROR("SAADC HAL simple example started.");...

2021-04-06 14:02:33 527

原创 NRF52832 SDK timer函数编译报错的问题总结及对SDK宏套路的理解

在使用nordic官方SDK的时候,尝尝会看到nrf_xxxx和nrfx_xxx这样的函数开头或文件名开头。其区别是nrfx开头的是对以前代码的扩展或升级。这就有个问题。新软件对就软件的兼容性问题。为了解决这个问题。NORDIC的官方SDK的宏定义系统做的非常复杂。 初次看,很让人一头雾水。为了方便日后查看。对这两天的摸索做一个总结。我的SDK版本是15.2。通过研究发现,不同版本,变动还挺大。所以可以仔细研究下。宏定义主要在如下两个文件中1.sdk_config.h :新的SDK配置,基本都

2021-04-02 11:00:38 568

原创 新唐帶隙電壓(Band-gap)的初学者疑问

Q:为什么要读取Band-gap电压。A:因为想提高AD的精度。Q:既然芯片UID都能读取Band-gap电压值了,为什么还要用AD去读取。A:因为要反推出VDDQ:VDD是干什么的?和AD的关系是?A:VDD是给IC供电的,同时为AD提供参考电压。参考电压的大小,会影响AD的输出值。研究下AD的原理,就知道这个参考电压会影响AD输出值。Q:VDD不是固定是5V或3.3V吗,直接用不就行了?A:因为新唐的IC工作电压范围很宽,且VDD不一定要这几个典型值。所以为了保证AD的精度。需要去反推VD

2021-02-23 17:46:41 2036

原创 新唐MCU资料的寻找方法

刚接触新唐这个品牌的MCU。感觉这个IC的官网资料挺乱的。资料的管理不太友好。研究一段时间后。把一些寻找资料的主线记下来。内容不追求大而全。只记录主线。相信随着时间推移。官网的资料会整理越来越清晰。1.分清自己IC的内核。比如8051,M0,M4等等好几个。2.找到IC对应的系列。有很多系列。如果不清楚是哪个。就一个一个点开看看。另外有一份选型手册可以研究下。可以大概滤清脉络。选型手册名叫:Nuvoton-MCU-PSG-SC-2021.pdf3.进入芯片页面,可以下载对应的工具和软件。4.我认为最

2021-02-18 08:35:45 849

原创 MobaXterm报错:MobaXterm X11 proxy: Unsupported authorisation protocol

可以使用mobaXterm 图形化界面打开某些程序,这个功能很好用,但是有可能因为配置文件不存在导致开启失败,如下所示,打开gedit报错。解决方法有两个:方法一:使用root账户登录一次。mobaXterm 就会自动在用户目录下创建.Xauthority文件方法二:cp /xxx/.Xauthority /home/root/.XauthorityXXX为你当前的用户名。...

2021-01-08 14:25:09 15284 4

原创 armbian源码解析

编译系统从compile.sh开始,所以从这个地方开始1.判断代码路径是否合法,主要是判断是否包含空格。SRC="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"# check for whitespace in ${SRC} and exit for safety reasonsgrep -q "[[:space:]]" <<<"${SRC}" && { echo "\"${SRC}\" contains whitesp

2020-09-09 14:28:22 1402

原创 VMWARE虚拟机更新Ubuntu卡在登陆界面的问题解决

昨天在搭建开发环境的时候,需要安装一些图形包和升级系统的组件,升级重启后,发现系统进不去了。如下图所示。我的是VMWARE虚拟机,不存在独显驱动问题。所以排除这个问题。将lightdm组件重新装一次,问题可以解决。步骤如下:1.重启,看到如下界面,按esc,并进入Advanced options for ubuntu—>Recovery mode2.开启网络3.进入Root账户:需要输入密码4.sudo apt-get purge lightdm 清除lightdm

2020-09-09 10:07:08 4297 2

原创 jupyter的简单使用

感觉jupyter的notebook功能挺方便的。这里简单记录下安装pip3 install jupyter安装需要下载安装很多文件,有可能会失败,重新试几次,不行就只能更换pip源启动并设置密码1,生成jupyter的配置文件:jupyter notebook --generate-config2,控制台继续输入:jupyter notebook password (会输入两次密码,用来验证)3.启动程序jupyter notebook --ip=0.0.0.0打开一个浏览器,输入IP:8

2020-06-06 18:35:12 457

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除