在经济飞速发展的今天,越来越多的事务都会使用到报告,我们在写报告的时候要注意逻辑的合理性。我敢肯定,大部分人都对写报告很是头疼的,这次为您整理了课程设计报告(优秀3篇),如果能帮助到您,小编的一切努力都是值得的。
"微机原理与系统设计" 作为电子信息类本科生教学的主要基础课之一,课程紧密结合电子信息类的专业特点,围绕微型计算机原理和应用主题,以Intelx86CPU为主线,系统介绍微型计算机的基本知识,基本组成,体系结构和工作模式,从而使学生能较清楚地了解微机的结构与工作流程,建立起系统的概念。
这次微机原理课程设计历时两个星期,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在赵老师的辛勤指导下,终于游逆而解。同时,在赵老师的身上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
Cortex-M3 是 ARM 公司基于 ARM V7 架构的新型芯片内核。 STM32V100-II 型是英蓓特 公司新推出的一款基于 ST 意法半导体 STM32 系列处理器(Cortex-M3 内核)的全功能 评估板。STM103V100-II 评估板有 USB,Motor Control,CAN,SD 卡,Smart 卡, UART,Speaker,LCD,LED,BNC,耳塞插孔等丰富的外设,有助于用户轻松开发 STM32 的强大功能。STM32 系列使用了 ARM 最新的、先进架构 Cortex-M3 内核,本文论述 了在 Keil Realview 开发环境上开发基于汇编语言的 LED 控制程序, 基于对 STM32 的 GPIO 寄存器写值配置思想, 控制 EduKit-M3 实验平台的发光二极管 LED1、 LED2、 LED3、 LED4, 使它们有规律地点亮。
一、 设计概述
1.1、 设计需求
Keil Realview 开发环境上,全部采用汇编语言编程,实现对 EduKit-M3 实验平台的发 光二极管 LED1、LED2、LED3、LED4 的亮灭控制,使它们有规律地点亮。 这里采用例程提供的顺序点亮方式,按照 LED1 亮 LED2 亮 LED3 亮 LED4 亮,如此反复,要求每个 LED 亮灭之间延时一段时间,以增强可观性。需要说明的是,这 仅仅作为程序控制 LED 的一种控制方式,基于点亮 LED 的控制原理,可以编程实现各种显 示 LED 的亮灭模式,并提供一种通用的控制方法,要求程序可读性强,易于修改。
1.2、 设计原理
(1)STM32 通用 GPIO 端口概述 STM32F10x 处理器上共有 7 个 I/O 端口:A、B、C、D、E、F、G,每个 16 个管脚 每组端口(寄存器必须以 32 位字形式访问) 每组端口有以下寄存器: , 32 位配置寄存器: GPIOx_CRL、GPIOx_CRH 32 为数据寄存器: GPIOx_IDR、GPIOx_ODR 32 位置位/复位寄存器: GPIOx_BSRR 16 位复位寄存器: GPIOx_BRR 32 为锁定寄存器: GPIOx_LCKR I/O 口通用输入、输出端口配置为输入时,每个 APB2 时钟周期将端口数据送输入寄存 器(GPIOx_IDR),在输入模式下,输出是断开的。输出模式时:写到输出寄存器(GPIOx_ODR) 的值被传给对应的 I/O 引脚。在输出模式下,输入是允许的 (2)程序设计原理 EduKit-M3 实验平台上,通过写值配置端口数据输出寄存器 GPIOC_ODR[15:0]值,可 以实现对四个 LED 的亮灭控制, 因为 C 口[9:6]位和四个 LED 灯连通。 而这里主要是通过对 时钟控制寄存器以及端口 C 的各配置寄存器和输出寄存器写值, 以达到配置端口, 控制 LED 的目的。 汇编语言与 C 语言相比,要求更加贴近硬件,了解 M3 内核的内部结构和寄存器地址。 基于汇编语言的编程控制, 只需要找出需要配置的端口基地址, 然后弄清楚各寄存器的偏移 地址,以及各寄存器每位的含义,按照要求写 1 或写 0 即可。
2
二、 硬件设计:
2.1 硬件电路
2.2 硬件电路描述
本设计是基于 EduKit-M3 实验平台的嵌入式开发实例, EduKit-M3 实验平台有四个 LED 灯,分别为 LED1、LED2、LED3、LED4,对应的连接到 I/O 的 C 口 PC.6、PC.7、PC.8、 PC.9 四位输出位上,不需要外扩电路或者额外接线,简单易行。
三、 软件设计
3.1 程 序 流 程 图
3.2 软 件 设 计 描 述
(1)整个工程包含 3 个源文件:STM32F10x.s、和 my led.s,stm32f10x_lib.c 其中3STM32F10x.s 为启动代码, 。启动代码作用是:1)堆和栈的初始化;2)向量表定义;3)地 址重映射及中断向量表的转移;4)设置系统时钟频率;5)中断寄存器的初始化;6)进入 汇编主程序。my led.s 是汇编主程序,完成所有控制功能。
(2)程序工作原理概述: 对于 LED 的控制,主要通过对 I/O 端口的配置,将对应的寄存器相应的位写 1 写 0 控 制。程序首先要经过启动代码段进行相关的启动配置,然后跳转到汇编主程序。 汇编主程序完成了时钟、端口配置以及 LED 点亮的所有功能。首先需要对于系统时钟进 行配置,已获得系统所用频率。 然后进行端口配置低、高寄存器配置,获得输入输出模式以及最大速度。将时钟和端口 配置完成后,就可以对输出寄存器进行对应位的写值控制了,从而达到控制 LED 的目的,高 电平点亮,低电平熄灭。 点亮 LED 后,转入延时子程序,延时子程序写值 0X000FFFFF,做寄存器值减法,减到 0 后,过程所需时间即是延时时间,即单个 LED 点亮时间。本程序设置循环点亮模式,即 LED1 到 LED4 顺序循环点亮,将对应位逐次写 1,如果需要修改点亮模式,只需修改寄存器的值以 及写值顺序即可。
(3)寄存器配置描述 端口配置低寄存器(GPIOC_CRL) C口基地址:0X40011000 偏移地址:0x00 复位值:0x44444444 寄存器配置:0X22222222 功能含义: 口配置低寄存器为模拟输入模式, 端 通用推挽输出模式, 输出模式, 最大速? 2MHz
端口配置高寄存器(GPIOC_CRH) C口基地址:0X40011000 偏移地址:0x04 复位值:0x44444444 寄存器配置:0X22222222 功能含义: 口配置高寄存器为模拟输入模式, 端 通用推挽输出模式, 输出模式, 最大速? 2MHz 端口输出数据寄存器(GPIOC_ODR) C口基地址:0X40011000 地址偏移:0Ch 寄存器配置 0xfffffc4f 0xfffffc8f 复位值:00000000h 功能含义 PC.6 位写 1,对应点亮 LED1 PC.7 位写 1,对应点亮 LED2
40xfffffd0f 0xfffffe0fPC.8 位写 1,对应点亮 LED3 PC.9 位写 1,对应点亮 LED4
时钟控制寄存器(RCC_CR) 复位和时钟基地址:0X40021000 偏移地址: 0x00 复位值: 0x000 XX83 寄存器配置:0X00000003 功能含义:PLL 未锁定,PLL 关闭,时钟监测器关闭,外部 1-25MHz 振荡器没有旁?,外部 1-25MHz 时钟没有就绪,HSE 振荡器关闭内部 8MHz 时钟就绪,内部 8MHz 时钟开启。 时钟配置寄存器(RCC_CFGR) 复位和时钟基地址:0X40021000 偏移地址: 0x04 复位值: 0x0000 0000 寄存器配置:0X00000000 功能含义:没有时钟输出,PLL 时钟 1.5 倍分频作为 USB 时钟,PLL 2 倍频输出,HSE 不分 频,HSI 时钟 2 分频后作为 PLL 输入时钟,PCLK2 2 分频后作为 ADC 时钟,HCLK 不分频, HCLK 不分频,SYSCLK 不分频,HSI 作为系统时钟,HSI 作为系统时钟。 AHB外设时钟使能寄存器 (RCC_AHBENR) 复位和时钟基地址:0X40021000 偏移地址:0x14 复位值:0x0000 0014 寄存器配置:0X00000014 功能含义:睡眠模式时闪存接口电路时钟开启,睡眠模式时 SRAM 时钟开启,DMA 时钟关 闭 APB2 外设时钟使能寄存器(RCC_APB2ENR) 复位和时钟基地址:0X40021000 偏移地址:0x18 复位值:0x0000 0000 寄存器配置:0XFFFFFFFF 功能含义:USART1 时钟开启,SPI1 时钟开启,TIM1 时钟开启,ADC2 时钟开启,ADC1 时钟开启,IO 口 E 时钟开启,IO 口 D 时钟开启,IO 口 C 时钟开启,IO 口 B 时钟开启,IO 口 A 时钟开启,辅助功能 IO 时钟开启
3.2 主 要 程 序 说 明
(1)启动代码转入汇编主程序的设置: 【启动代码段设置: 】 Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT MAIN ;声明外部函数,导入符号 LDR R0, =MAIN ;等待工作调用 BX R0 ;跳转到汇编主程序 MAIN 函数 ENDP ;过程段结束 【汇编主程序设置: 】 AREA MYCODE,CODE,READONLY ;定义一个代码段,属性为只读 EXPORT MAIN MAIN PROC (主程序功能段开始) EndP END (2)汇编主程序 ;配置时钟
5LDR R1,=0X40021000 LDR R0,=0X00000003 STR R0,[R10X00]LDR R0,=0X00000000 STR R0,[R10X004]LDR R0,=0X00000014 STR R0,[R1,#0X14]
时钟控制寄存器入口
配置时钟控制寄存器(RCC_CR)
配置时钟配置寄存器(RCC_CFGR)
配置 AHB 外设时钟使能寄存器 RCC_AHBENR
LDR R0,=0XFFFFFFFF STR R0,[R10X18];配置 APB2 外设时钟使能寄存器(RCC_APB2ENR) ;----------------------------------------------------------------------------------------------------;配置端口 MOVS R00X22222222LDR R1,=0X40011000 STR R0,[R10X00];配置端口配置寄存器 GPIOC_CRL MOVS R00X22222222LDR R1,=0X40011000 STR R0,[R10X04];配置端口配置寄存器 GPIOC_CRH ;---------------------------------------------------------------------------------------------------;点 亮 LED LDR R0,=0xfffffc4f STR R0,[R10X0C];将 0xfffffc4f 写进 GIPOC_ODR, 点亮 LED1 BL DELAY ;延时 --------------------------------------------------------------------------------------------------------LDR R0,=0xfffffc8f STR R0,[R10X0C];将 0xfffffc8f 写进 GIPOC_ODR, 点亮 LED2 BL DELAY ;延时 -------------------------------------------------------------------------------------------------------LDR R0,=0xfffffd0f STR R0,[R10X0C];将 0xfffffd0f 写进 GIPOC_ODR, 点亮 LED3 BL DELAY ;延时 -------------------------------------------------------------------------------------------------------LDR R0,=0xfffffe0f STR R0,[R10X0C];0xfffffe0f 写进 GIPOC_ODR, 点亮 LED4 BL DELAY ;延时 -------------------------------------------------------------------------------------------------------B MAIN ;跳到 MAIN 函数 ;------------------------------------------------------------------------(2)延时子程序 DELAY
6LDR R3,=0X000FFFFF ;延时控制字 DELAY_1 SUBS R3,R30X01;延时控制字自减 BEQ DELAY_OUT ;为 0 跳出返回 B DELAY_1 ;不为 0 回转继续做减法 DELAY_OUT BX LR ;程序返回
四、 调试与结果
4.1 调 试 过 程
(1) 使用 Keil uVision3 通过 ULINK 2 仿真器连接 EduKit-M3 实验平台,打开建立的 my led controler 工程,点击子目录下的 my led.s 文件,编译链接工程。 设置 Flash——Debug, 选择 Cortex-M3 J-LINK, Flash——Utilities, 同样选择 Cortex-M3 J-LINK,效果如下
点击编译链接,生成 HEX 文件
点击 Load,下载源程序到 STM32,运行程序 (2) 选择软件调试模式,点击 MDK 的 Debug 菜单,选择 Start/Stop Debug Session 项或 Ctrl+F5 键。
7在逻辑分析仪中添加 GPIOC_ODR.6、GPIOC_ODR.7、GPIOC_ODR.8、GPIOC_ODR.9, 点击 Run 按钮即可在逻辑分析仪中看波形。
4.2 测 试
本程序由于大量的涉及到原理简单,测试方便,只需要单步运行,查看寄存器的值,就 可以测试程序的正确性。
(1) 程序开始时各寄存器的值
(2)将时钟控制寄存器入口基地址赋值给 R1
(3)R1 既已经被赋值了时钟控制寄存器入口地址,利用偏移地址将时钟各控制寄存器的地 址赋值给(R1+偏移量) 达到配置 RCC_CR、RCC_CFGR、RCC_AHBENR、RCC_APB2ENR 的目的, , 集体寄存器值变化如下:
8(4)端口配置情况测试:I/O C 口入口地址写进通用寄存器 R1,利用基地址加偏移地址找 到端口配置寄存器 GPIOC_CRL、GPIOC_CRH,然后将控制字 0X22222222 写进该寄存器。
(5)端口输出数据寄存器(GPIOx_ODR) 的值的变化,直接反映了外部 LED 的亮灭变化, 采用逐位写 1 的方式,实现循环点亮,此时通用 R1 已经被写进了 C 口的入口基地址,只需 加上偏移地0X0C,便是GPIOx_ODR 的地址,每次写值控制 LED 点亮后,程序跳转到延 时子程序,所测试结果如下: 【将 0xfffffc4f 写进 GIPOC_ODR 点亮 LED1】 【延时子程序运行寄存器变化情况】
当转入延时子程序后,寄存器 R3 值做减 1 算法,从 0X000FFFFF 循环减至 0,是为延时 时间,然后继续跳转至端口输出寄存器配置,点亮 LED2,接着再次跳转到延时子程序,R39再次做减 1 运算,如此控制 LED 循环点亮。 【转入延时子程序】
【退出延时子程序对 LED2 对应位写 1 况】
4.3 结 果 及 描 述
(1)逻辑分析仪中波形:
GPIOC_ODR.6、 GPIOC_ODR.7、 GPIOC_ODR.8、 GPIOC_ODR.9 的波形即对应的 LED1、 LED2、LED3、LED4 高低电平波形,由此可以验证程序的正确性,即 LED 确实按照程序的 思想循环顺序点亮。
(2)当将程序下载到 STM32 中后,EduKit-M3 实验平台上四个 LED 确实循环点亮,进一 步验证控制程序的正确性。
五、总结
本设计是基于 STM32 的汇编语言编写的 LED 循环顺序点亮控制程序,原理简单易行, 程序可修改性和可读性强, 件电路也很简单, 需要外扩电路, 接利用试验台内部接线, 硬 不 直 通过对 GPIO 的控制来相应地点亮 LED 灯。 整个控制程序只需要找到相应的时钟、端口、输出寄存器的地址,以及各控制寄存器的 偏移地址,直接寻址写值控制,这是与 C 语言程序最大的不同点,即汇编编程更加的贴近硬 件,要求熟悉内部寄存器的地址,熟悉如何配置各位,这就要求对寄存器每位的含义非常清 楚。 通过用汇编语言编写 I/O 控制程序, 进一步熟悉了解了 STM32 GPIO 操作, 以及 CORTEX M3 的内部架构和优点,学会了如何使用 KEIL Realview 开发 STM32,以及如何进行程序单 步调试,寄存器值查看。了解了 EduKit-M3 实验平台内部结构和优良的功能。
一、设计目的
经过一系列硬件课程的学习及相关实验后,做一个综合的系统性的设计,对计算机硬件设计有一个整体的认识,可以进一步提高实践动手能力。
二、所用设备
TDN-CM++实验教学系统一台,PC微机一台, 排线若干
三、设计思想
1、确定搭建一台8位模型机,指令系统系统有10条,涉及输入,输出,加,减,自增,自减,与,传送,跳转,停机等指令。
2、根据所要设计的指令,确定各种信息的传送路径,以及实现这些传送所需的微指令。
3、根据数据通路,确定指令系统中每条指令的执行流程。
4、根据执行流程,确定好机器指令之后,确定相对应的微指令地址,需要多条微指令来完成的机器指令,要准确无误的确定每条微指令的后续地址。 5.设计好指令后,将指令加载,检测该指令是否可以达到预计功能。
四、设计总结
经过了三天的实践学习,在老师的悉心指导和搭档的默契配合下终于完成了硬件课程实验,从中受益匪浅。
实验首先要做的事情就是接线,对于已经做过微机实验的我们,器件箱并不陌生,但也熟知连线的重要性,连每根线都必须十分细心,因为每根都影响着整个设备的运行。于是,我跟我的搭档分工合作,她读图我连线,为了避免连错,我每根线都以红线为起始位,保持规律性,这样也方便出错后检查。在我俩默契的配合下,我们很快就完成了连线操作,后来测试时却发现数据显示一直不变,经过检查才发现原来数据线少插了一根。还好就这么一根问题,因为很多同学在连线这块就花费了大量的时间了,大大降低了效率,所以说小问题也不能忽视。
连线正确后,接下来就是编写微指令了,由于对指令的格式不是很熟悉,所以在了解指令格式和工作流程上花费了些时间。编写的指令有两种,一个是操作码,一个是微指令。操作码格式比较简单,相比而言微指令格式比较复杂,共24位,为了便于理解,在编写微指令的时候我都按各部分的含义将24位划分成了几个部分,也便于修改。在编写指令的过程中,我发现虽然写的指令都是平时最常用的基本指令,我们都很清楚每条指令的含义,但是把它们转换成微指令还是比较复杂的。因为有些指令虽然只有一句,但是却包含好几步微操作,我们必须对每条微操作的流程非常清楚才能写出正确的微指令。
还有就是在编写JMP指令的时候,理论要求我们在执行该指令后,能够实现跳转效果,但很多人都只是理解到这一步,并没有去深思跳转是从哪里跳转到哪里,正如我们刚开始设计这一指令时一样,仅是随随便便的在JMP指令所对应的微指令当中,将后继位地址随便改成了另一个微指令的地址,以为已经实现了跳转,后来发觉,这样的跳转不仅没有任何实际意义,更重要的是在操作员使用这一指令的时候,本意应该是想指定下一步将要执行的指令,作用可能是控制循环,也可能是跳转分支,总之是需要自己去设定的一个目的机器指令,而绝不是随意的指定了一条微指令。后来在老师的指导下,我们在操作码中又添加了一条语句,实现了跳转到固定位置,而不会再由机器随机选取目的地址跳转了。
通过这次的实验,我更加地清楚了微指令的操作流程和编写,加强了自己的动手能力,对硬件实验有了一定的了解,相信这次实验对今后的学习也会有一定的帮助。