ARM结构体系和接口技术
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、ARM简介
- 二、ARM体系架构
- 2.1.内核
- 寄存器
- 工作模式
- 异常
- 2.2.指令
- 简介
- 汇编指令
- 指令的01编码
- 指令的执行
- 三、接口技术
- 3.1开发板简介
- 3.2linux环境的搭建
- 3.2GPIO.
- 3.3UART
- 3.4 PWM
- 3.5 RTC
- 综合小项目
- 面试总结
- 下一章系统移植
前言
本章节表述,arm和的基础理论和arm裸机编程。
一、ARM简介
ARM和x86
他们是主要的竞争对手,arm主打32位、低功耗、嵌入式移动电子产品
x86是64位,主打高性能,桌面电子产品,功耗较高。
CISC与RISC设计理念
CISC(复杂指令集)用叠加内部电路的方式,让一条指令完成多个功能。功耗大,设计完了。RISC(精简指令集)只提供简单的基本指令,目标功能留给编程人员来完成。灵活功耗小
thumb指令集
也是ARM的一种指令集,16位,也就是说ARM核支持两种指令集。
ARM系列
A: 民用 高端领域, 手机,平板 arm7 arm12 A7 A9 A78 A53 R: realtime实时系列, r5 r9 军工 汽车 航天 M: MCU--单片机领域 m3 m4 m7 stm32 NXP
二、ARM体系架构
2.1.内核
内核=运算器+控制器+寄存器
寄存器
arm一共有37个寄存器分别是通用寄存器(r0-r15)特殊的通用寄存器(r13-r15)r13(sp)“栈指针” //存储的是栈顶地址r14(lr)pc的备胎r15(pc)记录下一条指令状态寄存器(cpsr、spsr)cpsr记录状态spsr(cpsr的备胎)
工作模式
不同的工作模式就是权限不一样,提供的寄存器不一样
User:大部分仼务执行在这种模式,权限低
Systen:与上面的模式一样
FIQ:当一个高优先级(fast)中断产生时将会进入这种模式
IRQ:当一个低优先级( normal)中断产生时将会进入这种模式
Supervisor(SⅤC):当复位或软中断指令执行时将会进入这种模式 (内核空间、内核态)
Abort:当存取异常时将会进入这种模式
Undef:当执行未定义指令时会进入这种模式
异常
2.2.指令
简介
汇编指令
指令的01编码
指令的执行
三、接口技术
3.1开发板简介
三星4412
3.2linux环境的搭建
由于我们写的是基于arm的代码,但linux的gcc只能编译x86的代码,所以需要一个特有的环境编写arm程序。
(1)复制arm gcc编译器的压缩文件到linux下,后解压。注意不能复制到共享文件路径下,要复制到纯linux的路径。解压命令tar -xvf 文件名
(2)安装32位支持库。由于arm是32位的,linux的64位,所以需要下载一个32位的支持库。下载安装命令apt-get install lib32z1。注意不能直接复制粘贴该命令,要纯手打。
(3)添加环境变量(安装arm gcc)。找到压缩后的arm gcc编译器文件夹,打开,bin目录,里面包含arm gcc的所有命令,pwd查看绝对路径,复制;打开环境变量的配置文件,命令vi ~/.bashrc;跳到最后一行添加一个指令export PATH=$PATH:刚刚复制的绝对路径,保存退出就可以了。
编译好了之后生成一个.bin文件,就是我们需要的二进制文件,我们需要吧这个二进制文件下载到开发板里面。
(1)下载一安装一个个串口调试助手。
(2)开发板串口连接电脑,打开电脑的设备管理器可以查看连接的端口,现在是COM4端口。
(3)串口调试助手调试下载。
具体过程看图。
注意每一次连接开发板一开机就要按下enter键
3.2GPIO.
配置几个寄存器
GPxxCON gpio模式控制寄存器
GPxxDAT jpio数据寄存器
按键控制 led 的汇编代码
.text
bl Init
while:
@@监听按键:ldr r7,=0x11000C24ldr r6,[r7] @@读取按键的值bic r6,#0xfffffffdcmp r6,#0 @@按键输入与0比较blne led_off @@如果不等于0(没按键按下) LED灭bleq led_on @@如果 等于0(有按键按下) LED亮
b whileInit:@@GPXCON: 0x11000C20按键配置ldr r0,=0x11000C20ldr r1,[r0] @@r2=*r0 bic r1,r1,#0xF0000000 @@清零28-31,0x0str r1,[r0]@@ led配置 ldr r0,=0x11000c40ldr r2,[r0] @@r2=*r0 bic r2,r2,#0xF0000000 @@清零28-31orr r2,r2,#0x10000000str r2,[r0]mov pc,lr
led_off:@@熄灭ledldr r2,[r0] bic r2,r2,#0x80str r2,[r0] mov pc,lr
led_on:@@点亮ledldr r0,=0x11000c44ldr r2,[r0] orr r2,r2,#0x80str r2,[r0]mov pc,lr
.end
3.3UART
UART全称通用异步收发传输
空闲位:开始时通信双方空闲,彼此拉高
起始位:当一端从高电平变到低电平,表明他要发送数据了
数据位:比如要发送’a’字符,其实就是发送a的ASCII码值,变成二进制其实就是一段高高低低的波形,ASCII码是八位,但全球也有其他地方使用5、6、7位的编码,所以数据位是5~8位
校验位:分为奇校验、偶校验、无校验,奇校验也就是一帧数据之和是奇数,则校验位为0,一帧数据之和为偶数,校验位就是1;偶校验也是如此,校验模式和硬件有关,现在的uart一般不支持校验位,所以一般是无校验。
停止位:电平拉高,一帧数据发送结束。
// 用户输入“on” led灯亮 输入“off” led灭
#define GPX2CON *((volatile long *)0x11000c40)
#define GPX2DAT *((volatile long *)0x11000c44)#define GPA1CON *((volatile long*)0x11400020)
#define ULCON2 *((volatile long*)0x13820000)//配置数据位
#define UCON2 *((volatile long*)0x13820004)//配置论转模式
#define UTRSTAT2 *((volatile long*)0x13820010)//buff
#define UTXH2 *((volatile long*)0x13820020)//发送数据缓存
#define URXH2 *((volatile long*)0x13820024)//接收数据缓存
#define UBRDIV2 *((volatile long*)0x13820028)//配置波特率整数部分
#define UFRACVAL2 *((volatile long*)0x1382002C)//配置波特率小数部分void Uart_Init(void); //uart初始化
void putc(char ch); //uart发送一个字符
void delay(int t); //延时函数
void memset(char *ch,char val,int len); //字符串清空
void puts(char *str); //uart发送字符串
int mystrcmp(char*pstr1,char *pstr2); //字符串比较
int mystrlen(char *pstr); //计算字符串长度
char rxbuf[128];
int main()
{Uart_Init();puts("you input 'on'led light,you input 'off'led down\r\n");GPX2DAT=0X00;int i;memset(rxbuf,0,sizeof rxbuf );int index = 0;while(1){ while( ( UTRSTAT2 & (1<<0) )==0 );rxbuf[index] = URXH2; putc(rxbuf[index]);if((mystrcmp(rxbuf,"on"))==0)GPX2DAT=0XFF;else if((mystrcmp(rxbuf,"off"))==0)GPX2DAT=0X00;if(rxbuf[index] == '\r'||rxbuf[index]=='\n'){ //发现用户回车,则一切从头来过puts(rxbuf);index=0;memset(rxbuf,0,sizeof(rxbuf));puts("\r\n");continue;}index++;}return 0;
}void Uart_Init(void)
{//uart的io配置GPA1CON&=~(0xF<<4)|(2<<4);GPA1CON&=~(0xF<<0)|(2<<0);//波特率设置为115200UBRDIV2=53;UFRACVAL2=4;ULCON2|=3; //8位数据位ULCON2&=~(1<<2); //一位停止位ULCON2&=~(1<<5); //无校验位ULCON2&=~(1<<6); //无红外UCON2&=~(3<<0)|(1<<0);UCON2&=~(3<<2)|(1<<2);UCON2&=~(1<<5);GPX2CON|=(1<<28); //LED灯配置为输出
}void delay(int t)
{while(t--){int ms=0xfff;while(ms--);}
}void putc(char ch)
{while( ( UTRSTAT2 & (1<<1) ) == 0 ){ };UTXH2 = ch;
}void puts(char *str)
{int i=0;while(str[i] !='\0'){putc(str[i]);i++;}
}void memset(char *ch,char val,int len)
{int i;for(i=0;i<len;i++){ch[i]=val;}
}int mystrcmp(char*pstr1,char *pstr2)
{int i;int length1=0;int length2=0;length1=mystrlen(pstr1);length2=mystrlen(pstr2);if (length1!=length2){return -1;} else{int flag=1;for (i=0;i<length1;i++){if (pstr1[i]!=pstr2[i]){flag=0;break;}}if (flag==1){return 0;} else{return -1;}}
}int mystrlen(char *pstr)
{int num=0;while(*pstr!='\0'){num++;pstr++;}return num;
}
3.4 PWM
处理器有五个timer,分别是0~4,其中0到3具有pwm功能。
PLCK:一个时钟信号,100MHZ,还有其他的时钟脉冲FCLK 是内核频率;HCLK是液晶、内存的相关频率;PCLK是串口等外部 ,速度较慢设备的频率!
由于脉冲频率是固定的,且频率过高,那么如何得到我们需要的频率?就需要经过两次分频,第一次是1~255分频,由我们配置寄存器设置具体值,第二次只能选择1、2、4、8、16分频,也是使用寄存器配置。
上述过程只能得到一个方波脉冲,没有什么软用。我们要利用他完成计时功能,就需要经过一个计数器,我们给与计数器一个初始值(记作count),每次脉冲来一个触发的边沿信号,count–,当count==0,又重新开始。就能完成一个定时功能,比如过来的脉冲周期是50um一次,我设置初始值为100,那么每一次过来一个脉冲,计数器就会减一,直到减到0,那么我们就能知道50毫秒的时间。
上述过程,最后得到的是一个锯齿波,众所周知pwm是一个矩形波。那么如何得到一个矩形波?我们要用到一个比较器,输入一个比较值(记作cmp),当cmp<count,输出电平为低,cmp>count,输出电平为高,比如cmp=50,count=100,就能得到一个占空比为50%的矩形波;cmp=30,count=100,就能得到一个占空比为30%的矩形波。
最后如果波形要翻转,就可以通过反相器通道,完成信号的取反。
#define GPD0CON (*(volatile unsigned int *)0x114000A0) //蜂鸣器
#define TCFG0 (*(volatile unsigned int *)0x139D0000) //一级分频
#define TCFG1 (*(volatile unsigned int *)0x139D0004) //二级分频#define TCNTB0 (*(volatile unsigned int *)0x139D000C) //最大计数值
#define TCMPB0 (*(volatile unsigned int *)0x139D0010) //比较值
#define TCON (*(volatile unsigned int *)0x139D0008) //timer配置void PWM_Init();int main()
{PWM_Init();while(1);return 0;
}void PWM_Init(){GPD0CON=GPD0CON&~(0XF)|2;//GPD0CON&=~(0XF)|2;//GPD0CON|=2;TCFG0&=~(0xff);TCFG1&=~(0XF);TCFG0|=124; //一级分频125TCFG1|=3; //二级分配1/8//TCFG0&=~(0XFF)|124;//TCFG1&=~(0XF)|3;TCNTB0=100; //最大计数值TCMPB0=30; //比较值TCON|=(1<<3);TCON|=(1<<1); //更新TCON&=~(1<<1); //关闭更新TCON|=(1<<0); //开始计数
}
3.5 RTC
#define GPA1CON *((volatile long*)0x11400020)//buzz
#define ULCON2 *((volatile long*)0x13820000)//数据位停止位校验模式
#define UCON2 *((volatile long*)0x13820004)//轮转发
#define UTRSTAT2 *((volatile long*)0x13820010)//buff发送完
#define UTXH2 *((volatile long*)0x13820020)//发送寄存器
#define URXH2 *((volatile long*)0x13820024)//接受寄存
#define UBRDIV2 *((volatile long*)0x13820028)//波特率配置整数部
#define UFRACVAL2 *((volatile long*)0x1382002C)//波特率配置小数部//===========实时时钟部分==============
#define RTCCON *(volatile unsigned int *)0x10070040 //写入,停止写入#define BCDSEC *(volatile unsigned int *)0x10070070 //bcd码 8421
#define BCDMIN *(volatile unsigned int *)0x10070074
#define BCDHOUR *(volatile unsigned int *)0x10070078
#define BCDDAYWEEK *(volatile unsigned int *)0x10070080
#define BCDDAY *(volatile unsigned int *)0x1007007c
#define BCDMON *(volatile unsigned int *)0x10070084
#define BCDYEAR *(volatile unsigned int *)0x10070088#define uint unsigned int
#define uchar unsigned charvoid delay(uchar t)
{while(t--){uint i=0xffff;while(i--);}
}void gpio_init()
{GPA1CON&=~(0xf<<0); GPA1CON|=(0X2<<0);GPA1CON&=~(0xf<<4); GPA1CON|=(0X2<<4);
}void uart_init()
{ULCON2|=0X3; //数据位8ULCON2&=~(1<<2); //停止位1ULCON2&=~(1<<5); //无校验ULCON2&=~(1<<6); //无红外UBRDIV2|=53;UFRACVAL2|=4;UCON2&=~(3<<0)|(1<<0);UCON2&=~(3<<2)|(1<<2);UCON2&=~(1<<5);
}void send_ch(char ch)
{while(!(UTRSTAT2&=(1<<2)));UTXH2=ch;
}void send_str(char *str)
{int i=0;for(;str[i]!='\0';i++){send_ch(str[i]);}
}void rtc_int_settime()
{RTCCON = 0x1; //开启BCDSEC = 0x10; BCDMIN = 0x24;BCDHOUR = 0x20;BCDDAYWEEK = 0X04;BCDDAY = 0X19; BCDMON = 0X08; BCDYEAR = 0X21;RTCCON &= ~0x1; //关闭
}void get_time()
{int year= BCDYEAR; //年int mon = BCDMON; //月int day = BCDDAY; //日int week= BCDDAYWEEK; //周int hour= BCDHOUR; //时int min = BCDMIN; //分int sec = BCDSEC; //秒send_str("20");time_send(year);send_ch('/');time_send(mon);send_ch('/');time_send(day);send_ch(' ');time_send(week);send_ch(' ');time_send(day);send_ch(':');time_send(min);send_ch(':');time_send(sec);send_ch('\n');send_ch('\r');
}void time_send(int time)
{char ge=(time&0xf)+'0';char shi=((time>>4)&0xf)+'0';send_ch(shi);send_ch(ge);
}int main()
{gpio_init();uart_init();rtc_init();while(1){get_time();delay(0xff);}
}
综合小项目
//=============脉宽调制========================
#define GPD0CON *(volatile long *)0x114000A0 //蜂鸣器
#define TCFG0 *(volatile long *)0x139D0000
#define TCFG1 *(volatile long *)0x139D0004
#define TCON *(volatile long *)0x139D0008
#define TCNTB0 *(volatile long *)0x139D000C
#define TCMPB0 *(volatile long *)0x139D0010//==========模数转换====================
#define ADCCON *(volatile long*)0x126C0000
#define ADCDAT *(volatile long*)0x126C000c
#define ADCMUX *(volatile long*)0x126C001c//============LED灯===================
#define GPX2CON *((volatile long *)0x11000c40) //第一个led 灯,,GPX2_7
#define GPX2DAT *((volatile long *)0x11000c44)#define GPX1CON *((volatile long *)0x11000C20) //第二个LED 灯,,GPX1_0
#define GPX1DAT *((volatile long *)0x11000C24)#define GPF3CON *((volatile long *)0x114001E0) //第三个LED灯,, GPF3_4
#define GPF3DAT *((volatile long *)0x114001E4) //============uart模块==================
#define GPA1CON *(volatile long*)0x11400020
#define ULCON2 *(volatile long*)0x13820000
#define UCON2 *(volatile long*)0x13820004
#define UTRSTAT2 *(volatile long*)0x13820010
#define UTXH2 *(volatile long*)0x13820020
#define URXH2 *(volatile long*)0x13820024#define UBRDIV2 *(volatile long*)0x13820028
#define UFRACVAL2 *(volatile long*)0x1382002Cchar yf[] = {0,191,170,151,143,127,113,101}; //乐谱
char two_tiger_song[] = {1,2,3,1,1,2,3,1,3,4,5,5,3,4,5,5,5,6,5,4,3,1,5,6,5,4,3,1,1,5,1,1, 1,5,1,1};
char one_star_song[] = {1,1,5,5,6,6,5,5,4,4,3,3,2,2,1,1,5,5,4,4,3,3,2,2,5,5,4,4,3,3,2,2,1,1,5,5,6,6,5,5,4,4,3,3,2,2,1,1};
char goto_school_song[] = {1,1,3,1,5,6,6,1,6,5,6,6,1,5,6,5,6,5,3,5,3,1,2,3,1};
char buf[12]; //转换后的电压字符串void Led_Init()
{GPX2CON&=~(0xf<<28); GPX2CON|=(1<<28); //LED1灯配置为输出GPX1CON&=~(0XF<<0); GPX1CON|=(1<<0);GPF3CON&=~(0XF<<16); GPF3CON|=(1<<16);
}void pwm_init()
{GPD0CON &= ~0xF; GPD0CON |= 0x2;TCFG0 &= ~0xFF; TCFG0 |= 124;TCFG1 &= ~0xF; TCFG1 |= 3;TCNTB0 = 100; TCMPB0 = 30;TCON &= ~(1<<2); TCON |= 1<<3;TCON |= 1<<1; TCON &= ~(1<<1);
}void adc_init()
{ADCCON &= ~(1<<0);ADCCON |= 1<<1;ADCCON &= ~(1<<2);ADCCON &= ~(0xFF<<6); ADCCON |= 19<<6;ADCCON |= 1<<14;ADCCON |= 1<<16;ADCMUX &= ~0xF; ADCMUX |=3;//启动ADCint reg = ADCDAT;
}void uart2_init()
{//配置管脚为 串口模式GPA1CON = GPA1CON & ( ~0xF );GPA1CON |= 1<<1 ;GPA1CON &= ~(0xF<<4) ;GPA1CON |= 1<<5;// 设置停止位 数据位 校验位 ULCON2 |= 0x3;ULCON2 &= ~(1<<2); ULCON2 &= ~(7<<3); ULCON2 &= ~(1<<6);UCON2 &= ~3; UCON2 |= 1<<0;UCON2 &= ~(3<<2); UCON2|= 1<<2;UCON2 &= ~(1<<5);UBRDIV2 = 53; UFRACVAL2 = 4;
}void putc(char ch)
{while( ( UTRSTAT2 & (1<<1) ) == 0 ){ };UTXH2 = ch;
}void puts(char *str)
{int i=0;while(str[i] !='\0'){putc(str[i]);i++;}
}//============选择被点亮的led=======
void which_led_light(int led_lable)
{if(led_lable==1){GPX2DAT|=(1<<7); GPF3DAT&=~(1<<4);GPX1DAT&=~(1<<0); //第一个灯亮,其他灯灭}else if(led_lable==2) {GPX1DAT|=(1<<0); GPX2DAT&=~(1<<7);GPF3DAT&=~(1<<4); //第二个灯亮,其他灯灭}else if(led_lable==3){GPF3DAT|=(1<<4); GPX2DAT&=~(1<<7);GPX1DAT&=~(1<<0); //第三个灯亮,其他灯灭}
}int adc_read()
{while(ADCCON & (1<<15) ==0);return ADCDAT & 0xFFF;
}void pwm_start()
{TCON |=1<<0;
}void pwm_stop()
{TCON &= ~(1<<0);
} void msleep(int msec)
{while(msec--){int mval = 0xFFF;while(mval--);}
}//========播放音乐,实时监控,旋钮变化========
// 旋钮电压变化满足切换歌曲的时候,跳出循环,并打印提示信息
void play_music(char * strs,int len,char mode)
{int i;char yy;puts("Start playing\r\n");puts(buf);puts("\r\n");for(i=0;i<len;i++){char yin = strs[i]; // 1 2 3 1 ...TCNTB0 = yf[ yin ];TCMPB0=TCNTB0/2;if(btn_mode()!=mode)break;msleep(500);}
}//========旋钮的功能定义,并转换电压值=========
int btn_mode()
{int reg = adc_read();int mv = reg*1800/4095;buf[0] = mv/1000 + '0';buf[1] = mv/100%10 + '0' ;buf[2] = mv/10%10 +'0';buf[3] = mv%10 + '0';buf[4] = ' '; buf[5] = 'm';buf[6] = 'V';buf[7] = '\r'; buf[8] = '\n'; buf[9] = '\0';if(mv>=0&&mv<600)return 1;else if(mv>=601&&mv<1200)return 2;else if(mv>=1201&&mv<=1800)return 3;
}int main()
{uart2_init(); //串口初始化Led_Init(); //led初始化pwm_init(); //pwm初始化adc_init(); //adc初始化pwm_start(); //pwm开始btn_mode(); //读取旋钮puts("Welcome to the player,Change the knob,Switch the music\r\n");//==========旋钮读取================while(1){ int flag=btn_mode(); if(flag==1) //模式1{ which_led_light(1);play_music(two_tiger_song,sizeof(two_tiger_song),flag);}else if(flag==2) //模式2{ which_led_light(2);play_music(one_star_song,sizeof(one_star_song),flag);}else if(flag==3) //模式3{ which_led_light(3); play_music(goto_school_song,sizeof(goto_school_song),flag); }}return 0;
}
面试总结
上个星期我经历了人生中第一次应聘,下面我娓娓道来。
首先介绍一下企业情况。奔图电子,搞激光打印机的,据说很牛逼,有自己的技术专利等等,能够突破老美的卡脖子之类的。当然这不是我们该关心的,我们关心的是钱多不多?那里好找女朋友吗?彩礼多不多?显然这不是一家特别吸引人的公司,第一在珠海,薪资六到八千(转正之后),很多人跟我一样的,来这就是为了高薪;第二、公司男员工居多…但听着技术总监搁哪吹牛我还是有点心动的,比如搞几年能在当地买房子有一点优惠,刚进去有师父带,还是很不错,但后面我又查了一下,很多公司都有这种优惠,在住房还有人才培养方面,大一点的公司基本上都是这样的,还有什么落户政府人才津贴这些,但能不能落户都还不知道。还有一个我对该公司很介意的是,这个公司居然要求英语四级,卡脖子了。
虽然自己并不是很满意这个公司,还有英语四级可能会卡脖子,但我还是怀着试试的态度投了简历。说一说这个简历,我大部分内容都是抄那些师兄师姐的简历内容,也就是吹牛吧,我估摸着大概也不会要我的简历。然鹅呀,他们选中了我的简历,宣讲结束几分钟调完简历,就立刻初面了。我心里想着,自己没白穿这身西装,如果自己穿了西装,结果企业没选中我的简历,还是有点尴尬,所以为了避免这种尴尬,我想着,我应该天天穿西装,就算自己以后简历没被选上,别人也会觉得,这家伙没衣服穿了,哈哈哈哈。
初试真的很小白。初试很突然,我也没准备,大概了解了一下,就算一些综合素养以及求职意愿的查看。我来列举一下hr问我的问题吧:(1)做一个自我介绍;(2)父母现在在哪里,家里有兄弟姐妹吗?(3)你在这个项目里面做了什么?(4)大概多久能够回复入职?(5)有没有向往这个方向走?(6)你还有什么问题吗?都是一些问你求职意愿的问题,但属实有些问题难到我了,就是第一个问题自我介绍,我感觉讲的有点啰嗦,最后直接被他打断了。但很遗憾我被老师通知复试了。
复试我是比较担心的,因为自己的确没怎么学好,简历上面有很多东西都是吹牛。
下一章系统移植
系统移植
ARM结构体系和接口技术相关推荐
- ARM结构体系3:ARM指令的寻址和异常中断处理
目录 ARM处理器的八种寻址方式 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 4.寄存器移位寻址 5.基址变址寻址 6.多寄存器寻址 7.相对寻址 8.堆栈寻址 9.GNU汇编伪指令 异常中断 ...
- ARM嵌入式体系结构与接口技术:实现A/D转换器
1.看原理图 找到通道 AIN3 2.看数据手册 ADCCON: ADCD ...
- ARM结构体系5:串行通信(双线UART)和看门狗
在通信领域内,有两种数据通信方式:并行通信和串行通信,串口的数据传输是以串行方式进行的,串口在数据通信中,一次只传输一个比特的数据,串行数据的传输速度用bps或波特率来描述. 常用术语: 1.单工(s ...
- 【微型计算机原理与接口技术】课程介绍
微型计算机组成原理 课程内容介绍 第一章 微型计算机基础 第二章 80X80微型处理器 第三章 汇编语言指令集 第四章 汇编语言程序设计 第五章 输入/输出系统 第六章 中断系统 第七章 微型计算机系 ...
- 计算机硬件基础ARM处理器概论(ARM体系结构与接口技术)
计算机硬件基础 D1 底层课程导学 1.编程基础 2.应用开发 (函数) 3.底层开发 C语言基础 IO ARM C高级与linux 进程 系统移植 数据结构 网络编程 驱动开发 嵌入式系统分层 操作 ...
- LV.9 ARM体系结构与接口技术
1 计算机硬件基础 Day1-1 底层课程导学 课程回顾 1.编程基础 1.C语言基础 2.C高级及Linux 3.数据结构 2.应用开发 1.IO 2.进程 3.网络编程 3.底层开发 1.ARM ...
- 关于微型计算机原理的文献,关于微型计算机原理论文范文资料 与微型计算机原理和接口技术实验教学体系改革有关论文参考文献...
<微型计算机原理和接口技术实验教学体系改革>:这是一篇与微型计算机原理论文范文相关的免费优秀学术论文范文资料,为你的论文写作提供参考. [摘 要] 本文结合上海星研微机原理实验教学仪器-S ...
- 【ARM】ARM接口技术
0开发工具的使用 1安装keil4 2运行MDK411EXE安装 3选择好要安装的目的位置 4安装完成并运行 5安装JLink驱动 6运行测试例程验证开发板是否OK 1自己做一个例子 1新建一个项目 ...
- 如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设
如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设 如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设 问题描述: 问题背景: 最新进展: 重要意义: 如何将自适应 ...
最新文章
- Reboot分享第三期(已结束)
- Loadrunner脚本开发简单几种方式
- 【机器学习基础】机器学习模型的度量选择(下)
- 如何实现一个简单的RPC
- 嵌入式基础(2)---硬件基础知识
- 深度学习TF—13.对抗生成网络—GAN
- 7-3 小L的难题 (15 分)
- 华为关闭telnet命令_华为交换机关闭Telnet
- DX C++实现超炫酷粒子特效之烟花特效
- 《我的二本学生》的读后感5000字范文
- 查找FB15k-237 entity id对应实体数据
- KNY团队与“易校”小程序介绍
- 文件批量改名-bat操作
- 如何从购物数据中挖掘出啤酒与尿布的关联关系?
- Notion 的插件介绍和使用
- 新加坡国立大学计算机系访学,高盛华课题组徐衍钰(博)2019年8月-2020年1月于新加坡国立大学交流访学...
- 作为一个准研究生,怎样才能在研究生阶段不虚度?
- 更换服务器IP有哪些步骤?如何操作?
- bootstrap--模态框
- 201671030109 韩艳艳 实验三作业互评与改进报告
热门文章
- 大一寒假集训(11)(12)---map,set
- 2021漳州一中历年高考成绩查询,2021年漳州中考录取分数线,历年漳州各高中录取分数线排名...
- 微信小程序(四) 节点查询 | wx.createSelectorQuery
- Word文档恢复,电脑突然关机 如何一步步将.asd恢复为Word文档 (详解)
- 写互联网文案的新技巧
- echarts 旭日图sunburst
- css获取父元素下第几个元素出坑和JQuery通过index()获取下标出坑方法
- Windows留后门--教程(一)——Windows系统隐藏账户
- zigbee判断首次入网
- 在matlabnbsp;画箭头