前言
文章内容为个人通过正点原子所提供的资料,学习ARMv7 Cortex-A架构型芯片I.MUX6ULL的相关内容和学习过程笔记。
1、ARM您得知道的那些事
这些事对你的编程或许没有太大的帮助,甚至没有帮助,但是了解它,知道它的怎么过来的,怎么成为嵌入式领域中世界的龙头老大的,它的家族是怎么样的,对你整体的认识会有很大的帮助。
1.1、ARM公司
ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Advanced RISC Machine,但是有些又说全称是Acorn RISC Machine。
1978年12月5日,物理学家赫尔曼·豪泽(Hermann Hauser)和工程师Chris Curry,在英国剑桥创办了CPU公司(Cambridge Processing Unit),主要业务是为当地市场供应电子设备。1979年,CPU公司改名为Acorn公司。
起初,Acorn公司打算使用摩托罗拉公司的16位芯片,但是发现这种芯片太慢也太贵。"一台售价500英镑的机器,不可能使用价格100英镑的CPU!"他们转而向Intel公司索要80286芯片的设计资料,但是遭到拒绝,于是被迫自行研发。
1985年,Roger Wilson和Steve Furber设计了他们自己的第一代32位、6M Hz的处理器,用它做出了一台RISC指令集的计算机,简称ARM(Acorn RISC Machine)。这就是ARM这个名字的由来。
RISC的全称是"精简指令集计算机"(reduced instruction set computer),它支持的指令比较简单,所以功耗小、价格便宜,特别适合移动设备。早期使用ARM芯片的典型设备,就是苹果公司的牛顿PDA。
1.2、ARM公司商业模式
ARM不生产芯片也不销售芯片,只出卖IP(IntellectualProperty“知识产权”,“版权”),这个版权就是ARM内核。ARM内核卖给世界各国的半导体公司,如苹果、华为、三星、TI、ST、NXP等等。然后这些公司就用这个内核设计自己公司的芯片,用自己的芯片做自己的产品。
能买ARM内核的公司都是大公司呀,这些公司利用ARM内核研发自己的芯片,卖自己的产品。也可以反过来想,利用了ARM内核研发自己芯片的公司,最后都成为了大公司,可想而知ARM公司有多牛逼。
但是成为大公司也不一定都是因为ARM内核,也得有自己独有的技术,比如华为的5G技术,华为加油!!!
1.3、ARM内核家族
内核版本 | SoC版本号 | 芯片型号 |
---|---|---|
ARMv1~ARMv3 | 初期用的人少 | 初期用的人少 |
ARMv4 | ARM7 | S3C44B0(三星) |
ARMv4 | ARM9 | S3C2440和S3C2410(三星) |
ARMv5 | ARM9+xScale | 应该被某公司垄断了 |
ARMv6 | ARM11 | S3C6410(三星) |
ARMv7 | Cortex-M | 单片机 STM32f103等(ST) |
\ | Cortex-A | 应用级处理器 如手机、平板、电脑 |
\ | Cortex-R | 实时处理器 工业,航天等领域 |
ARMv8(新) | Cortex-M | 未了解,欢迎评论指点 |
\ | Cortex-A | 未了解,欢迎评论指点 |
\ | Cortex-R | 未了解,欢迎评论指点 |
1.4、SoC与CPU的区别
SoC(System on Chip)系统级芯片:cpu和一些外设(IIC/UART等)集成到一个芯片中。
cup就只有一个单单的cpu。
ARM公司做的是cpu和它周边的总线,而半导体公司做的是,把cpu和外设集成到一个芯片中。
现在大部分的芯片都是SoC,并不是单纯的CPU,只是我们习惯把它叫成CPU而已。
2、I.MX6U相关开发流程
核心板资源:
I.MX6U相关开发流程如图所示。
2.1、裸机开发
对于工程文件部分,不同的项目会有不同的文件,这个就不用多说了,但是拿到一个芯片来开发一个项目最简单也是最重要的部分就是该芯片的IO口访问操作方式。
2.1.1、 I.MX6U的IO口访问方式简介
I.MX6U的GPIO一共5组:GPIO1(32个IO口),GPIO2(22个IO口)、GPIO3(29个IO口)、GPIO4(29个IO口)、GPIO5(12个IO口),一共124个GPIO。
1)、配置开启相关时钟CCM、相关寄存器有CCM_CCGR0~7。
2)、配置IO的复用功能及相关属性(上下拉、输出速度、驱动能力、摇摆率等),相关寄存器有___MUX_ and __PAD。
3)、配置IO的输入输出、中断、中断使能方式(上/下升沿、高/低电平、边沿触发等。)相关寄存器有DR、GDIR、PSR、IMR、ISR、ICR1、ICR2、EDGE_SEL。
1、开启所有时钟
2、配置IO的复用功能及相关属性。
在这里插入代码片
3、配置IO输入输出、中断、中断使能等
在这里插入代码片
在实际工作中,都是用C语言来进行嵌入式开发的,只是使用汇编来初始化一下C语言环境,比如初始化化DDR、设置堆栈指针SP等等。STM32也是这样的,启动文件startup_stm32f10x_hd.s这个汇编文件就是完成C语言环境搭建的,当然也有一些其他处理,比如中断向量表等。
一个只仅仅搭建C语言环境的汇编文件Start.s
.global _start //全局标识
_start:
//进入SVC模式,在6.2节的“Cortex-A处理器运行模式”讲解
mrs r0, cpsr
bic r0, r0, #0x1f //将r0的低5位清零,也就是cpsr的M0~M4
orr r0, r0, #0x13 //r0或上0x13,表示使用SVC模式
msr cpsr, r0 //将r0的数据写入到cpsr_c中
//设置栈指针 DDR3的起始地址为0x80000000 所以大小为0x80000000~0x80200000 2M字节
ldr sp, = 0x80200000
b main //跳转到main函数
2.1.2、I.MX6U的时钟系统简介
1)、时钟来源
时钟来源两部分:32.768KHz和24MHz的晶振,其中32.768KHz晶振是I.MX6U的RTC时钟源,24MHz晶振是I.MX6U内核和其他外设的时钟源。
2)、7路PLL
外设的时钟,来源7路的PLL,而7路的时钟源都是从24MHz晶振PLL而来的,因此也叫做7组PLL。
ARM_PLL(PLL1):供ARM内核使用,此PLL通过编程的方式最高可倍频到1.3GHZ。
528_PLL(PLL2):也叫System_PLL,固定是2422=528MHz,不可编程。此PLL分出了4路PFD,分别为PLL2_PFD0 ~ PLL2_PFD3。
USB1_PLL(PLL3):主要用于USB1PHT,固定是2420=480MHz,不可编程此PLL也分四路PFD,为PLL3_PFD0 ~ PLL3_PFD3。
USB2_PLL(PLL7):主要用于USB2PHT,固定2420=480MHz,不可编程。没有分路。
ENET_PLL(PLL6):主要用于网络生成,时钟频率24(20+5/6)=500MHz,可在此基础上生成25/50/100/125MHz网络时钟。
VIDEO_PLL(PLL5):主要用于显示(屏),此路PLL倍频可调整,时钟频650MHz~1300MHz,最终输出可进行分频1/2/4/8/16分频。
AUDIO_PLL(PLL4):主要用于音频,此路PLL倍频可调整,时钟频650MHz~1300MHz,最终输出可进行分频1/2/4分频。
3)、外设时钟源的选配
外设的时钟源就是7路的PLL,如何选择哪个PLL如何分频,输出到某个外设想要的时钟。其实就是配置相关寄存器(Clock root generator)。
2.1.3、I.MX6U的中断机制和使用流程
2.1.4、EPIT
EPTI:增强的周期中断定时器,功能只有一个,就是周期性定时中断。向下计数型。比较简单,不做过多赘述。
void epit1_init(unsigned int frac, unsigned int value)
{
if(frac > 0xFFF) frac = 0xFFF;//分频值范围1~4096
EPIT1->CR = 0;//初始化CR寄存器
/*CR寄存器:
*bit25:24 01 时钟源选择Peripheral clock=66MHZ
*bit15:4 frac 分频值
*bit3 1 当计数器到0的话从LR中重新加载数值
*bit2 1 比较中断使能
*bit1 1 初始计数值来源于LR寄存器值
*bit0 0 先关闭EPTI1
*/
EPIT1->CR = ( 1<<24