嵌入式系统硬件复习已接近期末考试。 这几天正在复习嵌入式系统。 我以为好几天没更新csdn了,更新嵌入式系统文章。
本文涵盖以下知识点:
如何计算点亮时钟周期如何使用printf函数以查询方式实现中断的ATPCS规范是指什么样的中断响应过程pwm蜂鸣器启动方法芯片外设备中断编程方法,本文与我写的上一章文章一起看,好的
链接:前几章复习复印件。
文章目录嵌入式系统硬件总复习前言一、如何点亮指示灯? 二、时钟周期计算三、如何使用printf函数四、查询方式实现中断五、ATPCS规范六、中断响应流程七、pwm蜂鸣器八、片外设备中断处理总结
前言写语言不容易,挤出时间写文章更难。 如果这篇文章能帮助你理解知识点,就不违背我写这篇文章的初衷:希望每一位同学都能通过考试。在日后学习上,我们的同学不是竞争对手,而是当成我们最亲密的战友。同时啊把这份善意传递给其他人。
这篇文章打开了报酬模式。 如果你认为这篇文章对你有很大帮助,你可以稍微打赏一下,拒绝用爱发电!
得奖,拒绝用爱发电!
得奖,拒绝用爱发电!
得奖,拒绝用爱发电!
提示:以下是本文正文的内容。 如果错了的话,请联系我改正。
一、怎么点亮LED灯? 这是教材第六章GPIO相关的知识点,也就是GPIO编程的实例!
点亮灯有四个步骤。
查看硬件电路图,确定处理器上的哪个针脚上有指示灯。 看相关电路图,了解LED灯的工作原理。 查看CPU文档,并将相关位置初始化为0x1。 点亮LED灯,将gpj2dat的后4位的清除0、con设定为输出的功能。
//con寄存器4位控制1个写入; //dat寄存器控制相关端子输出//pud一般控制上拉/下拉电阻,# definegpj2con * ((volatile unsigned * )0xe020_0280 ) ) definegpj 220 //dat寄存器直接值1gpj2dat=0xf; }将}voidled_on(charon )//dat寄存器清除为0,然后在|上打开,决定打开哪个指示灯的开关gpj2dat=gpj2dat ()0xff
期中考试问题有类似的问题。 当时点亮1、3位的灯,下一秒点亮2、4位的灯,循环点亮。 接下来是代码。 把之前说的话组合起来,就知道代码的意思了。
//led#definegpj2con*(unsigned* )0xe 0200280 # definegpj 2d at * (unsigned * )0xe 0200284 void led _ init (void ) ); voidled_on(charon; int on=0x5; (1分) void_start ) void ) {int i; for(I=1; i=20; I ) {led_on () on; 戴尔(500000; on=on^0xf; (10分) void led_init ) ) {gpj2con=gpj2con ~0xffff |0x1111; gpj2dat=0xf; (5分) voidled_on(charon ) {gpj2dat=gpj2dat ~0xf | ~on; (5分) voiddelay(intt ) ) 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寄存器
代码部分:
没有什么比标准答案更好的材料了,直接背标准答案!!!
子程序通过寄存器r0-r3 来传递参数,如果参数多于4个,多出的部分用堆栈来传递,r0-r3不用恢复。(1分)R4-r11用来保存局部变量,使用前保存这些寄存器的值,子程序退出时要恢复这些寄存器(1分)r12 常用保存sp (1分)r13 用途堆栈指针,记作sp (1分)r14用作链接寄存器,用来保存程序的返回地址,记叙lr (2分)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看门狗实验.
蜂鸣器应该是我们做的倒数第二个实验了!!!我自己的话有一个点不太确定,就是1200,我个人的想法是:根据题目给的,如果有同学知道1200怎么来的,请告诉我!!!万分感谢!!!
正式开始说明:
蜂鸣器启动步骤:
初始化时钟(分频器、选频器);初始化tchtb,tcmpb,调整占空比;停止auto-reload,使能manual update使能auto-reload,清除manual update具体步骤见代码注释,边写代码边说明,我知道的我都会说,emmm我也很菜的!!!我也靠不住,眼睛大的花卷。
1、初始化时钟频率(分频器,选频器)#definegpd0con*(volatile unsigned*)0xe02000a0gpd0con=gpd0con & ~0xf|0x2;//配置成time0//设置预分频器的值#definetcfg0*(volatile unsigned*)0xe2500000tcfg0=一个不超过255的整数;//设置选频器的值#definetcfg1*(volatile unsigned*)0xe2500004tcfg1= 0000 || 0001 || 0010 || 0011 || 0100 || 0101; //选一个即可,见下面的说明2、初始化tcntb,tcmpb的值#definetcntb0*(volatile unsigned*)0xe250000c#definetcmpb0*(volatile unsigned*)0xe2500010tcntb0=150;tcmpb0=50;备注:占空比= 1 - (tcmpb/tcntb)#definetcon*(volatile unsigned*)0xe25000083、停止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中断
最后,很感谢大家的观看!其实呢,我很想净化 班级内卷的氛围,人人都在偷偷学习,真的少了很多快乐。
社会lldhk主义不能拯救你,内卷你跳不出来的,我也没办法跳出来,但是我们可以尝试不要那么内卷,当我们陷入内卷的氛围中,社会lldhk主义已经让你丧失了一个作为人最基本的尊严!我们是人,不是兽。身边的小伙伴不是我们的竞争对手,而是我们最亲密的战友!!!
去拥抱我们身边的每一个人吧,带着我们的善意,传递下去!
总结
嵌入式系统硬件部分就说到这里,系统的过了一遍。祝各位取得好成绩!
如果你觉得看的很爽,那就点点赞,打赏一波!
拒绝白嫖伸手党!!!
拒绝白嫖伸手党!!!
拒绝白嫖伸手党!!!