在实际项目中经常遇到一些小问题,解决后不足以写个博客,所以就开个文章写些杂七杂八的东西,当作小知识经验总结。
一、DA14585复位框图理解
已知DA14585复位信号有三类,当信号有效时会启动POR Timer,若达到设定的值则POReset有效,复位成功。
二、C语言除法”四舍五入“与“进一法”的实现
R:计算结果 a:被除数 b:除数:
1(四舍五入) : R=(a+(b/2))/b
2(进一法) : R=(a+(b-1))/b
三、DA14585如何将数据追加给扫描响应包
app_easy_gap_undirected_advertise_start_create_msg函数用于广播包组包,该函数中会对广播包的剩余长度进行判断,如果不够的话会将多余的数据写进扫描响应包,所以要做的事情就是修改该函数,直接将项目需要的包写进扫描响应包,这里还要主要一个追加函数:app_add_ad_struct()这里面可以将一些数据追加给广播包还是扫描响应包,至于扫描响应包如何被585主机读取,需要将主机的扫描模式设置下。
四、字节对齐一定要成对出现
转自:https://blog.youkuaiyun.com/wanxuexiang/article/details/86658855
在我们代码里若需要按照自己的方式对结构体进行字节对齐,那么在使用完成后一定要使用语句#pragma pack(pop)或#pragma pack(pop)恢复之前的对齐方式,因为可能自定义的方式不适用于底层,如下,之前我在自定义1字节对齐后没有恢复对齐方式,导致蓝牙底层传上来的数据错误,之前考虑过代码量太大导致的,找了很久原因才发现是字节对齐后没恢复本来的方式,特此写出来。
#pragma pack(1) //这里打开会导致接收的蓝牙数据出错
// Data ADV structure type
typedef struct
{
uint8_t thmmtr_data_integer;//温度数据整数
uint8_t thmmtr_data_decimal;//温度数据小数
}thmmtr_data_t;
typedef struct
{
uint8_t data_structure_size;
uint8_t data_structure_type;
module_state_t module_state;//开关机状态
batt_state_t batt_state;//低电量报警
thmmtr_measure_t thmmtr_measure_state;//温度测量状态
thmmtr_data_t thmmtr_data;//温度数据
thmmtr_state_t thmmtr_state;//温度报警
uint8_t batt_perct;//电量最大100%
}data_structure_t;
#pragma pack()
五、DA1458x系列芯片的BUCK和BOOST模式问题
总所周知,585的供电范围可达0.9-3.6V,这其中就用到了降压与升压模式
其中,32k晶振可在BUCK模式下省掉,以节约成本,但是BOOST模式时不能省,因为会引起芯片内部电源模块启动不稳定导致芯片有可能起不来。一般情况,纽扣电池供电时用BUCK模式,同时可省掉外部32k晶振,采用内部32k;1.5V碱性电池供电时用BOOST模式。
那么,判断是哪种模式主要看VBAT1V脚,如果接地了就是BUCK模式,接电源则是BOOST模式。