目录
2.编写示例程序:datax、datay、dataz三个数中,找出最大值并显示。
1.学习CH04示例程序,包括gpio.c和4个工程中的main.c
2.给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中LIGHT_RED和LIGHT_OFF的值是多少?贴出每一步的查找截图
1.编写UART_2串口发送程序时,初始化需要设置哪些参数?
2.假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?
4.以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。
5.假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号, UART_2可以正常中断吗?
1.运行并理解..\04\-Software\CH06文件夹中的几个程序。
2.实现UART_2串口的接收程序,当收到字符时:①在电脑的输出窗口显示下一个字符,如收到A显示B;②亮灯:收到字符G亮绿灯;收到R亮红灯;收到B亮蓝灯;收到其他字符不亮灯。
2.2 UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。
第一章
1.列表罗列嵌入式系统常用术语
中文名 | 英文缩写 | 英文全称 |
---|---|---|
封装 | PKG | Package |
印制电路板 | PCB | Printed Circuit Board |
动态可读写随机存储器 | DRAM | Dynamic Random Access Memory |
静态可读写随机存储器 | SRAM | Static Random Access Memory |
只读存储器 | ROM | Read Only Memory |
闪速存储器 | FM | Flash Memory |
模拟量与开关量 | AS, DS | Analog Signal, Digital Signal |
常见封装形式可分为两大类:
通孔封装:单列直插(SIP)、双列直插(DIP)、Z字形直插式封装(ZIP)......
贴片封装:小外形封装(SOP)、紧缩小外形封装(SSOP)、四方扁平封装(QFP)、塑料薄方封装(LQFP)、塑料扁平组件式封装(PFP)、插针网格阵列封装(PGA)、球栅阵列封装(BGA)......
中文名 | 英文缩写 | 英文全称 |
---|---|---|
并行通信 | PC | Parallel Communication |
串行通信 | SC | Serial Communication |
串行外设接口 | SPI | Serial Peripheral Interface |
集成电路互联总线 | I2C | Inter-Integrated Circuit |
通用串行总线 | USB | Universal Serial Bus |
控制器局域网 | CAN | Controller Area Network |
边界扫描测试协议 | JTAG | Joint Test Action Group |
串行线调试技术 | SWD | Serial Wire Debug |
中文名 | 英文缩写 | 英文全称 |
---|---|---|
通用输入输出 | GPIO | General Purpose I/O |
模数转换 | ADC | Analog to Digital Convert |
数模转换 | DAC | Digital to Analog Convert |
脉冲宽度调制器 | PWM | Pulse Width Modulator |
看门狗 | WDT | Watch Dog |
液晶显示 | LCD | Liquid Crystal Dispaly |
发光二极管 | LED | Light Emitting Diode |
键盘 | KBD | Keyboard |
2.运行示例程序
步骤1:硬件接线
步骤2:打开环境,导入工程
步骤3:编译工程
步骤4:连接GEC。这一步刚开始检测到GEC在COM串口但是握手失败,发现是安装了老版本的环境但是下的工程文件是新版的,最后卸载了旧版环境安装了对应最新版的就成功连接上了,浪费我半天,最烦的是晚上某大学的金葫芦社区打不开,那手册又是全英文的几百页看不懂,气煞我也
步骤5:下载机器码
步骤6:观察运行结果
步骤7:通过串口观察运行情况
①把波特率设为115200并打开对应串口
②验证串口收发。
打开另一个串口,默认波特率,发送数据,启动!
(发的太快有时会显示乱码,原因是小日子排放的核污水污染了数据bushi)
第二章(1)
1.理解并学习main.s汇编源文件
写出94~101行语句的c语言描述
源代码(94-101):
//(2)======主循环部分(开头)=====================================
main_loop: //主循环标签(开头)
//(2.1)主循环次数变量mMainLoopCount+1
ldr r2,=mMainLoopCount //r2←mMainLoopCount的地址
ldr r1, [r2]
add r1,#1
str r1,[r2]
//(2.2)未达到主循环次数设定值,继续循环
ldr r2,=MainLoopNUM
cmp r1,r2
blO main_loop //未达到,继续循环
c语言描述:
void main_loop() {
// (2)======主循环部分(开头)=====================================
// 主循环开始
while(1) {
// (2.1)主循环次数变量mMainLoopCount+1
mMainLoopCount += 1;
// (2.2)未达到主循环次数设定值,继续循环
if (mMainLoopCount >= MainLoopNUM)
{
break; // 如果mMainLoopCount大于或等于MainLoopNUM,则退出循环
}
2.修改main.s源文件
修改main.s源文件,增加以下内容:
1、在第一行显示“广州大学”字样·
hello_information: //字符串标号
.ascii "-------------------------------------------------------\n"
.ascii "广州大学,庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆\n"
.ascii "------------------------------------------------------\n\0"
2、编写一个1+2+..+10的程序,将求和结果存入名为“sumresult”的内存单元中,并将求和结果用printf显示出来。(注:建议在源程序中“main loop:”语句之前的地方增加结束时用“bl.“停住。printf的格式详见05 UserBoard/printf.h文件)
//修改处
sumresult:
.word 0
mov r2, #0 // 将寄存器r2初始化为0,用来累计求和
mov r0, #10 // 将寄存器r0初始化为10,用于循环计数
p1:
add r2, r2, r0 // 累加r0到r2,即累计求和
sub r0, r0, #1 // 将r0减1
cmp r0, #0 // 比较r0与0
bne p1 // 如果不等于0,继续循环
ldr r1, =sumresult // 将sumresult的地址加载到r1
str r2, [r1] // 将计算结果存储到sumresult指向的内存空间
ldr r0, =data_format // 加载十进制格式字符串的地址到r0
ldr r1, =sumresult // 加载sumresult的地址到r1
ldr r1, [r1] // 从内存地址加载实际的计算结果到r1
bl printf // 调用printf函数,r0是格式字符串的地址,r1是值
bl . //在此打桩(.表示当前地址),理解发光二极管为何亮起来了?
//(1)======启动部分(结尾)=======================================
//(2)======主循环部分(开头)=====================================
结果
第二章(2)
1.学习main.s源程序
打开04-Software/ch02/CH02-1-20220118工程目录07 AppPrg/main.s源程序。
源程序(作业2):
//=====================================================================
//文件名称:main.s
//功能概要:汇编编程调用GPIO构件控制小灯闪烁(利用printf输出提示信息)
//版权所有:SD-ARM(sumcu.suda.edu.cn)
//版本更新:20180810-20191018
//=====================================================================
.include "include.inc" //头文件中主要定义了程序中需要使用到的一些常量
//(0)数据段与代码段的定义
//(0.1)定义数据存储data段开始,实际数据存储在RAM中
.section .data
//(0.1.1)定义需要输出的字符串,标号即为字符串首地址,\0为字符串结束标志
hello_information: //字符串标号
.ascii "-------------------------------------------------------\n"
.ascii "广州大学,庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆庆\n"
.ascii "------------------------------------------------------\n\0"
data_format:
.ascii "%d\n\0" //printf使用的数据格式控制符
data_format1:
.ascii "%08x:%02x\n\0" //printf使用的数据格式控制符,其中8表示输出位数,
//0表示将输出的前面补上0,直到占满指定列宽为止
light_show1:
.ascii "LIGHT_BLUE:ON--\n\0" //灯亮状态提示
light_show2:
.ascii "LIGHT_BLUE:OFF--\n\0" //灯暗状态提示
light_show3:
.ascii "闪烁次数mLightCount=\0" //闪烁次数提示
//(0.1.2)定义变量
.align 4 //.word格式四字节对齐
mMainLoopCount: //定义主循环次数变量
.word 0
mFlag: //定义灯的状态标志,1为亮,0为暗
.byte 'A'
.align 4
mLightCount:
.word 0
//修改处(作业2)
sumresult:
.word 0
//(0.2)定义代码存储text段开始,实际代码存储在Flash中
.section .text
.syntax unified //指示下方指令为ARM和thumb通用格式
.thumb //Thumb指令集
.type main function //声明main为函数类型
.global main //将main定义成全局函数,便于芯片初始化之后调用
.align 2 //指令和数据采用2字节对齐,兼容Thumb指令集
//--------------------------------------------------------------------
//main.c使用的内部函数声明处
//--------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
main:
//(1)======启动部分(开头)主循环前的初始化工作======================
//(1.1)声明main函数使用的局部变量
//(1.2)【不变】关总中断
cpsid i
//(1.3)给主函数使用的局部变量赋初值
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
// 初始化蓝灯, r0、r1、r2是gpio_init的入口参数
ldr r0,=LIGHT_BLUE //r0指明端口和引脚(用=,因常量>=256,需用ldr)
mov r1,#GPIO_OUTPUT //r1指明引脚方向为输出
mov r2,#LIGHT_OFF //r2指明引脚的初始状态为亮
bl gpio_init //调用gpio初始化函数
// 初始化串口UART_User1
mov r0,#UART_User //串口号
ldr r1,=UART_BAUD //波特率
bl uart_init //调用uart初始化函数
//(1.6)使能模块中断
mov r0,#UART_User //串口号
bl uart_enable_re_int //调用uart中断使能函数
//(1.7)【不变】开总中断
cpsie i
//显示hello_information定义的字符串
ldr r0,=hello_information //待显示字符串首地址
bl printf //调用printf显示字符串
//修改处(作业2)
mov r2, #0 // 将寄存器r2初始化为0,用来累计求和
mov r0, #10 // 将寄存器r0初始化为10,用于循环计数
p1:
add r2, r2, r0 // 累加r0到r2,即累计求和
sub r0, r0, #1 // 将r0减1
cmp r0, #0 // 比较r0与0
bne p1 // 如果不等于0,继续循环
ldr r1, =sumresult // 将sumresult的地址加载到r1
str r2, [r1] // 将计算结果存储到sumresult指向的内存空间
ldr r0, =data_format // 加载十进制格式字符串的地址到r0
ldr r1, =sumresult // 加载sumresult的地址到r1
ldr r1, [r1] // 从内存地址加载实际的计算结果到r1
bl printf // 调用printf函数,r0是格式字符串的地址,r1是值
bl . //在此打桩(.表示当前地址),理解发光二极管为何亮起来了?
//(1)======启动部分(结尾)=======================================
//(2)======主循环部分(开头)=====================================
mai