
嵌入式开发进阶之路
spdian
这个作者很懒,什么都没留下…
展开
-
隔离通信-RS485(一)
最近在使用MODBUS通信,了解到MODBUS比较多是基于RS485的物理层。之前也有使用过RS485,不过都是使用前人成熟的方案,个人没有仔细研究推敲。趁这次使用MODBUS好好学习了下,以保证后续通信设计的可靠。一、RS485特点1.电气特性:采用差分信号负逻辑。逻辑“1”以两线间压差-2V~-6V表示,逻辑“0”以两线间压差+2V~+6V表示。2.RS485采用平衡驱动器和差分接原创 2017-09-01 11:51:35 · 9216 阅读 · 0 评论 -
通信总线-RS485(二)
RS485通信总线究竟使用几根线?这个问题之前没有深究过。趁着使用MODBUS通信的机会仔细研究了下。通信时使用隔离电源已没有疑问(如有疑问,可参考我 RS485(一) 文章中所述原因)。现在有个新的问题,使用隔离电源后,是否要将节点的隔离电源地连接在一起。RS485两边的GND肯定不连接,如果是那样还叫差分吗?RS485就想成一个差分输入的运放,解决长线通讯时的共模干扰,RS485的电压转载 2017-09-01 15:41:58 · 3257 阅读 · 0 评论 -
上下拉电阻-RS485(三)
一、为什么需要加上下拉电阻?根据RS-485标准,当485总线差分电压大于+200mV时,485收发器输出高电平;当485总线差分电压小于-200mV时,485收发器输出低电平;当485总线上的电压在-200mV~+200mV时,485收发器可能输出高电平也可能输出低电平,但一般总处于一种电平状态,若485收发器的输出低电平,这对于UART通信来说是一个起始位,此时通信会不正常。当48转载 2017-09-01 17:52:57 · 4029 阅读 · 0 评论 -
数据在堆栈中存储方式
一、一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注malloc,calloc,new申请的内存均位于此区。3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块...转载 2019-03-22 10:13:29 · 8217 阅读 · 0 评论 -
数据存储_内存对齐和结构补齐
首先我们先看看下面的C语言的结构体:typedefstructMemAlign{ inta; charb[3]; intc; }MemAlign;以上这个结构体占用内存多少空间呢?也许你会说,这个简单,计算每个类型的大小,将它们相加就行了,以32为平台为例,int类型占4字节,char占用1字节,所以:4 + 3 ...转载 2019-03-22 10:15:40 · 580 阅读 · 0 评论 -
C语言_数组名、数组地址
1.开篇很多博客和贴吧都有讨论这个话题,各有自己的表述方式,今天在他们的基础上我将继续试着以我自己理解的方式总结一下,欢迎大家的审阅和指评。2.论数组名array、&array的区别——省政府和市政府的区别例如:int array[4] = {0};总所周知,其中的&array是整个数组array的首地址,array是数组首元素的首地址(和&array[0...转载 2019-03-22 10:34:47 · 748 阅读 · 0 评论 -
keil仿真调试时查看数组全部内容的方法
在keil进行仿真调试时,经常需要查看变量的运行数据。例如有时需要查看数组的全部内容。接下来介绍如何查看数组的全部内容。 点击View--Watch Windows--Watch 1(Watch 2),即可弹出查看窗口。在其中输入某数组名,即可查看该数组的所有内容。...原创 2019-03-22 10:43:18 · 12294 阅读 · 0 评论 -
函数指针形参
一、在介绍指针形参之前,先简要说明下两个运算符 & 和 *。1、取址运算符 & 用来取得其操作数的地址。取址运算符的操作数必须是在内存中可寻址到。换句话说,该运算符只能用作函数或对象(例如左值),而不可以用于位字段,以及那些未被存储类型修饰符register声明的内容。float x, *ptr;ptr = &x; // 合法:使得指针p...原创 2019-03-22 15:16:04 · 5125 阅读 · 0 评论 -
TM4C123GH6PZ程序仿真时进入FaultISR的一个原因
背景知识:TM4C123GH6PZ该款MCU支持FPU单元。在我一直ucos时,发现程序仿真时总会进入FaultISR,经过查找确认,原因如下。 在某些函数使用了float的变量,而且在keil软件设置中选择了使用FPU,见图1,而程序当中任务跳转时没有按照对应FPU设置堆栈操作,从而导致了进入FaultISR。 ...原创 2019-04-01 10:14:16 · 1279 阅读 · 1 评论 -
Project rule not found--C++ Builder上位机
最近在进行测试上位机的编写,因为是在之前上位机基础上面进行修改,有个.lib文件已经找不到了,所以编译时总会提示错误。根据提示是一个GIFIMAGE.LIB,我的上位机最终不需要这个库,所以也不打算安装。这时就有问题了,怎么才能不安装库的情况下仍然能使用之前的上位机进行修改编译呢?在网上搜索发现用另外的文件打开.bpr工程文件,然后将文件中含有报故障的.lib库删掉即可,于是我使用记事本打开.bp转载 2017-06-06 17:45:53 · 1086 阅读 · 0 评论 -
stm32f103-I2C学习
这两天在学习stm32f103的I2C总线,查看之前关于I2C总线代码,发现代码中未开启I2C的外设时钟,但是实际的电路中有使用到I2C总线器件,这让我很疑惑。自己查看了程序代码发现代码并未使用stm32的硬件I2C模块,而是使用了GPIO模拟了I2C接口使用。于是我在网上搜索了关于stm32的I2C使用才发现stm32f101x和stm32f103x系列的I2C的确使用中有BUG,而且ST官方也原创 2017-04-25 14:27:24 · 2773 阅读 · 0 评论 -
void及void指针理解使用
最近在学习RTOS系统,在代码中使用了很多的void 及void *,之前对此一直懵懵懂懂,所以专门抽出时间学习了void及void * 的含义及使用。一、void的含义void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。二、void真正发挥的作用在于: (1)对函数返回的限定; (2)对函数参数的限定三、void的使用规则:转载 2017-04-24 13:11:40 · 770 阅读 · 0 评论 -
STM32单片机使用ST-LINK调试程序时不能设断点
我使用的是STM32单片机,昨天使用ST-LINK调试程序时,发现有些语句不能设断点。程序编译时OK的,没有错误,将程序烧录入单片机后程序看着也能正常运行,但是点击keil中debug按钮后程序进入调试状态,程序并没有停留在main函数的第一条语句,而是停留在别处。main函数第一条语句不能设置断点。 经过在网上查阅资料,发现可能是由于keil软件代码优化的问题。经过测试,发现果然原创 2016-11-04 17:05:56 · 10493 阅读 · 1 评论 -
STM32单片机程序启动
ARM7和ARM9内核启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的。 STM32内核则不同,M3内核规定起始地址必须存放栈顶地址,第二个地址必须是复位中断向量的入口地址,这样CPU复位后会自动从下一个32位地址取出复位中断向量的入口地址,PC就跳转到中断服务程序,所以M3是固定了中断向量表的位置而起始地址是可变的。原创 2016-11-04 17:18:59 · 1642 阅读 · 0 评论 -
window自带超级终端如何显示自己输入的字符及其呼叫功能
最近在编写STM32单片机IAP程序,ST官方例程代码是使用的Ymodem协议,并且推荐的使用超级终端进行通信更新APP,所以最近一直在用超级终端。xp系统一般都自带,在开始菜单里能找到,WIN7我没有找到。 如果不设置超级终端,默认是不会显示自己输入的字符的,设置方法是:文件->属性->设置->ASCII码设置,勾选“本地回显键入的字符”,即可以看到自己输入的字符。另外超级终原创 2016-10-27 08:21:38 · 1473 阅读 · 0 评论 -
keil中printf函数及bin文件生成问题
以下是这几天遇到的问题及解决方法,希望能帮到大家。1、我使用的是keil 4,最近在学习数据结构,想把书本中的代码全部运行一遍,因为学习最重要是实践,只是看似乎已经看懂了但是真正使用的时候恐怕还是不会使用。所以想在keil中运行书本中示例代码,代码如下:int main(){int i=39;printf(“%d\n”,i);printf(“%d\n”, &i);}原创 2016-10-25 21:21:16 · 1189 阅读 · 0 评论 -
hex文件和bin文件区别
HEX文件和BIN文件是我们经常碰到的2种文件格式。因为自己也是新手,所以一直对这两个文件懵懵懂懂,不甚了解,最近在做STM32单片机的IAP更新,其中要考虑HEX文件和BIN文件,所以需要学习下这两种文件。下面是最近的我的了解,如有不对地方还请指正。1. HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身 在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为H原创 2016-10-29 11:28:13 · 22129 阅读 · 1 评论 -
keil编译后code,RO-data,RW-data,ZI-data含义及mcu的flash实际存储数据
keil编译后会有一行:Program Size:Code=xxxRO-data=xxx RW-data=xxx ZI-data=xxxCode 代表执行的代码,程序中所有的函数都位于此处。RO-data 代表只读数据,程序中所定义的全局常量数据和字符串都位于此处。RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此原创 2016-10-29 12:13:35 · 19493 阅读 · 4 评论 -
电容式触摸按键原理
现阶段,随着电容式触摸按键在外形美观和使用寿命等方面都优于传统的机械按键,电容式触摸按键的应用领域也日益广泛,包括家电、消费电子、工业控制和移动设备等。本文就一种具体的电容式触摸开关芯片SJT5104介绍一下电容式触摸按键的基本工作原理和材料选择。一 工作原理 任何两个导电的物体之间都存在着感应电容,一个按键即一个焊盘与大地也可构成一个感应电容,在周围环境不变的情况下,该感应电容转载 2016-11-10 17:39:01 · 71554 阅读 · 3 评论 -
\r,\n,\b
最近在编程中遇到了\r,\n,\b这几个字符的问题,还是因为基础掌握的不扎实,实际使用中忘记了对应的功能。1. \n:换行,将光标移到下一行。 \r:回车,将光标移动本行开头。 \b:退格,将光标移到前一列。2.Windows中Enter键代表\r\n(回车+换行)。 实际写程序中也会发现\n代表的是将光标移到下一行行首。原创 2016-10-31 17:43:14 · 568 阅读 · 0 评论 -
c指针学习
一、指针可以加上或减去一个整数,指针的这种运算的意义与通常数值的加减意义不同,是以单元为单位的。转载 2017-01-20 17:27:47 · 475 阅读 · 0 评论 -
宏定义(#define)和常量(const)的区别
之前一直没有仔细研究过 #define 和 const 的区别,最近由于种种原因被问及此点,完全一头雾水,于是便搜集相关资料做了如下的总结。#define和const区别1.类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查其中,边际效应是指如下错误原创 2017-04-18 17:27:23 · 1854 阅读 · 0 评论 -
串口--异步通信和同步通信深入理解
在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信。而按照串行数据的时钟控制方式,串行通信又可分为同步通信和异步通信两种方式。同步和异步大家从名称上就大概知道区别在哪里,简单的说就是主机在相互通信时发送数据的频率是否一样。异步通信就是发送方在任意时刻都可以发送数据,前提是接收端已经做好了接受数据的准备(如果没有做好接受准备,数据肯定发送失败),也正是因为发送方的不确定性,所以接转载 2017-05-05 17:14:28 · 15370 阅读 · 0 评论 -
SPI和IIC通信区别
一、IIC IIC 是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线—— ‘serial data’ (SDA) 和 ‘serial clock’ (SCL)。 IIC协议规定: 第一,每一支IIC设备都有一个唯一的七位设备地址; 第二,数据帧大小为8位的字节; 第三,数据(帧)中的某些数据位用于控制通信的开始、原创 2017-05-05 17:25:11 · 7616 阅读 · 1 评论 -
ucosii 系统栈,任务栈
1.之前一直不了解堆栈向下生长、向上生长究竟表示什么意思。最近仔细学习了下,简而言之,向下生长是指数据从高地址向低地址增长;向上生长就是数据从低地址向高地址增长。堆栈增长演示: 上图显示了堆栈 向上增长和向下增长的区别。如果堆栈是向下增长,也就是从高地址向低地址增长,那么在任务刚开始创建后,堆栈是空的。如图中例子,栈顶在为TaskStk[0][511],栈底为在T...转载 2019-04-03 15:37:20 · 1406 阅读 · 0 评论