
ARM
猪哥-嵌入式
这个作者很懒,什么都没留下…
展开
-
Coap协议RFC7252英文版地址 + 常见工业通信协议集合
整理了常用的工业通信协议、Coap协议,为了让大家方便使用,统一放置到gitee仓库,仓库地址如下:《》原创 2022-12-08 21:22:42 · 615 阅读 · 1 评论 -
RTOS系列文章(7):CM3/4之LR寄存器、EXC_RETURN深入分析
在Cortex-M3/4中有个特殊的寄存器R14,这个寄存器还有一个大家熟知的名字LR,LR全称为Link Register,有的书本上会翻译成链接寄存器。该寄存器一般用于存放函数退出返回地址。除了函数调用返回使用,中断退出也会使用LR,不过中断返回机制与函数返回机制会有一些细节不通,中断返回虽然也是通过LR,但是还会有EXC_RETURN辅助。这里我们直接引用《The definitive guide to ARM Cortex-M3/4》中对LR的介绍:翻译过来,有如下重点知识:如上面描述,LR是链原创 2022-06-04 18:46:39 · 5763 阅读 · 4 评论 -
打孔纸带计算机运行原理
前言最早期的计算机雏形采用打孔纸带作为程序,理解打孔纸带计算机运行原理有利于我们理解计算机CPU的运行原理,因为到目前为止,计算机的运行原理本质上没有变,都是运行0/1状态的计算。本文引用了知乎的回答打孔纸带计算机运行原理,这里向回答者致敬,答案浅显易懂。基本原理打孔纸带编程的本质是基于机器码的程序。场景举例假定现在有一个简单CPU,其能运行10种指令,对应的二进制为:halt -- 0000mov -- 0001add -- 0010and -- 0011or -原创 2021-04-16 18:46:27 · 9569 阅读 · 4 评论 -
Modbus协议中文pdf免费下载地址
本着开源的精神,给大家分享 资源。Modbus中文版免费下载地址原创 2021-04-14 22:15:41 · 5675 阅读 · 5 评论 -
DLT645-97、07协议pdf免费下载地址
前言网上各种资源都要各种积分,这里我把自己积累的一些协议分享给大家。DLT645协议pdf下载地址没错,就是在gitee上。原创 2021-04-14 22:08:10 · 3386 阅读 · 9 评论 -
理解CPU的 推挽、开漏输出以及应用场景
0- 概述在嵌入式CPU中,GPIO口都是可以设置成多种模式的,比如STM32的芯片 GPIO端口可以由软件配置成多种模式: 对于 输入模式和复用功能模式,都是比较容易理解的,但是 输出 推免输出和开漏输出,理解起来确实有些难度, 如果不理解这两种模式,那么对于这两种模式的应用场景,也是难以很好的理解的,接下来,我们就以STM32的 GPIO口的 结构为例,从电路的角...原创 2020-02-20 14:09:36 · 11571 阅读 · 6 评论 -
Nor Flash芯片内执行(XIP)
前言:这个所谓的芯片内执行(XIP)对于我这种一根筋的人是很难理解的,一直总觉得CPU是只能在RAM中运行程序,为毛能够在Nor Flash中执行程序呢,这里面就有个概念容易混淆,也可能是翻译理解的问题。 所谓片内执行不是说程序在存储器内执行,CPU的基本功能是取指、译码、运行。Nor Flash能在芯片内执行,指的是CPU能够直接从Nor flash中取指令,供后面的译码器和执行器...转载 2018-07-13 18:07:41 · 23409 阅读 · 3 评论 -
数据栈简单使用规则
首先一定要明白一点,“栈”和”堆“本质上是一小块”内存“,用于程序的运行中存放中间变量。 栈有很多种,这里介绍最常见的一种所谓FD型栈,即数据栈内存地址从高向低呈减小的方向增长,栈指针指向栈顶元素,这里的栈顶其实也是“低”地址。 上图中包含了下面的概念: (1)数据栈的栈指针:指最后一个写入栈的数据的“内存地址”。 (2)数据栈的基地址:指数据栈的最高地址,...原创 2018-07-05 22:03:47 · 1694 阅读 · 0 评论 -
IAR之 Use CMSIS
在使用IAR时,尤其是从MDK转到IAR编程时,这个Use CMSIS会困扰很多人,当然也包括我,这个要不要勾选,会出现n多的编译错误,下图所示: 这里有一个概念“CMSIS”,这个是ARM公司做的微控制器软件接口标准,CMSIS:Cortex Microcontroller Software Interface Standard,是Cortex-M处理器系列与供应商无关的硬件抽象...原创 2018-07-04 14:09:57 · 7777 阅读 · 1 评论 -
.word 汇编指令
在汇编文件中经常见到“xxx: .word expression” 这里的用法就是 在当前位置放一个word型的值,这个值就是expression, 举例来说: _rWTCON: .word 0x15300000 就是在当前地址,即_rWTCON处放一个值0x15300000 翻译成intel的汇编语句就是: _rWTC...原创 2018-07-03 21:35:07 · 4614 阅读 · 0 评论 -
LDR命令
LDR指令用于从内存中将一个32位的字读取到指令中的目标寄存器中,如果目标寄存器为PC,则可以实现“长”跳转。主要有一下3种方式使用:ldr r0,_startldr r0,=_startldr pc,_start 逐条分析:一、ldr r0,_start 从内存地址_start的地方,把其对应的 命令执行对应的 “执行码”读入到r0中。二、ldr r0,=_start ...原创 2018-07-03 21:01:55 · 29298 阅读 · 0 评论 -
ADR伪指令
这是一个特别有意思,有难度的指令,理解起来确实比较绕。 ADR——小范围的地址读取伪指令,该指令将基于PC的地址或基于寄存器的地址值读取到寄存器中。 这里特别注意,是“基于PC”,不是什么链接地址、绝对地址啥的,很固定,一定是基于PC. 语法格式: ADR {cond} reg,expr 其中:cond——可选的指令执行条件。 reg...原创 2018-07-03 16:51:04 · 3119 阅读 · 1 评论 -
__inline 关键字使用
inline关键字是用于函数声明或定义,可以把函数指定为内联函数,而且关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前是不起任何作用的。 inline的作用是什么呢?为什么要引入inline功能呢?简单的讲inline的作用与 宏定义 作用相同,但是又不尽相同,我们知道一般#define宏定义就是直接替换功能,不管是变量还是 表达式,一般都...原创 2018-07-05 22:44:21 · 24604 阅读 · 3 评论 -
汇编:import和export
import:翻译为进口或引入,表明要调用的函数为外部文件定义 export:翻译为出口或输出,表明该符号可以被外部模块使用,类似于C中的extern功能。...原创 2018-07-06 21:17:45 · 13963 阅读 · 1 评论 -
汇编和C交叉调用
汇编和C的交叉访问也是很常见的,汇编中访问C,是因为一般上电初始化只能用汇编,但是汇编语言毕竟不是高级语言,想要简单实现复杂功能,就需要在汇编中调用C,而C中调用汇编,多是因为需要直接跟底层硬件打交道,所以需要C中引用汇编,简单的说几种:一、汇编程序中访问C程序变量 (1)在汇编中,先使用IMPORT声明该变量。 (2)使用LDR指令读取该变量的内存地址,也就是用“LDR r0...原创 2018-07-06 22:38:24 · 3355 阅读 · 0 评论 -
.word 汇编指令
我们在汇编文件中经常会见到.word指令,如下所示:label: .word express 这里的用法表示:在当前位置存放一个字,可能有些人会觉得就是放一个字word,这个要怎么看了,一般一个word是两个字节,跟CPU的型号有关,所以不要管word的限制,直接理解成,在当前位置存放一个字,这个字是32位的即可。 上面是一般人的解释,进一步讨论下,这个地址...原创 2018-08-04 11:04:01 · 9633 阅读 · 0 评论 -
ldr r0,label和ldr r0,=label的区别
ldr的这两种用法总是容易混淆的,先说结论: ldr r0,label是将标识label处的内容赋值给r0,而ldr r0,=label则是将label这个这个所谓的立即数 数值赋值给r0。 来看几个例子:_TEXT_BASE: .word TEXT_BASE_armboot_start: .word _start_bss_s...原创 2018-08-04 11:12:10 · 6692 阅读 · 0 评论 -
为什么需要内存RAM——内存、程序执行的形象分析
这里就不去讲RAM的各种专业术语了,要是讲,估计一个博士论文也讲不完,这个问题也一直困惑着我,我也只是从使用的角度去联想,方便去理解,毕竟很多程序员都有强迫症,必须要想明白,才愿意去用。 我们打个比方,场景是一个不大不小的饭店,饭店里有个厨房,储藏间,存放了各种蔬菜、肉、调味料等原料。厨房里目前有1名永远只会动嘴不会动手的主厨、的1名书呆子厨师、1名搬运工、1名洗菜师傅、1名切菜师...原创 2019-06-07 20:48:32 · 1174 阅读 · 0 评论 -
CPU执行程序的简单理解
本文引用了《CPU执行程序的原理(简化过程)》、《CPU的运行到函数调用做个了解》部分图片和内容,这里向作者致谢。 这里不去讲过于专业的专业知识,毕竟,CPU上的任意一个知识点,想讲明白,都不容易,我们从使用者的角度去分析,CPU执行程序的过程原理。目录一、背景知识简单介绍1、CPU系统图2、RAM3、ROM4、指令二、程序运行基本流程知识延伸:函...原创 2019-06-07 22:00:26 · 5233 阅读 · 0 评论 -
STM32滴答定时器(Systick)详细详细解析
在ARM Cortex-M3内核中有一个Systick定时器,它是一个24位的倒计数定时器,当计数到0时,它就会从Load寄存器中自动重装定时初值,只要不把CTRL寄存器中的ENABLE清0,它就永不停。对于滴答定时器的理解主要分为下面几项:1.滴答定时器的时钟来源看上面的图会有一个错觉,以为滴答定时器是系统时钟的1/8,其实不是,滴答定时器的时钟既可以是HCLK/8,也可以是HC原创 2016-04-26 16:42:47 · 40331 阅读 · 1 评论 -
ARM9——五级流水线结构,以及PC指针
ARM7是三级流水线,所以PC = 执行指令地址 + 8,这很好理解,但是在ARM9中,是五级流水线,仍然是:PC = 执行指令地址 + 8,而不是 PC = 执行指令地址 + 16. 这个理解显然有些难度,首先看下ARM7和ARM9的流水线区别和联系: 相比ARM7,ARM9采用了更高效的五级流水线设计,在取指令、译码、执行之后,又增加了LS1和LS2阶段,LS1负责...转载 2018-07-03 15:44:52 · 10223 阅读 · 1 评论 -
ARM——三级流水线结构,以及PC指针
首先科普几个概念: MIPS——Million instruction Per Second 每秒多少百万条指令,比如0.9MIPS,表示每秒90万条指令。 MIPS/MHz表示CPU在1MHz的运行速度下可以执行多少个MIPS,比如0.9MIPS/MHz表示如果CPU运行在1MHz的频率下,每秒可执行90万条指令. 这两个概念常用作描述ARM类的CPU执行速度,比如ST...原创 2018-07-03 14:54:47 · 7830 阅读 · 0 评论 -
嵌入式C编程的几个基础
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情:1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计转载 2017-04-27 17:40:34 · 1026 阅读 · 0 评论 -
uCOS-III移植到STM32分析
摘要:所谓移植是将一个系统嵌入到STM32工程项目中,需要将STM32的工程“神经”与uC/OS的“神经”搭一起。而对于操作系统的移植,我们需要知道功能流程,没有必要所有的程序代码都需要自己写,那就变成自己写操作系统了,会特别累。 一、移植步骤简述(1)下载STM32最新固件库3.5版本。(2)创建一个纯净的裸机工程项目。(3)uC/OS官网下载STM32的案例程序,找原创 2016-12-27 22:31:38 · 19694 阅读 · 1 评论 -
STM32 通用定时器的一些概念解析
STM32一共有8个定时器,其中定TIM1和TIM8为高级控制定时器,除了具有通用定时器的功能外,还兼具控制功能,不仅能够输出PWM还可以采集编码器,驱动各种电机的功能。而基本定时器TIM6和TIM7一般不用作普通定时器,一般会给别的定时器提供基准时钟信号。对于通用定时器TIM2~TIM5,基本的功能就不描述了,主要是看这些通用定时器如何使用:TIM_TimeBaseInitTypeDef原创 2016-05-24 17:17:02 · 4246 阅读 · 0 评论 -
uCOS时钟节拍和滴答定时器的关系
在使用uCOS时,有一个非常重要,非常关键的概念就是操作系统的时钟节拍,uCOS的时钟节拍来源于滴答定时器,滴答定时器按照设定的时间不停的计时和产生中断,在uCOS-III中滴答定时器的中断服务函数如下:void OS_CPU_SysTickHandler (void){ CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); OSIntNes原创 2016-04-26 17:07:08 · 13602 阅读 · 0 评论 -
uCOS-II中PendSV_Handler和SysTick_Handler
在uCOS的移植中有两个函数是移植工作的核心,相当于将裸机程序与操作系统的“神经”搭在一起,使得操作系统得以运行,这两个系统中断分别为:1.SysTick_Handler:滴答定时器中断,这个中断相当于操作系统的心脏,给操作系统提供心跳,滴答定时器会一直不停的不断触发中断,在它的中断服务函数中,提供进程/任务的上下文切换,和任务调度的工作,简单描述如下图:这是最简单的调度模式,如果在滴原创 2016-03-27 12:22:02 · 14766 阅读 · 0 评论 -
STM32F10X的时钟树及时钟初始化
对于初学者而言,时钟是一个很重要很深的概念,对于STM32芯片来讲,为了实现低功耗,设计了一个功能完善但是却很复杂的时钟系统,使得外围功能的时钟可配置,相对应的,单片机的时钟基本上固定的几种,简单配置后就能使用,而STM32的外围功能不仅要配置,还需要在最开始就要设置这些外设时钟,只有使能这些外设时钟后,这些外设才能够使用。STM32的时钟树,如下图所示:STM32有一下4个时钟源:原创 2016-03-24 17:27:45 · 6981 阅读 · 0 评论 -
为什么需要bootloader
受单片机和ARM7等小型CPU设备编程思维的影响,开始对嵌入式linux和PC中存在bootloader/BIOS的意义有了疑问bootloader到底有没有必要存在呢?答案是:大部分情况下是有必要的。首先,bootloader的作用是在硬件商店后运行的第一段软件代码,也叫引导加载程序,是在操作系统内核运行之前运行的一小段程序,这小段程序的作用一般是初始化硬件设备,比如内存啊,堆栈等等,从原创 2016-01-21 22:13:43 · 6571 阅读 · 0 评论 -
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
这两个函数是uC/OS操作系统进入/退出“临界区”的功能代码,一般格式为: OS_CPU_SR cpu_sr=0; ////(1) OS_ENTER_CRITICAL();//(2) ...............(4).............OS_EXIT_CRITICAL();///(3) 其中OS_ENTER_CRITI原创 2015-12-14 21:26:30 · 28497 阅读 · 0 评论 -
STM32之GPIO并行输入输出数据编程技巧
在STM32实际编程中,会遇到GPIO口连续的引脚并行输出应用,例如数码管驱动,LCD并行驱动,如果单独逐个去驱动IO口,编程麻烦,而且效率比较低,其实可以直接采用寄存器编程实现,这种思路的前提是,尽量从GPIO_Pin_0端口开始分配管脚,这样比较方便。这里主要用到GPIO的2个寄存器,分别是端口输入数据寄存器“GPIOx_IDR”和端口输出数据寄存器“GPIOx_ODR”其中x=A...E原创 2017-06-29 18:56:02 · 20255 阅读 · 0 评论 -
FreeModbus 移植--REG_INPUT_START 各种寄存器起始地址
实际上modbus协议原本是用在plc上的,plc的第一个数据起始地址就是1。如果起始地址为0,会导致第一个寄存器数据无法读出,因为你从modbusPoll发出去看上去是从0开始读取的,但是freemodbus转换后起始地址是1,读取数据函数里读取哪个地址使用的地址是iRegIndex = ( int )( usAddress - REG_INPUT_START );而usAddr原创 2017-08-08 18:58:56 · 3376 阅读 · 0 评论 -
内存是什么及作用
这一问题乍一看会觉得特别简单,但是仔细一想,却很难准确的概括。 内存:RAM-随机存储器。 程序的运行是需要有一个场所的,因为对于CPU来说,甭管i7或者i8就那么几个寄存器,这一点特别能被忽略,对的,再高级的CPU确实只有那么几个寄存器,CPU的所有动作都是直接对寄存器操作的,都是要一个一个来的,就相当于总理,总理日理万机,即便要干n多事情,还是在他那个有限的大脑里一件一件的...原创 2018-06-26 21:32:11 · 5491 阅读 · 0 评论 -
ARM处理器的7种工作模式--linux操作系统与ARM的工作模式
一、ARM处理器的7种工作模式用户模式(USR):正常程序执行模式,不能直接切换到其他模式系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由...原创 2018-03-24 21:27:01 · 4229 阅读 · 0 评论 -
ARM 链接地址和烧写地址
在ARM设计中,一般会涉及都一个链接地址,这个链接地址和烧写地址很容易混淆,会认为链接地址就是烧写地址,这个是错的,下面说的是个人的一些认识,可能会有一些错误,说的也可能不专业,但是对于初学者,可以帮助理解。 首先链接地址和烧写地址是两个范畴的东西,几乎是没有关系的,烧写地址,可以认为是物理地址,而链接地址可以认为是虚拟地址,对于程序员来说,看到的是虚拟地址,一般虚拟地址经过MMU映射成原创 2017-12-11 21:01:33 · 1155 阅读 · 0 评论 -
STM32 用于Modbus ASCII通信,进一步串口通信参数7,E,1特别注意
Modbus RTU使用频率要多于Modbus Ascii,优缺点在这里就不赘述了,这里主要讲STM32用于Modbus Ascii的通信方式,查看modbus标准通信协议后发现,ASCII通信参数要求而且Modbus ASCII报文中,要求每个8位字节,以2个ASCII字符发送,例如0x01,要以0x30,0x31两个ASCII字符发送。使用STM32进行开发的时候,串口通信,由原创 2017-10-13 10:04:01 · 4821 阅读 · 2 评论 -
STM32中断优先级彻底讲解
转自:http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html 作者写的很棒,点赞。一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。二:优先级判断STM32(Co转载 2017-10-28 18:11:06 · 3131 阅读 · 0 评论 -
STM32 Flash读写;Flash地址对应的存储内容及方式;
概念:计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是1个字节,1个存储单元存放1个字节,每个存储单元对应一个16位(bit)地址,所以重要的话说三遍:一个16位地址指向1个字节!!! 一个16位地址指向1个字节!!! 一个16位地址指向1个字节!!!我们常说的flash空间,多少多少K,指的是多少多少K byte假如我们执行下面原创 2017-08-11 15:08:57 · 28050 阅读 · 2 评论 -
STM32 UART5 中断接收不定长度字节
1.不知道何时接收完成-延时,或固定字符,例如0x0D,0x0A2.通信参数9600,7,E,1,接收到的数据应与 0x7F相“与”操作,这是STM32的硬件bug原创 2017-08-03 19:35:41 · 3499 阅读 · 1 评论 -
Modbus编程测试,保持寄存器首个寄存器运行一段时间后为0
由于定义了输入寄存器和保持寄存器为全局变量,输入在前,保持在后,所以在RAM内部是自动顺延排序,而定义输入寄存器的个数少了一个,所以再向输入寄存器的最后一个寄存器写的时候,直接写入到了保持寄存器中,这个问题很难找到原因,直到逐步添加调试钩子函数,才发现问题。原创 2017-08-16 15:16:06 · 999 阅读 · 0 评论