技术
<strong> 1、编写C代码:</strong>
1)预编译代码
2)定义及声明变量
3)定义及声明函数
4)编写程序代码(主函数MAIN)
<strong> 2、编译器编译:</strong>
1) 预处理
此时编译器会扫描一个一个的C源文件,如果发现#include了某个.h文件,则把整个.h文件包含进.c文件中,形成一个新的.c文件(实际的实现过程可能不是这样,但原理是这样的)。同时进行相关预处理指令的解释工作,譬如将宏替换成实际的值。
2) 编译源文件
本节主要介绍Cortex-M0的异常处理模型。
<strong>1、异常的状态</strong>
每个异常都处于以下状态之一:
<strong>未激活(Inactive) </strong>
异常没有被激活也没有被挂起。
<strong>挂起(Pending) </strong>
异常正等待被处理器服务。
来自外设或软件的中断请求,能让相应中断变为挂起状态。
<strong>激活(Active)</strong>
异常正在被处理器服务,并且服务尚未结束。
注意:一个异常处理能中断另一个异常处理,在这种情况下,两个异常都处于激活态。
<strong> 一.MCU测试</strong>
1.mcu工作电压及电流
测试MCU工作电压是否在工作电压范围,电压过高会影响MCU的正常工作甚至烧坏,工作电压过低会影响MCU的外围电路驱动能力,甚至导致外围电路不能正常工作。
2. mcu静态电流
静态电流是衡量MCU性能的主要参数之一,静态电流越小越好,根据MCU规格书测试静态电流是否符合要求,一旦MCU有损坏的话,静态电流就会变大,会增加产品的静耗,致使产品整体功耗增加。
3.mcu的振荡频率
如MCU为外接晶振型的,需要检测其正常工作时MCU的晶振输入脚的振荡频率是否正确,如果晶振振荡频率不符合要求则会影响产品的定时及延时,甚至不能正常工作。
在单片机编程的过程中,如果一名设计者能够同时掌握多门编程语言,那么这名设计者肯定是一位非常优秀的人才。但是想要同时精通汇编、C语言、C++这三门语言实在是太难了,很多初学者在其中一门的学习中就已经到处碰壁,苦不堪言。本文特意为大家整理了拥有嵌入式编程领域多年工作经验的工程师意见,汇总成了一篇能够对嵌入式编程经验有着指导意义的注意事项,感兴趣的朋友快来看一看吧。
在单片机嵌入式编程中,最难的两部分是interrupt和MM(memorymanage),之所以有人觉得并不困难,那是因为太多数情况下芯片制造商都已经直接写好,但是如果设计者本身就在为芯片制造商工作,那就必须自己会写配置文件。
本文将描述Cortex-M0设备的内存映射和内存访问行为。该处理器有一个固定的存储映射,它可以提供高达4GB的可寻址内存。存储映射图如下:
<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002417-7659-1.jpg&q…; alt=""></center>
<strong>1 – 总览</strong>
对于一个 ARM 微控制器的初学者来说,有时候要找到一些有用的设计参考信息是非常困难的一件事。因为在网上实在有太多资源了,最先遇到的困难可能就是能不能找到一个地方帮助你正确选择一款 ARM 的处理器 ,目前,主要有两种 ARM 处理器:
应用处理器 Application processors – 这些都是能跑操作系统的,比如 Linux 呀, Windows RT 啥的。典型应用就是智能手机,移动计算设备甚至服务器。 推荐用 ARM Cortex-A 系列处理器
<strong> 方法1:</strong>
启动文件中:(默认启动文件也是这样)
org 0x18
ldr pc,[pc,#-0xFF0] ; 直接跳转到用户中断处理函数
直接写用户中断函数
__irq __arm void Tmr0_IntOnMR0_isr(void)
{
............
}
__irq __arm void Tmr1_IntOnMR0_isr(void)
{
............
}
<strong> 方法2:</strong>
启动文件中:(默认启动文件也是这样)
由于嵌入式开发环境的特殊性(交叉编译),我们会用到一些其他的外围工具,这里做简要的说明。并重新介绍一下整个开发环境中,各个工具的使用,及一个简单应用的开发流程。
<strong> SecureCRT : 串口输出显示工具、SSHclient 。</strong>
SecureCRT 是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议。
这个是最有用的吧,你看到她就会爱上她。并且是可以窗口内多标签,界面和蔼可亲的。
<strong> DNW : USB下载工具。(配合u-boot使用)</strong>
本节描述Cortex-M0编程模型。除了内核的各个寄存器之外,还包含处理器操作模式和堆栈的介绍。
<strong>1、处理器工作模式</strong>
处理器工作模式有:
<strong>Thrread模式</strong>
用于执行应用程序,在处理器复位时,进入Thread模式。
<strong>Handler模式</strong>
用于异常处理,处理器执行完所有异常程序后,返回到Thread模式。
<strong>2、堆栈</strong>
本文将简要地介绍Cortex-M0处理器及其特性:
<strong>Cortex-M0处理器及其核外设</strong>
Cortex™-M0处理器是用于嵌入式应用设计的入门级ARM Cortex 32位的处理器。它为开发者提供以下好处:
• 简单易用的编程模型;
• 高效的低功耗操作模式;
• 高代码密度;
• 可确定的、高效的中断处理;
• 向上兼容Cortex-M 处理器系列其他处理器。
<strong>一、什么是栈对齐?</strong>
栈的字节对齐,实际是指栈顶指针须是某字节的整数倍。因此下边对系统栈与MSP,任务栈与PSP,栈对齐与SP对齐 这三对概念不做区分。另外下文提到编译器的时候,实际上是对编译器汇编器连接器的统称。
之前对栈的8字节对齐理解的不透,就在网上查了好多有关栈字节对齐、还有一些ARM对齐伪指令的资料信息,又做了一些实验,把这些零碎的信息拼接在一起,总觉得理解透这个问题的话得长篇大论了。结果昨天看了AAPCS手册、然后查到了没有使用PRESERVE8伪指令出现错误的实例,突然觉得长篇大论不存在了,半篇小论这问题就能理顺了。
<strong>二、AAPCS栈使用规约</strong>
在单片机系统中,串口(UART,通用异步收发接口)是一个非常重要的组成部分。通常使用单片机串口通过 RS232/RS485 电平转换芯片与上位机连接, 以进行上位机与下位机的数据交换、参数设置、组成网络以及各种外部设备的 连接等。RS232/RS485 串行接口总线具有成本低、简单可靠、容易使用等特点,加上其历史悠久,所以目前应用仍然非常广泛;特别对于数据量不是很大 的场合,串口通信仍然是很好的选择,有着广阔的使用前景。
在单片机编程中,串口占了很重要的地位。传统方式串口程序的调试,往往是利用专用的单片机硬件仿真器。在编写好程序后,利用仿真器来设置断点,观察变量和程序的流程,逐步对程序进行调试,修正错误。使用硬件仿真器的确是很有效的方法,但是也有一些缺点:
Eclipse编程中的Debug工具(即自动找错工具)的使用方法:
首先在Eclipse中编写一段代码以下边代码为例,看到代码左边的蓝条
<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002327-7324-1.png&q…; alt="" width="600"></center>
找到int n=10,X=5,y=2;这行点击鼠标右键,
随着微电子技术和计算机技术的发展,原来以强电和电器为主、功能简单的电气设备发展成为强、弱电结合,具有数字化特点、功能完善的新型微电子设备。在很多场合,已经出现了越来越多的单片机产品代替传统的电气控制产品。属于存储程序控制的单片机,其控制功能通过软件指令来实现,其硬件配置也可变、易变。因此,一旦生产过程有所变动,就不必重新设计线路连线安装,有利于产品的更新换代和订单式生产。
CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。
存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私有外设区的组件包括:闪存地址重载及断点单元(FPB),数据观察点单元(DWT),仪器化跟踪宏单元(ITM),嵌入式跟踪宏单元(ETM),跟踪端口接口单元(TPIU), ROM 表。
CM3的地址空间是 4GB, 程序可以在代码区,内部 SRAM 区以及外部 RAM 区中执行。但是因为指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用自己的总线,并行不悖。
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:
要使用低成本的32位处理器,开发人员面临两种选择,基于Cortex-M3内核或者ARM7TDMI内核的处理器。如何做出选择?选择标准又是什么?本文主要介绍了ARM Cortex-M3内核微控制器区别于ARM7的一些特点,帮助您快速选择。
<strong>1.ARM实现方法</strong>
ARM Cortex-M3是一种基于ARM7v架构的最新ARM嵌入式内核,它采用哈佛结构,使用分离的指令和数据总线(冯诺伊曼结构下,数据和指令共用一条总线)。从本质上来说,哈佛结构在物理上更为复杂,但是处理速度明显加快。根据摩尔定理,复杂性并不是一件非常重要的事,而吞吐量的增加却极具价值。
<strong>上机1 发光二极管的闪烁</strong>
<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002279-7131-1.png&q…; alt=""></center>
;开关断开,发光二极管灭;开关闭合,奇偶数发光二极管间隔0.1s交替点亮。
ORG 0
<center><img src="http://mm32.eetrend.com/files/filefield_paths/1.png" alt=""></center>
<strong>1、通用目的寄存器R0~R7</strong>
R0-R7 也被称为低组寄存器。所有指令都能访问它们。它们的字长全是 32 位,复位后的初始值是不可预料的。
<strong>2、通用目的寄存器 R8-R12</strong>
关于systick在Cortex-M4中有讲到,我们大家平常在单片机开发中经常会使用到延时函数,一般的,我们会使用变量自加循环判断的方法来实现软件延时。但是这种方法有个弊端——延时时间不精确。
主要体现在:
1、在C语言编写的延时函数中,每条函数语句的执行时间可能不同,这样,在实现延时的过程中,想通过增加或减少函数语句来实现延时的增加或减小控制起来不太方便,时间的精确性当然很难控制;
2、由于各种不同的控制器运行的主频可能不同,执行相同的延时函数所需要的的时间值可能就不同。这样,使得这种延时函数在不同的平台上移植起来时间的精确性就更不可靠。所以,我们就不使用这样的延时方法。