- 博客(409)
- 资源 (16)
- 收藏
- 关注
原创 RT-Thread线程
1. 线程创建线程的创建可以使用rt_thread_create()函数,原型如下:rt_thread_t rt_thread_create(const char *name, void (*entry)(void *parameter), void *paramet
2018-02-05 16:40:07 1468
原创 RT-Thread初探
试验平台:正点原子探索者STM32F407开发板一、RT-Thread介绍RT-Thread是由国内开发者主导开发的一款开源嵌入式实时操作系统,它包含:操作系统内核、TCP/IP协议栈、文件系统、libc接口,图形引擎等等。RT-Thread官网:https://www.rt-thread.org/代码地址:https://github.com/RT-Thread/rt-thread二、RT-Th...
2018-02-01 16:55:53 8355 2
原创 libopencm3库的使用
libopencm3是开源的cortex-m系列单片机的固件库,支持stm32、atmel、nxp等等系列单片机。在Linux下编译需要交叉编译器gcc,从这里下载:https://launchpad.net/gcc-arm-embedded/+download,下载编译好的Linux下的版本就可以了。解压缩,设置环境变量,使用arm-none-eabi-gcc -v命令测试一下设
2017-11-10 17:32:49 5455
原创 第九篇 蓝牙配对
不管是经典蓝牙也好,还是BLE也好,配对方式都有四种,分别是:1. Numeric Comparison2. Just Works3. Out of Band4. Passkey Entry而ble_app_template这个工程默认是采用的Just Works这种配对方式,这种方式是不需要配对码的,也就是直连的。而这里我们要改成使用动态密码方式进行配对,也就是P
2017-11-02 14:05:01 4033
原创 第八篇 uCGUI的移植
uCGUI版本:v3.98屏:OLED前面显示字符串我们自己定义了一个字库,uCGUI中肯定也是有字库支持的,这里的移植目标也是调用GUI_DispString()函数后能正确显示出字符,这里不会将uCGUI的所有功能添加进工程中,所以还是以显示字符为前提。首先将uCGUI中的Start/GUI和Start/Config两个目录拷贝到项目中。然后将Sampl
2017-09-21 16:51:21 4610 2
原创 第七篇 OLED屏
OLED即Organic Light-Emitting Diode,相比LCD的屏,LCD屏需要背光,而OLED不需要,因为它本身就是发光的。开发板上的屏使用的驱动IC是SSD1306,支持并口、I2C和SPI等接口,可以根据自身需要进行灵活的配置。具体是使用的哪种接口,是通过芯片BS0、BS1、BS2三个引脚来控制的,如图所示:另外,我拿到的屏是配置成四线SPI接口的,而不是
2017-09-15 18:29:07 3814 3
原创 第六篇 蜂鸣器和app_timer
开发板上的蜂鸣器是有源的,所以控制上相对比较简单,要让蜂鸣器出声,只需要把控制gpio口拉高就可了。什么时候关闭蜂鸣器呢?有两种办法,一是在打开蜂鸣器之后加上一段延时,然后再关闭蜂鸣器。二是使用timer,加延时不好的地方在于蜂鸣器发声之后cpu就不能做其他工作了,在有些情况下会影响用户体验,所以呢,这里需要使用timer来控制。在蓝牙样板程序中已经有app_timer的初始化,对
2017-09-12 11:11:23 2086
原创 第五篇 按键
实际上在蓝牙样板程序中已经包含了按键部分的初始化,我们只需要根据自己的板子做很少的配置工作,buttons_init()函数如下:static void buttons_init(void){ // Note: Array must be static because a pointer to it will be saved in the Button handler //
2017-09-11 16:32:37 588
原创 第四篇 串口通信
在单片机程序开发中除了单步调试外,最有效的调试方法算是打印调试了,所以这里先把串口功能调试好,也方便以后的调试开发。nRF51822带有一个UART接口,但是没有固定的TX、RX引脚,是可以任意配置到不同的IO引脚上,这也为硬件上连线提供了方便。Ok,我们在蓝牙样板程序中增加UART功能。首先是串口初始化,串口初始化可以使用simple_uart.c提供的simple_ua
2017-08-27 18:17:11 2026
原创 第三篇 蓝牙工程样例模板
如何使用nRF8122来开发蓝牙应用呢?实际上在安装了Keil的nRF8122软件支持包之后,在Keil目录下,有蓝牙开发的模板示例程序,目录为:C:\Keil\ARM\Device\Nordic\nrf51822\Board\nrf6310\s110\ble_app_template这个程序是Nordic为蓝牙开发者提供的一个模板程序,这个程序是能够直接编译成功的。先Down
2017-08-25 09:03:40 1841
原创 第二篇 点亮led灯
在上一篇,开发环境建立好了,那么接下来开发一个简单的应用,点亮一个led灯。首先新建一个工程,Device选择nRF51822_xxAA。工程建立好之后,接下来编写一个main.c来点亮led灯,代码如下:#include #include #define LED_INDEX 16void init_led(void){ nrf_gpio_cfg_output(LED
2017-08-22 11:40:30 3857
原创 第一篇 开发环境的建立
开发环境:Windows7 + 青云蓝牙开发套件nRF51822是由挪威Nordic公司推出的低功耗蓝牙解决方案,基于Cortex M0内核,开发环境使用的是Keil软件。那么首先是安装Keil,光盘中给了一个4.7的Keil版本,直接安装就可以了。然后是需要破解,使用keygen生成一个License ID然后添加进去就可以了。官方提供的Keil软件并不支持nRF
2017-08-22 11:34:02 516
原创 Linux driver oops异常的处理
如果Linux驱动里面出现了oops异常,这种情况如何快速定位到底什么原因引起的呢,需要对驱动debug。例如:#include #include static int __init hello_init(void){ int *p = NULL; *p = 0; return 0;}static void __exit hello_exit(void){}mo
2017-04-07 16:27:05 3684
原创 C++引用
一. C++中的引用引用(reference)实际上是为对象定义了一个别名,主要用作函数的形参。引用通过在变量名前加上"&"符号来定义。例如:int ival = 1024;int &refVal = ival; // ok: refVal refers to ivalint &refVal2; // error: a reference must be initia
2016-11-30 17:16:38 439
原创 Android权限问题
SELinux是什么?即Security-Enhanced Linux,是由美国国家安全局(NSA)发起,基于Linux开发的一个安全增强系统,旨在提高系统的安全性。而SEAndroid基于SELinux,在Android5.0上被正式启用。SELinux有3种操作模式,分别是Disabled、Permissive、Enforcing,在android中可以通过输入adb命令get
2016-11-18 16:28:53 2079 1
原创 mtk平台充电器检测
平台:mt6735 5.1首先来看BAT_thread()。void BAT_thread(void){ static kal_bool battery_meter_initilized = KAL_FALSE; if (battery_meter_initilized == KAL_FALSE) { battery_meter_initial(); /* move from b
2016-11-04 16:34:33 7752 4
原创 mtk电池温度检测
平台:mt6735+mt6328 Android版本:Android5.1手机里面电池通常有4个引脚,即电池的+、-极,ID引脚、NTC引脚。id引脚用来识别电池的类型,例如是锂电池还是镍氢电池,不过现在手机上基本用的都是锂电池了。而NTC引脚主要用来测量电池温度的,还可以用来检测手机有没有按上电池,那么这里就来说明这两个功能。1. 电池检测在mt6735+mt6328平台方案
2016-10-14 18:29:55 10482
原创 ALSA lib调用实例
1. Display Some PCM Types and Formats#include int main() { int val; printf("ALSA library version: %s\n", SND_LIB_VERSION_STR); printf("\nPCM stream types:\n"); for (val = 0; val
2016-09-22 10:31:55 3166
原创 ubuntu 12.04安装alsa-lib、alsa-utils
1. alsa-lib./configuresudo make install注意:默认是安装到/usr/这个目录下面,但是我测试多了多次,安装了alsa-lib之后,系统就没有声音了,也没有找到是什么原因。不得已,先安装到其他目录试试:./configure --prefix=$HOME/alsa-lib/make && make install2. alsa-u
2016-09-11 12:42:21 6653 1
原创 wav音频文件格式解析
wav是微软开发的一种音频文件格式,注意,wav文件格式是无损音频文件格式,想对于其他音频格式文件数据是没有经过压缩的,通常文件也相对比较大些。文件格式如图所示:解析代码如下:#include #include #include struct WAV_Format { uint32_t ChunkID; /* "RIFF" */ uint32_t ChunkSize
2016-09-11 09:07:56 20752 3
原创 Linux Completion
内核版本:Linux-4.5在Linux驱动程序中,有时需要等待一个事件的完成,就需要用到completion机制,需要包含头文件completion类型定义如下:struct completion { unsigned int done; wait_queue_head_t wait;};说明completion使用等待队列来实现的。可以使用宏DECLARE_C
2016-08-04 15:22:23 649
原创 SPI协议
参考:https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bushttps://en.wikipedia.org/wiki/Serial_Peripheral_Interface_BusSPI(Serial Peripheral Interface)是一种用于短距离的同步串行通信协议,由Motorola开发。SPI通常
2016-07-18 11:58:39 2270 1
原创 mtk camera加载流程
平台:mt6735从imgsensor_drv.cpp中的impSearchSensor()函数说起。MINT32ImgSensorDrv::impSearchSensor(pfExIdChk pExIdChkCbf){ MUINT32 SensorEnum = (MUINT32) DUAL_CAMERA_MAIN_SENSOR; MUINT32 i,id[KDIMGS
2016-07-04 12:06:45 6224
原创 Linux wakelock与autosleep
内核版本:Linux-4.5. wakelockLinux kernel在3.4及以后的版本中加入了wakelock机制,作用同之前的Android内核一样:1. 为应用层提供接口来创建、释放wakelock2. 在driver中,同样也可以创建、释放wakelock3. 当所有的wakelock都释放掉之后,系统可以自动进入低功耗状态,由autosleep来实现
2016-06-21 11:41:51 3558
原创 Line Disciplines
在Linux tty子系统中,Line Disciplines处在底层驱动与上层应用的之间,先来看一个例子:#include #include #include #include static int my_ldisc_tty_open(struct tty_struct *tty){ printk("%s\n", __func__); if (tty->ops->write
2016-05-29 19:51:03 1349
原创 关于i2c_register_board_info()函数
i2c_register_board_info()函数用于往__i2c_board_list这条链表添加一条i2c设备信息,在i2c adapter注册的时候,会扫描__i2c_board_list链表,然后调用i2c_new_device()函数来注册i2c设备,注意,要先于i2c adapter注册之前就添加好i2c设备信息,否则会出现调用了i2c_register_board_info()函
2016-04-30 22:13:14 9790 1
原创 关于i2c_smbus系列函数
内核版本:linux-4.5i2c_smbus系列函数有:s32 i2c_smbus_read_byte(const struct i2c_client *client);s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value);s32 i2c_smbus_read_byte_data(const struc
2016-03-24 12:41:03 32775 5
原创 mini2440 i2c设备支持
内核版本:linux-2.6.32.2 实验平台:mini24401. 添加主控设备支持i2c主控制器也是一个设备,只是在内核被虚拟成了一个平台设备,平台设备在内核中已经被定义了,定义在plat-s3c/dev-i2c0.c中:static struct resource s3c_i2c_resource[] = { [0] = { .start = S3C_PA_IIC,
2016-03-22 22:41:24 1638
原创 关于dev_set_drvdata()和dev_get_drvdata()
内核版本:Linux-4.5dev_set_drvdata()和dev_get_drvdata()代码如下:static inline void *dev_get_drvdata(const struct device *dev){ return dev->driver_data;}static inline void dev_set_drvdata(struct device
2016-03-18 15:08:46 9634
原创 rust
根据百度百科的解释:Rust是Mozilla开发的注重安全、性能和并发性的编程语言。rust官网:https://www.rust-lang.org/1. 安装从官网下载安装包,我这里下载的安装包名字是:rust-1.6.0-x86_64-unknown-linux-gnu.tar.gz然后解压,进入rust目录,根据README提示,执行sudo ./install.sh命令
2016-03-02 14:42:56 860
原创 mongodb
mongodb官网:https://www.mongodb.org1. 安装可以在官网下载安装包,下载完成之后,解压,然后将bin目录中的所有文件都拷贝到/usr/local/bin目录下。2. 启动mongodbmongodb默认将/data/db作为数据库的存储路径,所以首先需要创建这个目录:sudo mkdir -p /data/db然后使用sudo mo
2016-03-02 13:51:29 660
原创 libpq简单示例
libpq是什么呢?英文原话是:libpq is the C application programmer’s interface to PostgreSQL,原来是postgresql的c语言应用程序接口,postgresql的官网是:http://www.postgresql.org/。1. postgresql安装在ubuntu下,使用下面的命令(12.04)来安装:sudo
2016-03-01 14:36:55 5090
原创 vala
根据百度百科的解释,vala是一种新的、为GNOME开发者提供的具有现代化编程语言功能的一种编程语言。1. 安装在ubuntu下安装很简单,使用命令sudo apt-get install valac-0.16(12.04版本),测试valac编译器的版本号,可以输入valac --version命令。2. HelloWorld程序class Demo.HelloWorld :
2016-02-29 17:08:45 2260
原创 stm8 clock
stm8时钟源有4种:1. 16MHz的高速内部时钟源HSI2. 1到16MHz的高速外部时钟源HSE3. 32.768KHz的低速外部时钟源4. 38KHz的低速内部时钟源这4种时钟源都可以作为系统时钟,大家也可以用示波器量一下59引脚,看输出的的时钟频率是否正确,在量之前需要做如下设置:void main(void){ GPIO_Init(GPIOC, GPIO_P
2016-02-25 14:01:03 1715
原创 stm8 rtc时钟
stm8 rtc时钟可以使用内部低频时钟源,或者外部低速32768Hz时钟源,关于rtc部分代码如下:#include #include void init_rtc(void){ RTC_InitTypeDef RTC_InitStr; RTC_TimeTypeDef RTC_TimeStr; RTC_DateTypeDef RTC_DateStr;#if 1 /* LSI *
2016-02-17 17:21:59 13439 1
原创 关于c使用assert
assert宏原型定义在中,原型如下:void assert(scalar expression);其中作用是如果表达式为false,首先向stderr打印一条错误信息,然后使用abort()函数来终止程序的运行,例如:char *strcpy(char *dest, const char *src){ char *tmp = dest; assert(dest != NULL);
2016-01-29 13:54:46 785
原创 nmealib代码分析
从之前的samples/parse/main.c开始。以其中的一条GPGGA语句为例。nmeaINFO结构汇总的是gps数据信息,里面包括utc时间、定位状态、质量因子、经纬度、速度、方向等信息,之所以说是汇总,那是因为这里是对所有的nmea语句进行解析,然后将相应的数据赋值到该结构中,而不仅仅是其中的一条nmea语句,因为一条nmea语句不可能包括所有的gps信息。nme
2016-01-18 10:01:41 3521
原创 GPS nmealib
nmealib是基于nmea协议的一个开源库,不仅可以解析nmea语句,还可以产生nmea语句,测试代码如下:#include #include int main(void){ const char *buff[] = { "$GPGSV,2,2,07,29,28,104,36,31,56,324,12,32,38,293,15*4E\r\n", "$GPGLL,3110.856
2016-01-14 17:45:34 2453
转载 c printf
原文链接:http://www.cplusplus.com/reference/cstdio/printf/functionprintfint printf ( const char * format, ... );Print formatted data to stdoutWrites the C string pointed by f
2016-01-05 16:52:20 672
原创 object-c ubuntu下开发环境搭建
1. 安装gnustep和gobjcsudo apt-get install gnustep gnustep-devel gobjc2. 示例代码#import int main (int argc, const char * argv[]){ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
2016-01-04 14:21:11 1383
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人