自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 资源 (3)
  • 收藏
  • 关注

转载 stm32中断相关寄存器

STM32_NVIC寄存器详解在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体:typedef struct { vu32 ISER[2]; //2个32位中断使能寄存器分别对应到60个可屏蔽中断 u32 RESERVED0[30]; vu32 ICER[2]; //2个32位中断除能寄存器分别对应到60个可屏蔽中断 u32 RSERVED1[30]; vu32 IS

2021-02-18 21:42:35 1097

转载 S3C2440运行裸机小程序需烧录到NAND Flash

对于韦东山的S3C2440开发板,当运行LED等简单的小程序时,必须烧录到NAND Flash,原因如下:(1)NOR Flash虽然可以向内存一样进行读操作,但不可以像内存一样进行写操作,所以假如要从NOR Flash启动,一般先在代码的开始部分使用汇编指令初始化外接的内存器件(外部RAM),然后将代码复制到外存中,最后跳转到外存中继续执行。(这段初始化代码比较复杂,需要后面再学习)。(2)S3C2440中有称为“Steppingstone”的4KB内存RAM,当选择从NAND Flash启动CPU时

2020-08-11 22:46:29 311

转载 函数返回局部变量

一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。下面以函数返回局部变量的指针举几个典型的例子来说明:#incl

2020-07-29 09:25:37 1945

转载 C语言中不同类型数据之间的赋值

整数与整数之间一、长度相等(在内存中存储的位数相等)的两个不同的类型的数据之间的赋值在计算机中的存储内容不变,只是数据按照不同的编码格式来解析。二、长 赋值给 短 (短 = 长)截取低位,然后按照短整数的数据类型解析。三、短 赋值给 长 (长 = 短)其中,短转长又分为三种情况:1. 两个数据都是无符号的数据,短整数直接高位补0。2. 两个数据都是有符号的数据,短整数进行符号位扩展。3. 两个数一个是有符号数,一个数是无符号数,那么先将短整数进行位数扩展,过程中保持数值不变,然后按照长

2020-07-18 22:08:39 5380 1

转载 循环队列FIFO

1.概念为充分利用向量空间,克服顺序存储结构的"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。使用求余运算可以判断队列是否已满。2.代码//circular Queue 循环

2020-07-04 11:55:42 568

转载 函数返回局部变量

一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意...

2020-04-12 10:24:52 346

原创 packet sniffer抓包

问题:用packet sniffer 抓到数据包,display filter 可以通过把pty = empty pdu只显示 空包,pty还有其他值可设,只显示control 或L2CAP-S 类型的答案:I use the SmartRF™ Packet Sniffer software.In the “Display filter” tab, “Filter name” = Data T...

2020-03-19 14:57:36 780

原创 TI CC2540 USB CDC问题

1.蓝牙开发过程中,会用到OAD功能,搭建环境时,可能遇到驱动安装问题。安装cdc驱动后,显示在网上查找很久,尝试了很多方法,都未解决。如https://www.cnblogs.com/small-T87-love-mam/p/4376139.html的解决方案。进行最后的尝试,重装系统。重装系统后,安装cdc驱动,会出现如图此时,将usbser.sys文件放到相应文件夹,重启电...

2020-03-10 12:30:37 537

转载 收藏

uboot分析:uboot的启动过程分析https://www.cnblogs.com/linfeng-learning/p/9284060.html

2019-11-14 14:18:04 96

转载 C语言总结导图

C语言学习思维导图1.C语言程序设计知识总体结构2.程序设计基础3.选择结构与循环结构4.数组5.指针6.函数7.结构体、链表与共用体8.编译预处理、文件1.C语言程序设计知识总体结构2.程序设计基础3.选择结构与循环结构4.数组5.指针6.函数7.结构体、链表与共用体8.编译预处理、文件...

2019-10-25 15:53:28 488

转载 sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

https://www.cnblogs.com/zpcdbky/p/5857656.html

2019-10-25 12:53:04 98

原创 C++

临时对象产生主要有以下三种情况, 以值的方式给函数传参 隐式类型转换 函数返回一个对象时

2019-10-24 08:55:53 110

原创 c语言总结二

1.register关键字  register修饰目的:申请将变量存放到寄存器中(早期的C编译程序不会把变量保存在寄存器中,当时register修饰符是一种很有价值的补充。现在基本上会忽略register修饰符)  register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。  只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量,局部静态变量...

2019-09-16 16:17:00 104

原创 函数返回值

在C语言中,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存就会被释放。如果函数只是返回局部变量,那么这个局部变量会被复制一份传回被调用处。但是如果函数返回的是局部变量的地址,那么就会报错,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放,这样指针指向的内容就是不可预料的内容,程序就会出错。准确的来说,函数不能通过返回指向栈内存的指针(返回指向堆内存的指针是可以的)。...

2019-09-13 22:27:47 228

转载 char *p = "hello world!"

很多人犯过这个错误,比如声明char *p = “hello world!”;却妄图用p指针改变字符串内容,所以就这个问题,我总结了一下。主要解析的问题:问题1:#include "stdio.h"char *get_string_1(){ char p[] = "hello world!"; return p;}char *get_string_2(){ ...

2019-09-06 18:07:56 5008 6

原创 变量在内存存储

对于一个完整的程序:内存分布有如下几个区、栈区、堆区、全局区、常量区、代码区。载自:https://baijiahao.baidu.com/s?id=1610294240775354689&wfr=spider&for=pc...

2019-09-06 11:29:04 107

原创 C中类型转换一

计算机硬件进行算术操作时,要求各操作数的类型具有相同的大小(存储位数)及存储方式。但是,实际由于 C 语言编程的灵活性,在一个表达式或一条语句中,允许不同类型的数据混合运算。此时就需要进行类型转换。类型转换包括强制类型转换和隐式类型转换。隐式类型转换原则:1.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型2.当函数调用时,所传实参与形参类型不一致时,也会把实参自动转...

2019-09-06 10:19:34 285

原创 cc2541低功耗

我们来总结一下实现方法:1,有定时器在跑时会一直跑在 PM2 最小系统电流在 300uA左右。没有定时器跑后会到 PM3 , 电流会少于10uA 。这个定时器是指 osal 的定时器,例如:启动 了osal_start_timerEx( keyfobapp_TaskID, KFD_TOGGLE_BUZZER_EVT, 2000 );但没到时间:需要说明的是 keyfob 中的 ...

2019-09-02 15:52:34 700

原创 c语言总结

1.浮点数理解float能表示的具体数字的个数与int相同float可表示的数字之间不是连续的,存在间隙float只是一种近似的表示法,不能作为精确数使用2.变量类型转换强制类型转换目标类型能够容纳目标值:结果不变目标类型不能容纳目标值:结果将产生截断注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,编译器将产生错误信息。隐式类型转换低类型向高类型的转换是安全的...

2019-07-15 17:40:33 110

转载 arm-linux-gcc 常用参数

我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)Linux程序员...

2019-06-18 17:29:41 375

原创 ble问题总结

怎么通过 通知功能 发送100以上字节的数据到主机,关于分包发送,我没有搞明白怎么做?答:1.启动个定时器,在定时器处理事件里调用4次notification函数,每个函数写20字节  2.定时器的启动时间,不能低于连接间隔  比如:用一个定时器,每间隔20毫秒发20个字节, 连接间隔小于20ms....

2019-06-18 09:10:20 286

转载 ble属性数据库

这里只介绍常用的一些概念,一些极少用到的概念为避免混淆这里不做介绍。简单的来说,BLE的服务端属性数据库可以就看做是一张表。表中包含很多个条目。每一条条目就称为属性条目。服务端,比如一个简单的防丢器。当连接后作为服务端时,其中可能包含有好几个服务,像是 设备信息服务 电池服务 警告服务等, 这些服务创建后都是存在数据库中,都是以一条条属性条目的形式存在于数据库中,那如何区分这些服务?区分的...

2019-05-17 14:19:08 521

转载 __attribute__ ((packed)) 和 __attribute__ ((aligned(4)))的用法

1、 attribute ((packed))的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。2、 attribute ((aligned(n)))的作用就是告诉编译器在编译过程中按照n字节对齐。常常用来在结构体后面进行修饰。#include <stdio.h>/*编译器默认是4字节对齐*/struct test{ ...

2019-05-15 00:03:54 5829

原创 交叉编译工具

arm-linux-gcc -c -o led.o led.S arm-linux-ld -Ttext 0 led.o -o led.elf arm-linux-objcopy -O binary -S led.elf led.bin arm-linux-objdump -D led.elf > led.disarm-linux-gcc -c -o led.o l...

2019-05-06 22:21:44 171

原创 增加特征值 CHAR6

1.这个 simpleGATTprofile.h 实现的是 TI 自定义的 5 个 profile, 我们在此基础上增加CHAR6增加 CHAR6 的 profile 参数增加该特征值的 UUID增加该特征值的长度,实际传输数量是任意长度。returnBytes 就是返回多少个字节的意思, 这里正好对应到上面所说到的 “我们传输的数据长度是随意的” simpleGATTprofil...

2019-05-05 17:34:57 390

原创 BLE实例-传感器采集

1.performPeriodicTask函数中if ( events & SBP_DHT11_READ_HUMITURE_EVT ){ //关总中断 EA = 0; //采集 DHT11 温湿度 DHT11_Read_Humiture(sbDHT11_data); //开总中断 EA = 1; //启动定时器执行串口打印 DHT11 温湿度事件 osal_start_...

2019-05-05 15:43:36 508

转载 IIC中断和非中断模式

对iic总线来说工作在中断和非中断模式在时序上是相同的,只不过在非中断模式下是通过检测ACK信号来判断从设备响应了,在中断模式下是通过中断信号来判断从设备响应了,一般是读主CPU侧的iic控制器的中断标志来判断的。master发送slave地址后接收到ACK信号然后产生中断,slave 接收到的数据是自己的地址时会产生中断。如果在进行了一个操作从设备没有中断信号响应的话,那么iic的SCL会...

2019-05-04 22:28:53 9754

原创 BLE应用程序初始化

应用程序初始化分为两个阶段:其中,PeripheralOSAL调用SimpleBLEPeripheral_Init()函数,这一初始化函数设置GAP任务配置文件参数、GAP特性、GAP绑定管理参数、GATT配置文件参数,通过设置一个操作系统虚拟层的SBP_START_DEVIC_EVT事件来触发第二阶段初始化。第二阶段,调用SimpleBLEPeripheral_ProcessEvent(...

2019-04-29 17:57:17 425

原创 选择DC/DC还是LDO

LDO:LOW DROPOUT VOLTAGE LDO(是low dropout voltage regulator的缩写,整流器)低压差线性稳压器,为线性的稳压器,仅能使用在降压应用中。也就是输出电压必需小于输入电压。优点:稳定性好,负载响应快。输出纹波小。缺点:效率低,输入输出的电压差不能太大。负载不能太大,目前最大的LDO为5A(但要保证5A的输出还有很多的限制条件)DC/DC:直流...

2019-04-26 16:29:14 399

转载 蓝牙GATT层

蓝牙理论篇1.什么是蓝牙4.0BLE协议栈协议定义的是一系列的通信标准 ​ 协议栈则是协议的具体实现形式,也即协议栈是用代码实现的函数库2.如何使用蓝牙4.0BLE协议栈协议栈已经实现了蓝牙4.0BLE协议,在开发过程中不必过多地关注协议的实现细节。但要关注最核心的一个问题:应用程序数据从哪来?到哪去?协议栈很多版本,不同厂商不尽相同。要知道数据从哪里到哪去,需要对协议栈的基本构成与内部...

2019-04-25 17:34:05 576

原创 BLE协议结构图

BLE协议结构图第一层:physicallayer(物理层)信道带宽提供2M,提供三个广播信道1M。第二层:link layer(链路层)执行一些基带协议,底层的数据包管理协议。第三层:host controller interface (主机控制接口层)提供主机与控制层 的通讯方式,以及命令格式,重用蓝牙标准,比如一些串口,USB等等。第四层:L2CAP(逻辑链路于适配器协议层)...

2019-04-25 16:31:13 888

原创 测量代码运行时间

1.JLINK测量在工程设置中“Debug”下,按照下图设置,选右边硬件仿真,点下拉框选“J-LINK/J-TRACE”,再点“Setting”在弹出窗口中“Debug”下,选“JTAG”或“SW”,在后面选好下载速率。点到Trace”标签下,如果是选择的“SW”则勾选“Enable”选项,在“Core”框中输入MCU实际工作时钟频率(就是单片机以什么频率来执行指令的,MDK会用它来计...

2019-04-25 10:59:30 1269

转载 ICALL 技术

阅读simpleLink MCU工程源码的过程中,遇到一个叫做Icall的东西,具体是干什么用的呢? 原来就是个中间件(middleware),做过C/C++跨平台开发的人,都知道,要想实现跨平台,必须使用平台无关的API来进行开发,否则一定会遇到移植到其他平台无法使用的问题。java技术之所以能做到一次开发,到处运行,原因就是有一个JVM的东西,作为平台和application的中间件,起到了...

2019-04-23 17:01:31 1033

转载 linux内核的gpiolib详解

linux中从2.6.35以后就开始有gpiolib库了,gpiolib的作用是对所有的gpio实行统一管理,因为驱动在工作的时候,会出现好几个驱动共同使用同一个gpio的情况;这会造成混乱。所以内核提供了一些方法来管理gpio资源;转自:https://www.cnblogs.com/linux-37ge/articles/10215100.html...

2019-04-21 12:55:58 122

原创 led驱动框架

驱动本质是:通过读写/sys/class/leds/xxx内的文件,触发led_classdev(设备体)内的函数,从而实现操作硬件。/sys/class/leds/xxx内的文件创建过程led_classdev_register这个函数其实就是去创建一个属于leds这个类的一个设备。首先填充设备体,这个设备体就是我们定义的一个led_classdev类型结构体,它里面集成了所有的操...

2019-04-20 23:08:14 328

转载 内联函数

内联函数在C++中我们通常定义以下函数来求两个整数的最大值:复制代码 代码如下:int max(int a, int b){return a > b ? a : b;}为这么一个小的操作定义一个函数的好处有:① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多③ 使...

2019-04-17 23:52:01 87

原创 字符设备注册

1.注册/分配设备号内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。(1)register_chrdev 比较老的内核注册的形式 早期的驱动(2)register_chrdev_region/alloc_chrdev_region + cde...

2019-04-17 23:41:55 454

转载 linux内核cdev_init系列函数

内核中每个字符设备都对应一个 cdev 结构的变量,下面是它的定义:linux-2.6.22/include/linux/cdev.hstruct cdev { struct kobject kobj; // 每个 cdev 都是一个 kobject struct module *owner; // 指向实现驱动的模块 const struct ...

2019-04-17 23:15:45 472

原创 sizeof数组名

sizeof(数组名)与sizeof(*数组名)举例#include<stdio.h>int main(){int a[5]={1,2,3,4,5};int *p = a;printf("sizeof数组名=%d\n",sizeof(a)); printf("sizeof *数组名=%d\n",sizeof(p));}运行结果sizeof数组名=20si...

2019-04-15 23:49:17 1635 1

转载 bus, device, driver 三者之间的关系

总线,设备和驱动总线:一个总线是处理器和一个或多个设备之间的通道. 为设备模型的目的, 所有的设备都通过一个总线连接, 甚至当它是一个内部的虚拟的,"平台"总线。设备:设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类(CLASS)中.在Linux 系统中,每个设备由一个 struct device 代表。驱动:驱动程序是在CPU运行时,提供操作的软件接口...

2019-04-11 17:40:51 481

JLink490_640.rar

压缩包里有两个版本的JLINK,再烧写仿真模式会出现版本不匹配问题,经常因为版本问题。如没有积分请在https://blog.csdn.net/weixin_42868654留言,谢谢!

2019-07-04

CC254041 .pdf

在实际软件开发过程中,我们需要的就是参考手册,本文档是cc2541的参考手册,下载之前请确认您是做软件开发。

2019-05-09

简单粗暴学蓝牙4.2(CC2640篇)_201807121915

简单粗暴学蓝牙4.2 香瓜的简单粗暴学蓝牙CC2640版本,一本比较好的蓝牙学习资料,能让初学者一步一步学习修改BLE协议栈 若下载有问题,请联系https://blog.csdn.net/weixin_42868654,谢谢

2019-04-30

空空如也

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

TA关注的人

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