- 博客(50)
- 资源 (8)
- 收藏
- 关注

原创 STM32之串口重定向printf函数和scanf函数
在进行STM32开发时,需要将日志打印出来,直接使用C语言的库函数printf是不起作用的,此时就需要我们将串口重定向printf函数。首先我们需要在keil集成开发环境中勾选STM32官方的微库,如下图所示: 然后就是重写fputc函数,使之定向到制定的串口中去。代码如下:#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (opti
2017-09-09 11:48:50
8098

转载 CPU、MCU、MPU及DSP的区别和介绍
CPU、MCU、MPU及DSP的区别CPU(Central Processing Unit,中央处理器)发展出来三个分枝,一个是DSP(Digital Signal Processing/Processor,数字信号处理),另外两个是MCU(Micro Control Unit,微控制器单元)和MPU(Micro Processor Unit,微处理器单元)。MCU集成了片上外围器件;MPU不带外围
2017-07-24 13:53:26
22723

原创 数据结构——双向链表(C语言实现)
/*************************************************************************> File Name: link_list.c> Author: Andy001847> Mail: yunzhonglai@hotmail.com> Created Time: 2014年10月25日 星期六 11时51分34秒******
2016-04-26 19:00:39
975
原创 Unix C (九)
进程间通信————IPC(Inter Process Communication)1、Unix/Linux系统基于多进程,进程和进程之间经常做数据的交互,这种技术称为进程间通信。2、进程间通信的方式:1)文件2)信号3)管道(最古老的IPC之一,目前较少使用)4)共享内存5)消息队列6)信号量集7)网络编程(socket)...其中共享内存、消息队列和信
2020-09-22 17:37:35
687
原创 ESP32开发环境搭建(Windows平台)
ESP32开发环境搭建之——hello_world一、所需工具由于项目要用ESP32模块进行开发,折腾了下集成开发环境,现将过程记录下来,以便需要的人使用。其中需要的有交叉编译工具,esp-idf示例代码以及C/C++版的eclipse。交叉编译工具MSYS32:https://dl.espressif.com/dl/esp32_win32_msys2_environment_a...
2018-03-31 15:42:22
7098
3
转载 Segger RTT的使用——调试技巧
RTT( Real Time Terminal)是SEGGER公司新出的可以在嵌入式应用中与用户进行交互的实时终端。J-Link驱动4.90之后的版本都有这个软件哦。用RTT可以从目标MCU上输出信息的同时也可以非常高速的向应用程序发送信息,并且不影响MCU的实时性。其实现原理就是J-link与MCU共享内存,具体实现细节感兴趣的读者可以自己去查阅下资料,本文以应用为主。RTT的工作框图如下图
2018-02-02 18:03:56
5896
原创 STM32F030C8T6串口接收不定长数据
usart.c文件代码。#include "usart.h"#include "gpio.h"UART_HandleTypeDef huart1;/* USART1 init function */void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 115
2018-01-24 14:35:20
4231
原创 STM8L15x系列DAC的使用
在项目中偶尔会使用DA转换器,我使用的MCU是STM8L151G6U6。我是用的是PB4作为DA输出管脚,查阅该芯片的Reference manual手册可知,PB4是属于DAC_OUT1,即DAC通道一。 再查阅PB4输入输出控制,PB4对应的是开关15。 下面是我用软件触发模式使用的DAC配置代码。 dac.h头文件代码如下:#ifndef __DAC_H__#define __
2017-11-29 10:30:54
4424
原创 STM32之SPI驱动外部Flash
MCU为STM32F030C8T6,Nor Flash为IS25LQ010B。spi.h源代码#ifndef __spi_H#define __spi_H#ifdef __cplusplusextern "C" {#endif/* Includes ------------------------------------------------------------------*/#inc
2017-09-22 12:02:00
2380
原创 STM32平台下的TM1812驱动
TM1812芯片的特性如下: 数据传输参数及时序: 在上图中一个串联了三个TM1812芯片,每个芯片控制四盏灯,每盏灯有R,G,B三种颜色,每种颜色有256(0xFF)阶灰度可调,及每个颜色用一个字节控制。发送完全部LED灯的数据后,发送RESET信号进行LED显示以及重新接收数据。下面是我在STM32F030C8T6中的驱动,时钟频率48MHz。 tm1812.h的代码:#i
2017-09-14 09:27:24
7320
8
转载 Keil用fromelf工具生成bin文件
fromelf –bin –output “@P.bin” “#L” @P,就是取工程名 Project407,不要后缀. $L@P.bin在指定路径下生成bin文件. @P:在工程的根目录下生成文件. 工程名和链接文件名是不一样的. 工程名:建立工程时候取得名字. 链接文件名:自己随时可更改的.如下图.
2017-09-07 10:25:06
7889
转载 Makefile简易教程
Makefile简介在软件开发中,make通常被视为一种软件构建工具。该工具主要经由读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化建构。它会通过一种被称之为“target”概念来检查相关文件之间的依赖关系,这种依赖关系的检查系统非常简单,主要通过对比文件的修改时间来实现。在大多数情况下,我们主要用它来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库
2017-09-01 15:56:56
455
转载 I2C协议的理解
一、协议分析先想想两个陌生人是怎么进行沟通的,为了显得更有主次关系,选取老板和新员工进行沟通的场景,老板一般占有主动权,而且手中有新员工的基本信息,比如姓名,年龄,性别等。沟通开始:老板:“XXX,欢迎你加入我们公司,为公司注入新的血液!”伸出握手姿势 —— 主握手新员工:“承蒙厚爱,有幸加入我们公司,我觉得是一种光荣!”握手 —— 握手成
2017-07-28 10:15:01
1018
转载 Windows10有线网卡无法上网的解决办法
昨晚刚下班打开自己的台式机,发现上不了网,用“疑难解答”诊断显示“以太网适配器的驱动程序可能出现问题”,故而卸载网卡驱动,用其他笔记本重新下载对应驱动程序。下载了很多个驱动版本,怎么重装都没有效果。折腾了一夜,还是没有任何结果。第二天醒来,用手机再次找寻,便找到了解决办法,很是感谢笔者。原来只需将microsoft网络客户端,qos数据包计划程序,microsoft网络的文件盒打印机共享,链路层拓扑
2017-07-01 11:40:35
14332
转载 J-Link v8固件丢失修复
0.开始前准备工具1.SAM-BA v2.12.exe 用于烧写固件 下载地址:http://download.csdn.net/detail/hzt12345hf/9457629新版本的SAM-BA(例如sam-ba v2.9)不能正确连接JLink,所以还是用了这个版本2.JLink v8固件 下载地址:http://download.csdn.net/detail/hzt12345hf/945
2017-05-25 18:57:53
2595
转载 什么是达夫设备(Duff's Device)
在看《你必须知道的496个C语言问题》一书中,提到”达夫设备”这个东西,主要是下面的代码:register n = (count + 7) / 8; /* count > 0 assumed */switch (count % 8){ case 0: do { *to = *from++; case 7:
2017-03-10 09:24:26
881
原创 C语言字符串的处理
字符串的处理: 1、C程序员定义字符串的方式有三种: 1) 字符串字面值:”abc” 2) 字符数组:char buf[50]; 3) 字符指针:char *str;2、数组可以看成常指针(不可以改变地址,只能初始化)。某些时候和指针有区别(比如使用sizeof的时候)。 3、memset函数可以清理字符数组,包括变长数组。4、实例:/*
2017-02-17 09:34:23
940
转载 延时函数sleep和delay的区别
在VC中使用带上头文件#include <windows.h>注意: 在VC中Sleep中的第一个英文字符为大写的”S” 在标准C中是sleep, 不要大写.. 下面使用大写的来说明,, 具体用什么看你用什么编译器. 简单的说VC用Sleep, 别的一律使用sleep. Sleep函数的一般形式: Sleep(unisgned long); 其中,Sleep()里面的单
2017-02-16 09:32:17
14805
原创 USART配置成SPI实例代码
在工作中第一次遇到可以将串口当做SPI使用的情况,下面是我在ATSAM4SD16B芯片中书写的将USART配置成SPI使用的代码。// Include files#include "component_usart.h"#include "sam4sd16b.h"#include "assert.h"#include "sam_gpio.h"#include "sysclk.h"#defin
2017-02-08 15:49:06
2062
1
原创 普通GPIO模拟SPI通信协议(软件SPI)
在工作中偶尔会遇到SPI不够用的情况,而我们又要去使用SPI通信协议,此时就需要我们自己去模拟SPI通信协议。我们知道SPI通信协议有四种模式,它们分别如下所示: 下面是我基于ATSAM4SD16B芯片在Atmel Studio上用普通GPIO模拟的SPI通信协议的代码:#include "ioport.h"#include "pio.h"#include "delay.h"#inclu
2016-12-29 09:46:02
26671
3
原创 Log打印技巧(C语言实现)
在实际开发中我们经常要通过打印Log来调试程序,经常会用到打印函数,这里我书写了个宏,做到有选择的打印log。发话不多说,直接贴代码,希望对各位同人有所启发。/*File : log.cBreif : Define a macro to optition print logDate : 2016-12-16Author: Andy*/#include <stdio.h>/* Defin
2016-12-16 14:29:16
6228
4
转载 推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)G
2016-12-16 14:00:39
1231
转载 防止头文件被重复包含的两种方式#pragma once 与 #ifdef 的区别
当一个项目比较大时,往往都是分文件,这时候有可能不小心把同一个头文件 包含多次,或者头文件嵌套包含,比如: a.h 中包含 b.h : #include “b.h” b.h 中包含 a.h: #include “a.h” 而main.c 中使用其中头文件: #include “a.h” int main() { return 0;} 编译上面的例子,会出现如下错误:
2016-11-20 13:51:33
2586
转载 void在C语言中特殊使用
在C语言中,在定义函数时,加在函数名前的“void”表示该函数没有返回值,调用时直接书写函数名和参数即可。 但是有些函数明明在定义的时候不是void型,却在调用时可能会在前面加上void,这表示程序并不关心调用该函数后的返回值是什么,即告诉静态代码检测工具不要去处理此处该函数的返回值。比如函数strcpy,我们直接用“strcpy(des_str, src_str);”这样的形式来用。“(voi
2016-11-17 13:53:55
2693
原创 ISO15693类型的命令解析以及防碰撞过程
一、介绍 本博文介绍了符合ISO15693标准的标签类型的检测以及防碰撞过程。二、协议简介 (2.1)ISO15693介绍了三种模式,它们之间的关系如下所示: (2.2)请求命令格式: SOF Flags Command Code Parameters Data CRC EOF 帧开始 标识 命令代码 参数
2016-06-21 15:03:58
22511
3
原创 双向链表实现的消息队列
// include head file#include <stdio.h>#include <stdint.h>#include <stdlib.h>#include <string.h>#include <vld.h> /* This head file could be omit, it used for check whether memory leak. You must be
2016-04-26 18:26:32
1220
原创 ISO14443 Type B类型卡的防碰撞过程以及命令解析
一、介绍 本博文介绍了PCD(Proximity Coupling Device)使用ISO14443-3 Type B协议检测匹配的PICC(Polling For Proximity Cards)命令以及防碰撞过程(Anticollision Proccess)。二、命令2.1 REQB和WUPB2.1.1 概要 REQB命令和WUPB命令是PCD用来检测PICC是否在无限射频场(RF
2016-04-24 23:07:38
35449
2
原创 ISO14443 Type A类型卡的防碰撞过程以及命令解析
一、介绍 本博文介绍了PCD(Proximity Coupling Device)使用ISO14443-3 Type A协议检测匹配的PICC(Polling For Proximity Cards)命令以及防碰撞过程(Anticollision Proccess)。二、命令1 REQA和 WUQA1.1 命令概要 REQA命令和WUPA命令是PCD用来检测Type A类型卡是否在无线射频
2016-04-24 02:42:59
50115
11
原创 如何将多个bin文件合成一个bin文件?(二)
一、所需软件 J-flash ARM二、所需合成文件 1)Bootload.hex(Bootload.bin) 2)Application.hex(Application.bin)三、步骤 打开J-flash ARM软件,将要合成的第一个文件Bootload.hex拖到J-flash ARM中,接着点击File,打开Merge data file…找到第二个要
2016-03-10 10:20:01
4795
原创 如何将多个bin文件合成一个bin文件?(一)
如何将多个bin文件合成一个bin文件?一、使用到的软件 WinHex二、所用文件 Bootload.bin Application.bin三、生成目标文件 Target.bin四、步骤 1)新建目标文件target.bin,此时文件大小为0. 2)使用WinHex软件打开Target.bin、Bootload.bin和Applicatio
2016-03-08 16:03:11
8477
转载 射频识别技术——数据编码
射频识别技术中的调制方法一般使用调幅(AM),也就是将有用信号调制在载波的幅度上传送出去。这里的“有用信号”指用高低电平表示的数据“0”或“1”。那么如何用高低电平表示数据“0”或“1”呢?最简单的办法就是用高电平表示“1”,用低电平表示“0”,这种代码叫全宽码,如下图所示: 这种编码方式存在的最大缺陷就是数据容易失步。上图的数据我们看的很清楚,但是想想如果发送方连续发送100个“0”或1
2015-09-07 10:59:14
5187
转载 无线射频技术总结
无线射频技术总结正常情况下读写器某一时刻只能对磁场中的一张射频卡进行读写操作。但是当多张卡片同时进入读写器的射频场时,读写器怎么办呢?读写器需要选出唯一的一张卡片进行读写操作,这就是防冲突。1.面向比特的防冲突机制 ISO14443A中使用这种防冲突机制,其原理是基于卡片有一个全球唯一的序列号。比如Mifare1卡,每张卡片有一个全球唯一的32位二进制序列号。显而易见,卡号的每一位上不是“1”就
2015-09-07 10:48:25
2462
转载 ISO / IEC 14443 Type-B initialization and anticollision
Type-B initialization and anticollisionType-B proximity cards use a ‘dynamic slotted ALOHA procedure’ for selection. In this procedure, cards within the working range of a terminal transmit their da
2015-07-06 18:13:41
2138
原创 Unix C (十一)
线程 1、理论和原理 1)主流的操作系统都是支持多进程的,每个进程的内部可以启动多线程完成代码的并行;每个线程的内部可以无限启动多线程。 2)线程是轻量级的,不拥有自己独立的内存空间,共享所在进程的相关资源(代码区/全局区/堆/文件状态/共享资源),线程拥有的只是一个独立的栈空间。 3)进程是重量级的,必须拥有自己独立的内存空间。 4)计算机执行代码必备CPU/内存,
2014-12-29 22:13:28
686
转载 什么是达夫设备(Duff's Device)
在看《你必须知道的496个C语言问题》一书中,提到"达夫设备"这个东西,主要是下面的代码:register n = (count + 7) / 8; /\* count > 0 assumed \*/switch (count % 8){case 0: do { \*to = \*from++;case 7: \*to = \*from++;case
2014-12-27 11:36:16
1517
原创 Unix C (十)
网络编程: ip 地址 是网络中计算机的地址,和mac地址(网卡出厂地址/物理地址)联合 能够让网络找到计算机。用端口(port)定位一个进程。因此网络编程就是 ip+端口。 Unix系统中,几乎一切都可以看成文件。因此网络信息的交互就用文件的交互方式。 ip地址底层是整数,分为ipv4(4位ip)和ipv6(6位)。 对ip的描述方式一般使用点分十进制。4个或者6个 0-
2014-12-23 18:03:49
829
原创 Unix C (八)
信号(signal):1、信号是Unix/Linux系统中软件中断的最常用方式。2、中断就是中止当前正在执行的代码,转而执行其他代码。中断分为软件中断和硬件中断。常见信号中断:Ctrl+c段错误总线错误整数除0kill -9发送信号9子进程结束给父进程发信号信号的本质就是一个非负正数,Unix和Linux在信号上有区别。Unix是48个,Linux是64个,
2014-12-23 17:06:48
768
原创 Unix C (七)
进程: 1、程序和进程的区别。1)程序就是代码编译链接的成品(可执行程序)。程序是硬盘上的文件。2)进程就是运行在内存中的程序,一个程序可以启动多次,得到多个进程。3)CPU只能直接操作内存,不能直接操作硬盘,硬盘上的程序想要运行,程序必须先加载到内存中,变成进程。4)在日常生活中,为了跟客户交互,有时候也把进程成为程序。2、主流的操作系统都是多进程的,每个进程内部还可
2014-12-23 15:42:16
584
原创 Unix C (六)
文件锁: 1、当多个进程同时写一个文件时,有可能出现数据混乱,这个问题需要解决。解决方案:进程间的同步或文件锁。 2、文件锁就是当一个进程读写文件时,对其他进程进行读写的限制。 3、文件锁的结论:1)一个进程读,允许其他进程读,但不允许其他进程写。 2)一个进程写,其他进程既不能读也不能写。 4、文件锁是一个读写锁,包括读锁和写锁
2014-12-23 15:16:09
588
原创 Unix C (五)
系统调用 系统调用可以操作内核,是外部程序和内核层交互的接口,但不能过于频繁的调用,否则效率极低。 time命令可以查看用户层及其内核层的执行时间。 文件和目录 在Linux/Unix中,几乎一切都可以被看成文件。 因此,系统调用函数open/close/read/write/ioctl几乎可以通用。 在Unix的系统调用中,打开/创建一个文件会产生一个文件表
2014-12-23 11:58:40
571
MBI5153英文数据手册V1.00
2017-09-20
MBI5153中文数据手册V1.00
2017-09-20
MBI5153中英文数据手册 V1.00
2017-09-19
Vim中文手册(Vim v8.0)
2017-09-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人