嵌入式系统之硬件总复习

快要期末考试啦,这几天在复习嵌入式系统,想着有好几天没有更新csdn了,就更新一篇嵌入式系统的文章!


本篇文章覆盖以下知识点:

  • 如何亮灯
  • 时钟周期如何计算
  • printf函数如何使用
  • 什么叫以查询的方式实现中断
  • ATPCS规范是什么
  • 中断响应流程
  • pwm蜂鸣器启动方法
  • 片外设备中断编程方法

同时,本文与我写的前几章文章一起看,效果会更好!

链接: 前几章复习文案.

文章目录

  • 嵌入式系统之硬件总复习
  • 前言
  • 一、如何点亮LED灯?
  • 二、时钟周期的计算
  • 三、如何使用printf函数
  • 四、以查询的方式实现中断
  • 五、ATPCS规范
  • 六、中断响应流程
  • 七、pwm蜂鸣器
  • 八、片外设备中断处理
  • 总结

前言

码字不易,抽空写出文章更是不易。如果这篇文章帮助你明白了一些知识点,那就没有违背我写这篇文章的初心:
希望每一位同学都能通过考试。在日后学习上,我们的同学不是竞争对手,而是当成我们最亲密的战友。同时啊把这份善意传递给其他人。
本文开启了打赏模式,如果你觉得这篇文章对你帮助很大,麻烦你可以稍微打赏一下,拒绝用爱发电!

打赏一下,拒绝用爱发电!
打赏一下,拒绝用爱发电!
打赏一下,拒绝用爱发电!


提示:以下是本篇文章正文内容,如果错误,请联系我进行修改。

一、如何点亮LED灯?

这是教材第六章GPIO相关知识点,也就是GPIO编程实例!
点亮灯分为4个步骤:

  1. 查看硬件电路图,找出LED位于CPU的哪个引脚。
  2. 查看相关电路图,搞懂LED灯工作原理。
  3. 查看CPU手册,将相关位置初始化为0x1。
  4. 点亮LED灯,将gpj2dat 低4位 清0,con设置为输出的功能。


//con寄存器4位控制一个灯;
//dat寄存器控制相关引脚输出;
//pud一般是控制上拉/下拉电阻,一般不用
#define gpj2con *((volatile unsigned *)0xe020_0280)
#define gpj2dat *((volatile unsigned *)0xe020_0284)void led_init(void){//初始化con寄存器,先把所有位置清0,再赋值1;gpj2con   =  gpj2con & ~(0xffff) | 0x1111;//dat寄存器直接赋值1gpj2dat   =  0xf;
}void led_on(char on){//先把dat寄存器清0,然后 | 上on,决定打开哪些灯的开关gpj2dat     =  gpj2dat & ~(0xff) | on;
}



期中考试试题就有一道类似的题目,当时是控制1,3位灯亮,然后下一秒换2,4位灯亮,然后循环亮。下面是代码,结合我之前说的,就明白代码意思啦!

//led
#define     gpj2con     *(unsigned*)0xe0200280
#define     gpj2dat     *(unsigned*)0xe0200284void led_init( void );
void led_on( char on );int on=0x5;                              (1 分)void _start(void)
{int i;for(i=1;i<=20;i++){led_on(on);       delay(500000);on=on^0xf;
}                    (10分)void led_init( )
{gpj2con = gpj2con & ~0xffff | 0x1111;gpj2dat = 0xf;
}                                        (5分)void led_on( char on )
{gpj2dat    =  gpj2dat & ~0xf | ~on;
}                                        (5分)
void delay( int t)
{for(;t-- ; );
}

二、时钟周期的计算

这个地方建议查看开发板说明手册 P355页。

根据0xE010_0108处的地址值确定PDIV,MDIV,SDIV的值。

见下图步骤

三、如何使用printf函数

其实,我刚开始也不知道如何调用printf函数,怎么才能打印,后来问了老师,老师给我说了printf函数原型,才明白我们要如何写printf函数。
先上代码:

int (* myprintf)(char *,...)=(int (*)(char *,...))0x2fd17b18;

myprintf是我们的函数名,注意,不要使用print还是printf,我忘记了,因为会和开发板本身自带的一个函数名字起冲突,所以我一般习惯性用myprintf做打印函数名。

在实验期末考试中,我们如何打印“hello world!”,其实只需这样一段代码:

 int (*myprintf)(char *,...)=(int (*)(char *,...))0x2fd17b18;
//不带参数的myprintf函数,带参数的话,就按照我们常用的c语言的printf用即可。
void __attribute__((interrupt)) wdt_isr(void){myprintf("hello world!");clear_int();}

四、以查询的方式实现中断

这一块主要讲2个函数,先把所要用到的地址放出来。

#define gph3con      *((volatile unsigned*)0xe0200c60)
#define gph3dat     *((volatile unsigned*)0xe0200c64)
#define gph3pud     *((volatile unsigned*)0xe0200c68)

con寄存器

date寄存器和pud寄存器

代码部分:

#define gph3con      *((volatile unsigned*)0xe0200c60)
#define gph3dat     *((volatile unsigned*)0xe0200c64)
#define gph3pud     *((volatile unsigned*)0xe0200c68) //将con寄存器配置成输入的功能,这是按键初始化
void key_init(void)
{gph3con=gph3con&~(0xffff);
}
//如何检测那个键被按下了呢?
//如果第一个键被按下了
if((gph3dat & (0x1))==0){while(!(gph2dat&(0x1)));return 1;}
//如果第二个按键被按下了
if((gph2dat & (0x1))==0){while(!(gph2dat&(0x1)));return 1;}

五、ATPCS规范

没有什么比标准答案更好的材料了,直接背标准答案!!!

  1. 子程序通过寄存器r0-r3 来传递参数,如果参数多于4个,多出的部分用堆栈来传递,r0-r3不用恢复。(1分)
  2. R4-r11用来保存局部变量,使用前保存这些寄存器的值,子程序退出时要恢复这些寄存器(1分)
  3. r12 常用保存sp (1分)
  4. r13 用途堆栈指针,记作sp (1分)
  5. r14用作链接寄存器,用来保存程序的返回地址,记叙lr (2分)
  6. r15 即pc,用户程序计数器,不作其他用途 (2分)
    7.函数返回值保存在r0中。 (2分)

调用printf函数过程:
1)将返回地址入lr (2分)
2) 将字符串“x=%d,y=%d,z=%d,s=%d”地址入r0 (3分)
3)x值入r1,y值入r2,z值入r3,s值入栈 (2分)
4) 跳转到0x2fdb1718处执行程序 (3分)

六、中断响应流程

我理解的中断响应过程指的是WDT看门狗这个实验!
这个我觉得应该没必要再说了!期中考试考这个!期末考试考这个!应该都会了!
我就直接把我以前写的那篇wdt看门狗文章链接丢在这,然后看一下就行了!
链接: WDT看门狗实验.

七、pwm蜂鸣器

蜂鸣器应该是我们做的倒数第二个实验了!!!我自己的话有一个点不太确定,就是1200,我个人的想法是:根据题目给的,如果有同学知道1200怎么来的,请告诉我!!!万分感谢!!!
正式开始说明:

蜂鸣器启动步骤:

  1. 初始化时钟(分频器、选频器);
  2. 初始化tchtb,tcmpb,调整占空比;
  3. 停止auto-reload,使能manual update
  4. 使能auto-reload,清除manual update

具体步骤见代码注释,边写代码边说明,我知道的我都会说,emmm我也很菜的!!!我也靠不住,呜呜呜。

1、初始化时钟频率(分频器,选频器)
#define     gpd0con     *(volatile unsigned*)0xe02000a0gpd0con      =  gpd0con & ~0xf|0x2;//配置成time0//设置预分频器的值
#define     tcfg0       *(volatile unsigned*)0xe2500000tcfg0        =  一个不超过255的整数;//设置选频器的值
#define     tcfg1       *(volatile unsigned*)0xe2500004tcfg1        = 0000 || 0001 || 0010 || 0011 || 0100 || 0101; //选一个即可,见下面的说明2、初始化tcntb,tcmpb的值
#define     tcntb0      *(volatile unsigned*)0xe250000c
#define     tcmpb0      *(volatile unsigned*)0xe2500010tcntb0       =  150;tcmpb0      =  50;
备注:占空比= 1 - (tcmpb/tcntb)#define      tcon        *(volatile unsigned*)0xe2500008
3、停止auto-reload,使能manual updatetcon      =  tcon & ~(0x1<<3) | (0x1<<1);
4、使能auto-reload,清除manual update,并启动蜂鸣器tcon        =  tcon & ~(0x1<<1)|(0x1<<3) | 0x1;

预分频器


选频器


tcon=0xe250_0008


还要在设置这个地方,设置1,允许中断

八、片外设备中断处理

这个指的是实验10。

步骤:
初始化片外设备中断控制器---------->初始化中断控制器----------->开cpu中断

/ about vic0
//[27]=0  select IRQ
#define vic0intselect       *(volatile unsigned*)0xf200000c
//[27]=1 enable wtd int
#define vic0intenable       *(volatile unsigned*)0xf2000010
// contains isr
#define vic0vectaddr16      *(volatile unsigned*)0xf2000140//ext_int_2
//[0:15]=0x3333 rising edge triggered
#define         ext_int_2_con       *(volatile unsigned*)0xe0200e08
//[0:31]=0x80808080  delay flt
#define         ext_int_2_fltcon0   *(volatile unsigned*)0xe0200e90
//[0:3]=0x0  enable interrupt
#define         ext_int_2_mask      *(volatile unsigned*)0xe0200f08void vic0_init( void )
{vic0intselect  =  vic0intselect & ~(0x1<<16);vic0intenable  =  vic0intenable | (0x1<<16);vic0vectaddr16  =  key_isr;
} void ext_int_2_init( void )
{ext_int_2_con      =  ext_int_2_con & ~0xffff | 0x3333;ext_int_2_fltcon0  =  0x80808080;ext_int_2_mask       =  ext_int_2_mask & ~0xf;
} 



最后,很感谢大家的观看!其实呢,我很想净化 班级内卷的氛围,人人都在偷偷学习,真的少了很多快乐。
社会达尔文主义不能拯救你,内卷你跳不出来的,我也没办法跳出来,但是我们可以尝试不要那么内卷,当我们陷入内卷的氛围中,社会达尔文主义已经让你丧失了一个作为人最基本的尊严!我们是人,不是兽。身边的小伙伴不是我们的竞争对手,而是我们最亲密的战友!!!
去拥抱我们身边的每一个人吧,带着我们的善意,传递下去!


总结

嵌入式系统硬件部分就说到这里,系统的过了一遍。祝各位取得好成绩!

如果你觉得看的很爽,那就点点赞,打赏一波!

拒绝白嫖伸手党!!!
拒绝白嫖伸手党!!!
拒绝白嫖伸手党!!!

ARM:嵌入式系统之硬件总复习相关推荐

  1. 基于ARM的嵌入式系统外围硬件设计

    基于ARM的嵌入式系统外围硬件设计 一.嵌入式接口分类 (1)基本嵌入式接口 (2)嵌入式网络接口 (3)标准协议接口 (4)无线通信接口 二.基本嵌入式接口 1.实时时钟 (1)功能:专用的电路单元 ...

  2. 如何学习嵌入式系统(硬件篇),含51单片机学习资料

    学习嵌入式之前我们需要了解什么是嵌入式. (官方说法)嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用 ...

  3. 网络上所谓的《ARM嵌入式系统入门最好的文章》

    一 首先说说ARM的发展 可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位. 广义的嵌入式无非几种:传统的什么51.AVR.PIC称做嵌入式微控制器:ARM是嵌入式微处理器 ...

  4. ARM嵌入式系统malloc的实现(C源码)

    在ARM嵌入式系统实现malloc内存分配机制. 在ARM cpu上验证通过. ps:也可在pc ubuntu linux进行验证 #include "include/lib_replace ...

  5. 8、ARM嵌入式系统:UART初始化

    一.UART概述 百度上UART的定义:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行 ...

  6. 嵌入式系统的硬件核心是什么?

    嵌入式逐渐成为热门行业,所以一些人也开始蠢蠢欲动了,开始要对嵌入式下手了,其实只要你真的对嵌入式感兴趣并且想要学习的话,那么什么时候都不算晚,毕竟兴趣是最好的老师,下面一起先来看看嵌入式系统的硬件核心 ...

  7. 7、ARM嵌入式系统:LCD/数码管/OLED初始化

    一.LCD/数码管模块在板子上的位置 LCD和数码管在板子上都分别有一个插槽. 二.LCD/数码管初始化代码 //SMG init void SMG_Init() { /* PORTB and POR ...

  8. 嵌入式系统框架----硬件篇

    1.系统框架图 对于一个嵌入式系统,最重要的当然是运算以及存储单元,基本的嵌入式系统可以简化成如下系统框架图: 图1.1 系统框架图 对于一个嵌入式系统,我们从常见的嵌入式ARM板进行分析:(从淘宝上 ...

  9. [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件

    本章的最后,通过描述ARM为核心的嵌入式系统,来介绍了嵌入式系统的软件和硬件构成和结构.这里根据这部分的介绍以及其他的文章,描述下通用的嵌入式系统的软件和硬件.     首先来说下硬件,书中说,包含有 ...

最新文章

  1. 机器学习笔记(六)支持向量机
  2. 转换输入文本中的回车和空格
  3. 【数据迁移】使用传输表空间迁移数据
  4. 群晖pxe安装windows_通过PXE快速部署VMware ESXi 6.5
  5. VS 2010 开发 ActiveX 开始篇
  6. mysql之主从复制 简书_MySQL主从复制(传统)
  7. “睡服”面试官系列第十一篇之module加载实现(建议收藏学习)
  8. OJ1000: A+B Problem
  9. Linux的下载命令wget详解
  10. 【LeetCode】【HOT】105. 从前序与中序遍历序列构造二叉树(哈希表+递归)
  11. work summary(3)
  12. html与css游戏开发工具,分享15个最佳的HTML/CSS设计和开发框架
  13. 根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
  14. 旅游管理系统(包含旅游最短路径规划算法等,包含系统分析的各种uml图和界面图)
  15. 【JAVASCRIPT】使用ztree树,实现右键增加,修改,删除节点。带有复选框。
  16. 华为hcna认证考完多久考hcip?华为认证的发展就业前景怎么样?
  17. 4种网游外挂制作方法
  18. 联想l430主板图纸_【有图】Thinkpad L430升级内存,点亮,成功实现双通道!附详细教程及评测!!!...
  19. Excel绘制折线图_基础整理
  20. 计算机学校排名高中,普通高中排名

热门文章

  1. 欧元区通胀率升至9.1% 将跟随美联储“鹰派”步伐?如何使资产保值成为现实需要
  2. 智慧灯杆系统由哪些部分组成
  3. Vue实现图片预览(Viewer.js)
  4. android稳定性测试
  5. matlab 条形图误差线,数据可视化系列:手把手教你绘制带误差线的条形图
  6. 微信小程序:检讨书生成微信小程序源码
  7. 笔记本和台式机共用台式机的显示器
  8. 配置高可用的循环复用DNS负载均衡
  9. Java安全通信:HTTPS与SSL
  10. 【MM32F5270开发板试用】 MindSDK使用测评