- 博客(35)
- 资源 (2)
- 收藏
- 关注
转载 stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个int main(){while(1);}BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-
2016-07-16 10:23:16
627
转载 函数指针
fun();int fun(int p);void fun(void);void *fun();void (*fun)();定义一个指针,该指针指向函数的的入口地址(void *)fun();定义一个函数,返回值为指针void (*fun)(void *);定义一个指针,该指针指向函数的入口地址,参数为一个void指针类型(void *)fu
2016-07-13 10:53:35
423
转载 Bootloader设计(YModem协议)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些。下文中的bootload就来实现这样的功能。 前段时间有项目关于Bootload设计。所以就仔细的去了研究了一翻。以前都是用的stm32官方的,没有去深入了解。这次做完了过后,发现官方的版本存在一些问题。比如说YModem传送过程中,完全没有对数据区进行效验,只是核对了下编号,就进行烧写。整个程序完全为阻塞式,浪
2016-07-13 09:47:08
1734
转载 JTAG各类接口针脚定义及含义
JTAG有10pin的、14pin的和20pin的,尽管引脚数和引脚的排列顺序不同,但是其中有一些引脚是一样的,各个引脚的定义如下。一、引脚定义Test Clock Input (TCK) -----强制要求1TCK在IEEE1149.1标准里是强制要求的。TCK为TAP的操作提供了一个独立的、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的。Test
2016-07-04 09:23:45
1122
原创 调试中日志打印printf技巧
前言:我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。比如,定义一个宏
2016-06-30 15:37:52
3991
转载 const 详解(修饰变量、输入参数、返回值、成员函数)
看到const关键字,程序员首先想到的可能是const 常量。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use const whenever you need”。
2016-06-29 16:52:07
1302
转载 stm32 堆和栈(stm32 Heap & Stack)
关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的。 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个int main(){while(1);}BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-
2016-06-28 11:41:47
468
转载 程序员如何保持优秀
1. 小范围的选择一些有用技术,透彻的学习它们,拥抱它们。然后不断的扩展这个范围。2. 理解各种数据结构的优点和缺点,包括它们在内存中和在硬盘上的各自表现。3. 理解各种算法的优点和缺点。4. 了解你的工作领域。关上电脑,去做你的用户们在做的事。5. 有准备,有愿望,有能力在任何时候投入到多种技术层面中。你必须知道表象下的技术原理。在“各个技术层面的掌握程度”和“编
2016-06-27 10:40:54
239
转载 回调函数的理解
在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。为了弄明白这种函
2016-06-27 10:15:37
277
转载 PBOC/EMV之TLV编码与解码
原处:http://blog.youkuaiyun.com/pony_maggie/article/details/5270548PBOC的IC卡大部分数据都是TLV格式的. EMV的手册简单的编码规则说明. 我下面很详细的分析TLV的编码格式并给出相应的TLV解码的伪代码. TLV是tag, length和value的缩写.一个基本的数据元就包括上面三个域. Tag唯一标
2016-06-06 14:15:21
714
转载 printf使用技巧
巧用可变参数宏、编译器内置宏和printf输出调试信息前言:我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选
2016-05-19 11:17:19
538
1
转载 很好的debug方式取代printf满天飞
对于喜欢用printf Debug的同行来说,最麻烦的莫过于要重复输入很多printf语句,而且模块调试完成后要手动的把它们拿掉。 现在介绍一个很好的办法:#ifdef DEBUG#define D_STR(_STR_) printf("f:%s(l:%d)%s\n",__FILE__,__LINE__,_STR_);#define D_LINE
2016-05-19 11:00:49
571
转载 C语言中的内存分配
一、C语言程序所占内存分类(1)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。(2)堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。(3)全局区(静态区)(static):全局变量和静态变量的存储位置在一起的。初始化的全局变量和静态变量在同一块区域,而未初始化的全局变量和未初始化的静态变量在相邻的另一块区域
2016-03-29 22:31:09
396
转载 【转】使用typedef定义函数指针
(一)简单的函数指针的应用。//形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){return;}void main() { pFun = glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun。首先我们根据前面提到
2016-03-29 22:29:40
330
原创 UART 与 USART 的区别
UART:universal asynchronous receiver and transmitter通用异步收发器 [Bus Signal] TX , RX USART:universal synchronous asynchronous receiver and transmitter通用同步异步收发器 [Bus Si
2015-05-10 18:17:58
512
转载 新建STM32工程步骤
1. 新建文件夹 DOC文件夹: 可以存放readme.txt等项目文档 Library文件夹: 可以存放ST库源码,直接复制ST库的源代码到Library文件夹,另外startup只需复制和芯片对应的.s文件即可,一般存放在-ST库3.5.0源码STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCM
2015-05-07 23:24:12
565
转载 STM32中如何计算波特率
波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR,如下: STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不
2015-05-07 23:24:09
5064
转载 经验分享——EEPROM读写及数据管理
1)有关 芯片内部自带的E2PROM有的资深的工程师可能不是很愿意用MCU自带的E2PROM,大概是这些家伙上过什么当、受过骗还是什么的。简单说一下优缺点吧:(1)片内集成的感觉挺便宜的,和MCU一起卖的,对成本要求严格的,写次数很少的场合一般会考虑,至少能省个2、3毛钱吧;(2)缺点的话,可能擦写次数、稳定性没有外挂的专用芯片厉害;2)
2015-05-07 23:22:49
8684
2
转载 NRF24L01+USART搞定有线和无线通信
前言一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法。这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据接收的适配器。这里基于stm32分别设计了现场部分和适配器部分,这里只是基本通信功能实现的讲解,一些复杂的技术比如加密、可靠等要根据具体的应用来设计~总体说明这里采用stm32作为MCU
2015-05-07 23:16:26
2881
转载 stm32串口接收、TF卡存储丢数现象解析与总结
stm32串口接收、TF卡存储丢数现象解析与总结问题:待接受的串口数据是9600波特率,一行一行的发送,最长一行不超过1024字节。 在利用stm32的串口进行数据接收,设置两个1024大小的buf,轮流接收,轮流写入TF卡, 为什么中间总会出现完整的一行无发记录下来的问题呢。解析:我确定是中间的数据丢失,我估计很大原因就是接收和写保护偏差问题。 刚才用串口调试攻击分别以1
2015-05-07 23:08:29
2709
转载 STM32 简单多任务调度
STM32的开发目前大多数还开处于“裸奔”的阶段,处于开发成本的考虑,可能还未嵌入任何的RTOS系统,由于没有操作系统的支持,因而不能方便的对多任务进行调度和管理,在main函数中你可能会写成如下方式:int main(void){ while (1) { Task1(); // 调用任务
2015-05-07 21:56:19
10731
1
转载 调通STM32的串口ISP的经验
1、Boot0需接高(注意不要超过3.6V,非5V容忍脚),Boot1(PB2)需接低(电阻下拉或直接接地)。2、VDDA/VSSA一定要接好,电压符合要求(2.4~3.6V).即使不用ADC也要接,因为VDDA还为POR/OSC/PLL等“模拟”部分供电。3、检查复位脚的电位是否正常,JTAG仿真器有可能复位系统。4、检查TXD/RXD信号通路。当然要畅通,呵呵。
2015-05-06 21:37:48
2239
转载 volatile的作用
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序:short flag;vo
2015-05-02 15:30:26
295
转载 实时时钟DS1302
在前面的课程中我们已经了解到了不少关于时钟的概念,比如我们用的单片机的主时钟是11.0592M、I2C总线有一条时钟信号线SCL等,这些时钟本质上都是一个某一频率的方波信号。那么除了这些在前面新学到的时钟概念外,还有一个我们早已熟悉的不能再熟悉的时钟概念——年-月-日 时:分:秒,就是我们的钟表和日历给出的时间,它的重要程度我想就不需要多说了吧,在单片机系统里我们把它称作实时时钟,以区别于前面提到
2015-03-25 17:21:55
6752
1
原创 旋转编码器 C程序
/************************************************************************************************ 函数名称:bianma_scan 函数功能:编码器扫描及处理 入口参数: 出口参数:无 备注: 100us扫描一次*****************
2015-03-16 16:24:25
9106
转载 C语言中利用共用体、结构体、位域实现位操作
编写过51(MCU)程序的同学都知道51架构的MCU支持位操作,这是一个很方便的特性,在读取/修改寄存器某位的值时非常方便快捷。但其他架构的MCU大多都不支持该特性,即不支持位操作,所在在对寄存器中某一位进行操作的时候都是and/or两个操作共同使用,在编写程序时非常麻烦。在查找了大量资料后,笔者得出了本文中提到的一种折中方法。名词解释:共用体(union)表示几个变量共用一个内存位置,在
2015-03-16 11:39:11
5666
转载 C语言头文件中定义变量问题(转)
上个星期回学校的时候,刚好碰到一个学弟在写程序,并且刚好碰到一个总编不过去的问题,我看了看,正好是个头文件重复包含问题,问题描述如下:他在程序中建立了一个global.h的文件,代码如下:#ifndef _GLOBAL_H_#define _GLOBAL_H_int a;int b;int c;然后在其他文件代码中,有多个.cpp文件引用他,
2015-03-16 11:38:24
839
转载 模拟红外协议接收程序
/*********************************************简介:本程序为模拟红外协议的接收程序 包含起始码和数据码本程序现固定一次性接收16BIT(2字节)的数据起始码与数据码长度定义如下图(用户可自行更改): **********************************************/
2015-03-04 09:33:26
775
转载 模拟红外协议发送源程序
/*********************************************简介:本程序为模拟红外协议的发送程序 包含起始码和数据码本程序现固定一次性发送16BIT的数据起始码与数据码长度定义如下图(用户可自行更改):?123456789
2015-03-04 09:31:43
923
转载 红外编解码彻底解析
1、编码格式 现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。 两种形式编码的代表分别为NEC 和PHILIPS 的RC-5、RC-6 以及将来的RC-7。 PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。例如常用的电视遥控器,使用NEC up
2015-03-03 17:40:49
20938
1
转载 红外遥控系统原理及单片机软件解码程序,我的编写经历(C版本)
应该说现在每一块开发板都带有红外模块,并且大都配置了相应的程序。但其实自己动手写解码程序,更能锻炼自己所学,且不谈程序写的如何,这个过程中肯定是受益良多的。现在我就把我花一下午写出的解码程序与大家分享,期待高手的光临指正。 首先,必须要了解一些基本原理。其实按下遥控器的某一个键,遥控器会发出一连串经过调制后的信号,这个信号经过红外一体化模块接收后,输出解调后的数字脉冲,每个按键对应不同的
2015-03-03 17:39:40
3492
转载 C语言条件编译及编译预处理阶段
一、C语言由源代码生成的各阶段如下:C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。 在C 语言中,并没有任何内在的机制
2015-03-03 16:34:42
337
转载 一种软件去除键抖动的方法
摘要:单片机控制系统中大多使用控制键来实现控制功能。消除按键瞬间的抖动是设计者必须要考虑的问题。本文介绍一种很实用的软件去抖动方法,它借助于单片机内的定时中断资源,只要运算一下逻辑表达就完成了去抖动。这个方法效率高,不耗机时且易实现。文中使用的逻辑表达式由简单卡诺图和真值表推出,使该方法的机理容易理解。文中还提供用C51单片机编程语言编写的实用例程。 关键词:单片机 键处理 控制系统 去抖
2015-03-02 16:54:15
5035
转载 关于按键扫描程序的终极讨论
一、思路基于STM8,按键处理,思路是这样的:每20ms左右一次去扫描按键,用一个key_now记录当前值,用key_last记录上次的值,如果key_now和key_last同时有效,则开始进行cnt++。 我设定两个阈值,LONG_PRESS为100(100*20ms=2s),SHORT_PRESS为4(4*20ms=80ms,去抖)。 cnt大于LONG_PRESS,
2015-03-02 16:34:56
1072
转载 关于独立按键扫描程序的思考(整合两种算法)
转自关于独立按键扫描程序的思考(整合两种算法)源程序主要部分如下:[cpp] view plaincopyprint?volatile unsigned char Trg; volatile unsigned char Cont; volatile unsigned char Release;
2015-03-02 16:26:22
1064
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人