嵌入式技术基础与实践-学习笔记

该博客围绕嵌入式系统展开学习与实践。罗列了常用术语,学习main.s汇编源文件并进行修改和编写示例程序。了解MCU芯片信息,学习示例程序,实现灯的闪烁。还涉及UART_2串口编程,包括初始化参数、波特率计算等,最后对CAN驱动函数加注释并进行通信实验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

第一章

1.列表罗列嵌入式系统常用术语

2.运行示例程序

第二章(1)

1.理解并学习main.s汇编源文件

2.修改main.s源文件

第二章(2)

1.学习main.s源程序

2.编写示例程序:datax、datay、dataz三个数中,找出最大值并显示。

第三章

1.对照命名格式,给出所用MCU芯片型号标识所获得的信息

2.给出所用MCU芯片的RAM及Flash大小、地址范围

第四章

1.学习CH04示例程序,包括gpio.c和4个工程中的main.c

2.给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中LIGHT_RED和LIGHT_OFF的值是多少?贴出每一步的查找截图

3.用直接地址编程方式,实现红绿蓝三灯轮流闪烁

4.用调用构件方式,实现红绿蓝的八种组合轮流闪烁

第六章(1)

1.编写UART_2串口发送程序时,初始化需要设置哪些参数?

2.假设速度为115200,系统时钟为72MHz,波特率寄存器BRR中的值应该是多少?

3.中断向量表在哪个文件中?表中有多少项?给出部分截图。

4.以下是中断源使能函数,假设中断源为TIM6,将函数实例化(写出各项具体数值)。

5.假设将UART_2和TIM6交换其在中断向量表中的位置和IRQ号, UART_2可以正常中断吗?

第六章(2/实验二)

1.运行并理解..\04\-Software\CH06文件夹中的几个程序。

2.实现UART_2串口的接收程序,当收到字符时:①在电脑的输出窗口显示下一个字符,如收到A显示B;②亮灯:收到字符G亮绿灯;收到R亮红灯;收到B亮蓝灯;收到其他字符不亮灯。

2.1 用构件调用方式实现。

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值