嵌入式系统实验报告.docx
- 文档编号:8989830
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:30
- 大小:1.53MB
嵌入式系统实验报告.docx
《嵌入式系统实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
嵌入式系统实验报告
嵌入式系统实验报告
实验报告
课程名称:
嵌入式系统
学院:
信息工程
专业:
电子信息工程
班级:
学生姓名:
学号:
指导教师:
开课时间:
学年
第一
学期
实验名称:
IO接口(跑马灯)
实验时间:
11.16
实验成绩:
一、实验目的
1.掌握STM32F4基本IO口的使用。
2.使用STM32F4IO口的推挽输出功能,利用GPIO_Set函数来设置完成对IO口的配置。
3.控制STM32F4的IO口输出,实现控制ALIENTEK探索者STM32F4开发板上的两个LED实现一个类似跑马灯的效果。
二、实验原理
本次实验的关键在于如何控制STM32F4的IO口输出。
IO主要由:
MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR、AFRH和AFRL等8个寄存器的控制,并且本次实验主要用到IO口的推挽输出功能,利用GPIO_Set函数来设置,即可完成对IO口的配置。
所以可以通过了开发板上的两个LED灯来实现一个类似跑马灯的效果。
三、实验资源
实验器材:
探索者STM32F4开发板
硬件资源:
1.DS0(连接在PF9)
2.DS1(连接在PF10)
四、实验内容及步骤
1.硬件设计
2.软件设计
(1)新建TEST工程,在该工程文件夹下面新建一个HARDWARE文件夹,用来存储以后与硬件相关的代码。
然后在HARDWARE文件夹下新建一个LED文件夹,用来存放与LED相关的代码。
(2)打开USER文件夹下的test.uvproj工程,新建一个文件,然后保存在LED文件夹下面,保存为led.c,在led.c中输入相应的代码。
(3)采用GPIO_Set函数实现IO配置。
LED_Init调用GPIO_Set函数完成对PF9和PF10ALIENTEK探索者STM32F407开发板教程119STM32F4开发指南(寄存器版)的模式配置,控制LED0和LED1输出1(LED灭),使两个LED的初始化。
(4)新建一个led.h文件,保存在LED文件夹下,在led.h中输入相应的代码。
3.下载验证
使用flymcu下载(也可以通过JLINK等仿真器下载),如图1.2所示:
图1.2
运行结果如图1.3所示:
图1.3
五、实验源程序
相关代码如下所示:
(1)led.c文件
#include"led.h"
voidLED_Init(void)
{
RCC->AHB1ENR|=1<<5;//
GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//PF9,PF10设置
LED0=1;//LED0关闭
LED1=1;//LED1关闭
}
(2)led.h文件
#ifndef__LED_H
#define__LED_H
#include"sys.h"
//LED端口定义
#defineLED0PFout(9)//DS0
#defineLED1PFout(10)//DS1
voidLED_Init(void);//初始化
#endif
(3)main函数
#include"sys.h"
#include"delay.h"
#include"led.h"
intmain(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168);//初始化延时函数
LED_Init();//初始化LED时钟
while
(1)
{
LED0=0;//DS0亮
LED1=1;//DS1灭
delay_ms(500);
LED0=1;//DS0灭
LED1=0;//DS1亮
delay_ms(500);
}
}
六、实验总结
本次实验过程中,由于第一次实验,对实验器件,还有实验过程都不大了解,使得做实验过程中遇到很大的问题。
也花费了不少时间,不过在慢慢的摸索中,以及老师的指导和同学的帮助下,最终也了解了探索者STM32F4开发板的外部结构,以及各个引脚的作用,还有各个串口和并口的具体使用,还观察了跑马灯的运行状态,以及它的运行程序。
七、预习思考题
八、注意事项
(1)新建文件夹时,区分不同的文件夹之间的关系。
(2)编写代码时,注意格式和符号,在英文环境下输入。
实验名称:
触摸屏
实验时间:
11.23
实验成绩:
一、实验目的
1.掌握触摸屏的工作原理。
2.通过外接带触摸屏的LCD模块,来实现触摸屏控制。
3.通过对电阻触摸和电容触摸的学习,实现触摸屏驱动,最终实现一个手写板的功能。
二、实验原理
电阻式触摸屏原理:
当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器检测到这个接通点并计算出X、Y轴的位置。
特点:
精度高、价格便宜、抗干扰能力强、稳定性好;
易被划伤、透光性差、不支持多点触摸。
电容式触摸屏原理:
利用人体的电流感应进行工作。
当手指触摸金属层时,由于人体电场,用户和触摸屏表面形成一个耦合电容。
对于高频电流来说电容是直接导体,于是手指从接触点吸走一个很小的电流。
这个电流分别从触摸屏的4个角的电极流出,并且流经4个电极的电流与手指到4角的距离成正比。
控制器通过对电流比例的计算,得到触摸点的位置。
特点:
手感好、无需校正、透光性好、支持多点触摸;
成本高、精度不高、抗干扰力差。
三、实验资源
实验器材:
探索者STM32F4开发板
硬件资源:
1、DS0(连接在PF9)
2、串口1(波特率:
115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
3、ALIENTEK2.8/3.5/4.3/7寸TFTLCD模块(通过FSMC驱动,FSMC_NE4接LCD
片选/A6接RS)
4、按键KEY0(PE4)
四、实验内容及步骤
1.硬件设计
图2.1触摸屏与STM32F4连接原理图
2.软件设计
(1)打开上一章的工程,由于本次实验不要用到USMART和CAN相关代码,所以,先去掉USMART相关代码和can.c(此时HARDWARE组剩下:
led.c、ILI93xx.c和key.c)。
不过,本次实验要用到24C02,所以要添加myiic.c和24cxx.c到HARDWARE组下。
(2)然后,在HARDWARE文件夹下新建一个TOUCH文件夹。
然后新建一个touch.c、touch.h、ctiic.c等十个文件,并保存在TOUCH文件夹下,并将这个文件夹加入头文件包含路径。
其中,touch.c和touch.h是电阻触摸屏部分的代码,顺带兼电容触
摸屏的管理控制,其他则是电容触摸屏部分的代码。
3.下载验证
使用flymcu下载(也可以通过JLINK等仿真器下载),如图2.2所示:
图2.2
运行结果如图2.3所示:
图2.3
五、实验源程序
(1)main函数
intmain(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168);//延时初始化
uart_init(84,115200);//初始化串口波特率为115200
LED_Init();//初始化LED
LCD_Init();//LCD初始化
KEY_Init();//按键初始化
tp_dev.init();//触摸屏初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(30,50,200,16,16,"ExplorerSTM32F4");
LCD_ShowString(30,70,200,16,16,"TOUCHTEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/7");
if(tp_dev.touchtype!
=0XFF)LCD_ShowString(30,130,200,16,16,"PressKEY0toAdjust");
delay_ms(1500);
Load_Drow_Dialog();
if(tp_dev.touchtype&0X80)ctp_test();//电容屏测试
elsertp_test();//电阻屏测试
}
(2)//电阻触摸屏测试函数
voidrtp_test(void)
{
u8key;u8i=0;
while
(1)
{
key=KEY_Scan(0);
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
{
if(tp_dev.x[0] { if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog(); elseTP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);//画图 } }elsedelay_ms(10);//没有按键按下的时候 if(key==KEY0_PRES)//KEY0按下,则执行校准程序 { LCD_Clear(WHITE);//清屏 TP_Adjust();//屏幕校准 TP_Save_Adjdata(); Load_Drow_Dialog(); } i++; if(i%20==0)LED0=! LED0; } } (3)//电容触摸屏测试函数 voidctp_test(void) { u8t=0;u8i=0; u16lastpos[5][2];//最后一次的数据 while (1) { tp_dev.scan(0); for(t=0;t<5;t++) { if((tp_dev.sta)&(1< { if(tp_dev.x[t] { if(lastpos[t][0]==0XFFFF) { lastpos[t][0]=tp_dev.x[t]; lastpos[t][1]=tp_dev.y[t]; } lcd_draw_bline(lastpos[t][0],lastpos[t][1],tp_dev.x[t],tp_dev.y[t],2, POINT_COLOR_TBL[t]);//画线 lastpos[t][0]=tp_dev.x[t]; lastpos[t][1]=tp_dev.y[t]; if(tp_dev.x[t]>(lcddev.width-24)&&tp_dev.y[t]<20) { Load_Drow_Dialog();//清除 } } }elselastpos[t][0]=0XFFFF; } delay_ms(5);i++; if(i%20==0)LED0=! LED0; } } 六、实验总结 基本达到实验的要求,了解触摸屏基本概念与原理,以及通过编程实现对触摸屏的控制,以及知道如何验证实验结果是否属于预期目标,并了解实验原理,为今后嵌入式的学习打下一定的学习基础。 七、预习思考题 八、注意事项 (1)新建文件夹时,区分不同的文件夹之间的关系。 (2)编写代码时,注意格式和符号,在英文环境下输入。 实验名称: 串口通信 实验时间: 11.30 实验成绩: 一、实验目的 1.了解STM32F4串口。 2.掌握如何使用STM32F4的串口来发送和接收数据。 3.学会如何初始化串口。 4.掌握串口编程与调试方法。 二、实验原理 串行通信需要将传输的数据分解成二进制位,然后采用一条信号线将多个二进制数据位按一定的时间和顺序,逐位由信息发送端传到信息的接收端。 根据数据的传输方向和发送接收是否能同时进行,数据传输的工作方式分为单工方式,半双工方式和全双工方式。 单工通信是指信息只能单方向传输的工作方式,发送端和接收端的方向是固定的。 半双工通信方式可以实现双向的通信,不能在两个方向上同时进行工作,但可以轮流交替地进行通信,即通信信道的任意端,既可以是发送端也可以是接收端。 全双工通信方式是指在通信的任意时刻,允许数据同时在两个方向上传输,即通信双方可以同时发送和接收数据。 三、实验资源 实验器材: 探索者STM32F4开发板 硬件资源: a.DS0(连接在PF9) b.串口1(波特率: 115200,PA9/PA10连接在板载USB转串口芯片CH340上面) 四、实验内容及步骤 1.硬件设计 所需硬件资源: 1)指示灯DS0 2)串口1 图3.1硬件连接图示意图 2.软件设计 (1)打开上一章的TSET工程,因为本章我们用不到按键和蜂鸣器等功能,所以把key.c和beep.c从HARDWARE工程组里面删除,从减少工程代码量,仅留下必须的.c文件,节省空间,加快编译速度。 (2)然后在SYSTEM组下双击usart.c,就可以看到文件里的代码。 3.下载验证 使用flymcu下载(也可以通过JLINK等仿真器下载),如图3.2所示: 图3.2 运行结果如图3.3所示: 图3.3 五、实验源程序 (1)uart_init函数 //初始化IO串口1 //pclk2: PCLK2时钟频率(Mhz) //bound: 波特率 voiduart_init(u32pclk2,u32bound) { floattemp; u16mantissa; u16fraction; temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0 mantissa=temp;//得到整数部分 fraction=(temp-mantissa)*16;//得到小数部分@OVER8=0 mantissa<<=4; mantissa+=fraction; RCC->AHB1ENR|=1<<0;//使能PORTA口时钟 RCC->APB2ENR|=1<<4;//使能串口1时钟 GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M, GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出 GPIO_AF_Set(GPIOA,9,7);//PA9,AF7 GPIO_AF_Set(GPIOA,10,7);//PA10,AF7 //波特率设置 USART1->BRR=mantissa;//波特率设置 USART1->CR1&=~(1<<15);//OVER8=0 USART1->CR1|=1<<3;//串口发送使能 #ifEN_USART1_RX//如果使能了接收 //使能接收中断 USART1->CR1|=1<<2;//串口接收使能 USART1->CR1|=1<<5;//接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级 #endif USART1->CR1|=1<<13;//串口使能 } (2)test.c函数 #include"sys.h" #include"delay.h" #include"usart.h" #include"led.h" intmain(void) { u8t; u8len; u16times=0; Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz delay_init(168);//延时初始化 uart_init(84,115200);//串口初始化为115200 LED_Init();//初始化与LED连接的硬件接口 while (1) { if(USART_RX_STA&0x8000) { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("\r\n您发送的消息为: \r\n"); for(t=0;t { USART1->DR=USART_RX_BUF[t]; while((USART1->SR&0X40)==0);//等待发送结束 } printf("\r\n\r\n");//插入换行 USART_RX_STA=0; }else { times++; if(times%5000==0) { printf("\r\nALIENTEK探索者STM32F407开发板串口实验\r\n"); printf("正点原子@ALIENTEK\r\n\r\n\r\n"); } if(times%200==0)printf("请输入数据,以回车键结束\r\n"); if(times%30==0)LED0=! LED0;//闪烁LED,提示系统正在运行. delay_ms(10); } } } 六、实验总结 在程序设计方面,对串口通信的过程有了更深刻的理解和领会。 通过本次实验,使我对ARM嵌入式开发有了一定的掌握和理解,巩固了我在课程中所学的基本理论知识和实验技能,使我对嵌入式系统课程有了更深入的了解,熟悉了串口的使用,了解了内部功能模块及内核架构。 七、预习思考题 八、注意事项 (1)新建文件夹时,区分不同的文件夹之间的关系。 (2)编写代码时,注意格式和符号,在英文环境下输入。 实验名称: RTC实时时钟 实验时间: 12.7 实验成绩: 一、实验目的 1.学会使用TFTLCD模块来显示日期和时间,实现一个简单的实时时钟,并可以设置闹钟 2.了解和掌握STM32F4的RTC的工作原理 二、实验原理 STM32F4的RTC时钟的使用: 1)时钟和分频;2)日历时间(RTC_TR)和日期(RTC_DR)寄存器;3)可编程闹钟;4)周期性自动唤醒 RTC正常工作的一般配置步骤如下: 1)使能电源时钟,并使能RTC及RTC后备寄存器写访问;2)开启外部低能振荡器,选择RTC时钟,并使能;3)取消RTC写保护;4)进入RTC初始化模式;5)设置RTC的分频,以及配置RTC参数 通过以上的5个步骤,我们就完成了对RTC的配置,RTC即可正常工作,而且这些操作不是每次上电都必须执行的,可以视情况而定。 三、实验资源 实验器材: 探索者STM32F4开发板 四、实验内容及步骤 硬件资源: 1、DS0(连接在PF9),DS1(连接在PF10) 2、串口1(波特率: 115200,PA9/PA10连接在板载USB转串口芯片CH340上) 3、ALIENTEK2.8/3.5/4.3/7寸TFTLCD模块(通过FSMC驱动,FSMC_NE4接LCD片选/A6接RS) 1.硬件设计 RTC属于STM32F4内部资源,期配置也是通过软件设置好就可以了。 不过RTC不能断电,否则数据就丢失了,我们如果想让时间在断电后还可以继续走,那么必须确保开发板的电池有电。 2.软件设计 打开上一章的工程,首先在HARDWARE文件夹下新建一个RTC的文件夹。 然后打开USER文件夹下的工程,新建一个rtc.c的文件和rtc.h的头文件,保存在RTC文件夹下,并将RTC文件夹加入头文件包含路径。 rtc.c中的代码中的RTC_Init函数用来初始化RTC时钟,在这里设置时间和日期,分别是通过RTC_Set_Time和RTC_Set_Data函数来实现的,其中RTC_Set_Time用于设置时间,RTC_Set_Data用于设置日期。 Test.c中通过RTC_Sst_WakeUp(4,0);设置RTC周期型自动唤醒周期为1秒钟,类似于STM32F1的秒钟中断。 然后,在main函数不断的读取RTC的时间和日期(每100ms一次),并显示在LED上面。 将RTC的一些相关函数加入了usmart,这样通过串口就可以直接设置RTC时间、日期、闹钟A、周期性唤醒和备份寄存器读写等操作。 3.下载验证 使用flymcu下载(也可以通过JLINK等仿真器下载),如图4.2所示: 运行结果如图4.3所示: 图4.2 图4.3 五、实验源程序 1.RTC_Init //RTC初始化 //返回值: 0,初始化成功; //1,LSE开启失败; //2,进入初始化模式失败; u8RTC_Init(void) { u16retry=0X1FFF; RCC->APB1ENR|=1<<28;//使能电源接口时钟 PWR->CR|=1<<8;//后备区域访问使能(RTC+SRAM) if(RTC_Read_BKR(0)! =0X5050)//是否第一次配置? { RCC->BDCR|=1<<0;//LSE开启 while(retry&&((RCC->BDCR&0X02)==0))//等待LSE准备好 { retry--;delay_ms(5); } if(retry==0)return1;//LSE开启失败. RCC->BDCR|=1<<8;//选择LSE,作为RTC的时钟 RCC->BDCR|=1<<15;//使能RTC时钟 //关闭RTC寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53; if(RTC_Init_Mode())return2;//进入RTC初始化模式 RTC->PRER=0XFF;//RTC同步分频系数(0~7FFF),必须先设置同步分频, //再设置异步分频,Frtc=Fclks/((Sprec+1)*(Asprec+1)) RTC->PRER|=0X7F<<16;//RTC异步分频系数(1~0X7F) RTC-CR&=~(1<<16);//RTC设置为,24小时格式 RTC-ISR&=~(1<<7);//退出RTC初始化模式 RTC-WPR=0xFF;//使能RTC寄存器写保护 RTC_Set_Time(23,59,56,0);//设置时间 RTC_Set_Date(14,5,5,1);//设置日期 //RTC_Set_AlarmA(7,0,0,10);//设置闹钟时间 RTC_Write_BKR(0,0X5050);//标记已经初始化过了 } //RTC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 实验 报告