导语:这是一份嵌入式课程设计报告的通用模板,条明确晰、脉络连贯,涵盖需求分析、方案选型、软硬件实现与调试过程。语言平实不堆砌,着眼于体现工程思维和动手痕迹,方便学生快速上手填充内容,写完不空洞、不雷同,交得踏实,改得省心。
适用对象:大三/大四电子/计算机专业学生,刚学完单片机和汇编,代码能力一般,需要模板照着写报告。
使用场合:这是给老师交的嵌入式课程设计作业报告,用于期末考核或课程结课展示,主要证明自己动手做了led控制实验,能写汇编、会调试、懂寄存器配置。
核心内容:用纯汇编语言在stm32上实现led顺序循环点亮,强调“寄存器级操作”“贴近硬件”“可读可改”,突出动手过程而非理论堆砌。
内容体量:4500字
报告关键词: 嵌入式课程设计 stm32实验平台 armcortex-m3 gpio寄存器配置 keil开发环境
嵌入式课程设计报告
最近几年,几乎所有的it 企业对应届毕业生都有抱怨:动手能力太差,编程水平低下。下面和小编一起来看看报告吧!
corte_-m3 是 arm 公司基于 arm v7 架构的新型芯片内核。 stm32v100-ii 型是英蓓特 公司新推出的一款基于 st 意法半导体 stm32 系列处理器(corte_-m3 内核)的全功能 评估板。stm103v100-ii 评估板有 usb,motor control,can,sd 卡,smart 卡, uart,speaker,lcd,led,bnc,耳塞插孔等丰富的外设,有助于用户轻松开发 stm32 的强大功能。stm32 系列使用了 arm 最新的、先进架构 corte_-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 端口概述 stm32f10_ 处理器上共有 7 个 i/o 端口:a、b、c、d、e、f、g,每个 16 个管脚 每组端口(寄存器必须以 32 位字形式访问) 每组端口有以下寄存器: , 32 位配置寄存器: gpio__crl、gpio__crh 32 为数据寄存器: gpio__idr、gpio__odr 32 位置位/复位寄存器: gpio__bsrr 16 位复位寄存器: gpio__brr 32 为锁定寄存器: gpio__lckr i/o 口通用输入、输出端口配置为输入时,每个 apb2 时钟周期将端口数据送输入寄存 器(gpio__idr),在输入模式下,输出是断开的。输出模式时:写到输出寄存器(gpio__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 个源文件:stm32f10_.s、和 my led.s,stm32f10__lib.c 其中3stm32f10_.s 为启动代码, 。启动代码作用是:1)堆和栈的初始化;2)向量表定义;3)地 址重映射及中断向量表的转移;4)设置系统时钟频率;5)中断寄存器的初始化;6)进入 汇编主程序。my led.s 是汇编主程序,完成所有控制功能。
(2)程序工作原理概述: 对于 led 的控制,主要通过对 i/o 端口的配置,将对应的寄存器相应的位写 1 写 0 控 制。程序首先要经过启动代码段进行相关的启动配置,然后跳转到汇编主程序。 汇编主程序完成了时钟、端口配置以及 led 点亮的所有功能。首先需要对于系统时钟进 行配置,已获得系统所用频率。 然后进行端口配置低、高寄存器配置,获得输入输出模式以及最大速度。将时钟和端口 配置完成后,就可以对输出寄存器进行对应位的写值控制了,从而达到控制 led 的目的,高 电平点亮,低电平熄灭。 点亮 led 后,转入延时子程序,延时子程序写值 0_000fffff,做寄存器值减法,减到 0 后,过程所需时间即是延时时间,即单个 led 点亮时间。本程序设置循环点亮模式,即 led1 到 led4 顺序循环点亮,将对应位逐次写 1,如果需要修改点亮模式,只需修改寄存器的值以 及写值顺序即可。
(3)寄存器配置描述 端口配置低寄存器(gpioc_crl) c口基地址:0_40011000 偏移地址:0_00 复位值:0_44444444 寄存器配置:0_22222222 功能含义: 口配置低寄存器为模拟输入模式, 端 通用推挽输出模式, 输出模式, 最大速? 2mhz
端口配置高寄存器(gpioc_crh) c口基地址:0_40011000 偏移地址:0_04 复位值:0_44444444 寄存器配置:0_22222222 功能含义: 口配置高寄存器为模拟输入模式, 端 通用推挽输出模式, 输出模式, 最大速? 2mhz 端口输出数据寄存器(gpioc_odr) c口基地址:0_40011000 地址偏移:0ch 寄存器配置 0_fffffc4f 0_fffffc8f 复位值:00000000h 功能含义 pc.6 位写 1,对应点亮 led1 pc.7 位写 1,对应点亮 led2
40_fffffd0f 0_fffffe0fpc.8 位写 1,对应点亮 led3 pc.9 位写 1,对应点亮 led4
时钟控制寄存器(rcc_cr) 复位和时钟基地址:0_40021000 偏移地址: 0_00 复位值: 0_000 __83 寄存器配置:0_00000003 功能含义:pll 未锁定,pll 关闭,时钟监测器关闭,外部 1-25mhz 振荡器没有旁?,外部 1-25mhz 时钟没有就绪,hse 振荡器关闭内部 8mhz 时钟就绪,内部 8mhz 时钟开启。 时钟配置寄存器(rcc_cfgr) 复位和时钟基地址:0_40021000 偏移地址: 0_04 复位值: 0_0000 0000 寄存器配置:0_00000000 功能含义:没有时钟输出,pll 时钟 1.5 倍分频作为 usb 时钟,pll 2 倍频输出,hse 不分 频,hsi 时钟 2 分频后作为 pll 输入时钟,pclk2 2 分频后作为 adc 时钟,hclk 不分频, hclk 不分频,sysclk 不分频,hsi 作为系统时钟,hsi 作为系统时钟。 ahb外设时钟使能寄存器 (rcc_ahbenr) 复位和时钟基地址:0_40021000 偏移地址:0_14 复位值:0_0000 0014 寄存器配置:0_00000014 功能含义:睡眠模式时闪存接口电路时钟开启,睡眠模式时 sram 时钟开启,dma 时钟关 闭 apb2 外设时钟使能寄存器(rcc_apb2enr) 复位和时钟基地址:0_40021000 偏移地址:0_18 复位值:0_0000 0000 寄存器配置:0_ffffffff 功能含义:usart1 时钟开启,spi1 时钟开启,tim1 时钟开启,adc2 时钟开启,adc1 时钟开启,io 口 e 时钟开启,io 口 d 时钟开启,io 口 c 时钟开启,io 口 b 时钟开启,io 口 a 时钟开启,辅助功能 io 时钟开启
3.2 主 要 程 序 说 明
(1)启动代码转入汇编主程序的设置: 启动代码段设置: reset_handler proc e_port reset_handler [weak] import main ;声明外部函数,导入符号 ldr r0, =main ;等待工作调用 b_ r0 ;跳转到汇编主程序 main 函数 endp ;过程段结束 汇编主程序设置: area mycode,code,readonly ;定义一个代码段,属性为只读 e_port main main proc (主程序功能段开始) endp end (2)汇编主程序 ;配置时钟
5ldr r1,=0_40021000 ldr r0,=0_00000003 str r0,[r1,#0_00] ldr r0,=0_00000000 str r0,[r1,#0_004] ldr r0,=0_00000014 str r0,[r1,#0_14]
时钟控制寄存器入口
配置时钟控制寄存器(rcc_cr)
配置时钟配置寄存器(rcc_cfgr)
配置 ahb 外设时钟使能寄存器 rcc_ahbenr
ldr r0,=0_ffffffff str r0,[r1,#0_18] ;配置 apb2 外设时钟使能寄存器(rcc_apb2enr) ;----------------------------------------------------------------------------------------------------;配置端口 movs r0,#0_22222222 ldr r1,=0_40011000 str r0,[r1,#0_00] ;配置端口配置寄存器 gpioc_crl movs r0,#0_22222222 ldr r1,=0_40011000 str r0,[r1,#0_04] ;配置端口配置寄存器 gpioc_crh ;---------------------------------------------------------------------------------------------------;点 亮 led ldr r0,=0_fffffc4f str r0,[r1,#0_0c] ;将 0_fffffc4f 写进 gipoc_odr, 点亮 led1 bl delay ;延时 --------------------------------------------------------------------------------------------------------ldr r0,=0_fffffc8f str r0,[r1,#0_0c] ;将 0_fffffc8f 写进 gipoc_odr, 点亮 led2 bl delay ;延时 -------------------------------------------------------------------------------------------------------ldr r0,=0_fffffd0f str r0,[r1,#0_0c] ;将 0_fffffd0f 写进 gipoc_odr, 点亮 led3 bl delay ;延时 -------------------------------------------------------------------------------------------------------ldr r0,=0_fffffe0f str r0,[r1,#0_0c] ;0_fffffe0f 写进 gipoc_odr, 点亮 led4 bl delay ;延时 -------------------------------------------------------------------------------------------------------b main ;跳到 main 函数 ;------------------------------------------------------------------------(2)延时子程序 delay
6ldr r3,=0_000fffff ;延时控制字 delay_1 subs r3,r3,#0_01 ;延时控制字自减 beq delay_out ;为 0 跳出返回 b delay_1 ;不为 0 回转继续做减法 delay_out b_ lr ;程序返回
四、 调试与结果
4.1 调 试 过 程
(1) 使用 keil uvision3 通过 ulink 2 仿真器连接 edukit-m3 实验平台,打开建立的 my led controler 工程,点击子目录下的 my led.s 文件,编译链接工程。 设置 flash——debug, 选择 corte_-m3 j-link, flash——utilities, 同样选择 corte_-m3 j-link,效果如下
点击编译链接,生成 he_ 文件
点击 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,然后将控制字 0_22222222 写进该寄存器。
(5)端口输出数据寄存器(gpio__odr) 的值的变化,直接反映了外部 led 的亮灭变化, 采用逐位写 1 的方式,实现循环点亮,此时通用 r1 已经被写进了 c 口的入口基地址,只需 加上偏移地址#0_0c,便是 gpio__odr 的地址,每次写值控制 led 点亮后,程序跳转到延 时子程序,所测试结果如下: 将 0_fffffc4f 写进 gipoc_odr 点亮 led1 延时子程序运行寄存器变化情况
当转入延时子程序后,寄存器 r3 值做减 1 算法,从 0_000fffff 循环减至 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 操作, 以及 corte_ m3 的内部架构和优点,学会了如何使用 keil realview 开发 stm32,以及如何进行程序单 步调试,寄存器值查看。了解了 edukit-m3 实验平台内部结构和优良的功能。
标题明确(嵌入式课程设计报告),有“一、二、三…”分级编号,含设计概述、硬件设计、软件设计、调试结果、总结五大部分,结尾无落款但结构完整。
| 相关分类 | 内容标题 | 说明 |
|---|---|---|
| 嵌入式社会报告 | 计算机专业暑期学习嵌入式社会实践总结报告 | 使用场景:暑期嵌入式培训、Linux系统实训 [详情] |