当前位置:文档之家› 嵌入式系统实验报告

嵌入式系统实验报告

实验报告课程名称:嵌入式系统学院:信息工程专业:电子信息工程班级:学生姓名:学号:指导教师:开课时间:学年第一学期实验名称:IO接口(跑马灯)实验时间:11.16 实验成绩:一、实验目的1.掌握 STM32F4 基本IO口的使用。

2.使用STM32F4 IO口的推挽输出功能,利用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 和 PF10 ALIENTEK 探索者 STM32F407 开发板教程 119 STM32F4 开发指南(寄存器版) 的模式配置,控制 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"void LED_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 端口定义#define LED0 PFout(9) // DS0#define LED1 PFout(10) // DS1void LED_Init(void); //初始化#endif(3)main函数#include "sys.h"#include "delay.h"#include "led.h"int main(void){Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhzdelay_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)编写代码时,注意格式和符号,在英文环境下输入。

图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函数int main(void){Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhzdelay_init(168); //延时初始化uart_init(84,115200); //初始化串口波特率为115200LED_Init(); //初始化 LEDLCD_Init(); //LCD 初始化KEY_Init(); //按键初始化tp_dev.init(); //触摸屏初始化POINT_COLOR=RED; //设置字体为红色LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");LCD_ShowString(30,70,200,16,16,"TOUCH TEST");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(); //电容屏测试else rtp_test(); //电阻屏测试}(2)//电阻触摸屏测试函数void rtp_test(void){u8 key; u8 i=0;while(1){key=KEY_Scan(0);tp_dev.scan(0);if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下{if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height) {if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED); //画图}}else delay_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) //电容触摸屏测试函数void ctp_test(void){u8 t=0; u8 i=0;u16 lastpos[5][2]; //最后一次的数据while(1){tp_dev.scan(0);for(t=0;t<5;t++){if((tp_dev.sta)&(1<<t)){if(tp_dev.x[t]<lcddev.width&&tp_dev.y[t]<lcddev.height){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(); //清除}}}else lastpos[t][0]=0XFFFF;}delay_ms(5);i++;if(i%20==0)LED0=!LED0;}}六、实验总结基本达到实验的要求,了解触摸屏基本概念与原理,以及通过编程实现对触摸屏的控制,以及知道如何验证实验结果是否属于预期目标,并了解实验原理,为今后嵌入式的学习打下一定的学习基础。

七、预习思考题八、注意事项(1)新建文件夹时,区分不同的文件夹之间的关系。

(2)编写代码时,注意格式和符号,在英文环境下输入。

四、实验内容及步骤1.硬件设计所需硬件资源:1)指示灯 DS02)串口 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:波特率void uart_init(u32 pclk2,u32 bound){float temp;u16 mantissa;u16 fraction;temp=(float)(pclk2*1000000)/(bound*16);//得到 USARTDIV@OVER8=0 mantissa=temp; //得到整数部分fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0mantissa<<=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,AF7GPIO_AF_Set(GPIOA,10,7); //PA10,AF7//波特率设置USART1->BRR=mantissa; // 波特率设置USART1->CR1&=~(1<<15); //OVER8=0USART1->CR1|=1<<3; //串口发送使能#if EN_USART1_RX //如果使能了接收//使能接收中断USART1->CR1|=1<<2; //串口接收使能USART1->CR1|=1<<5; //接收缓冲区非空中断使能MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级#endifUSART1->CR1|=1<<13; //串口使能}(2)test.c函数#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"int main(void){u8 t;u8 len;u16 times=0;Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhzdelay_init(168); //延时初始化uart_init(84,115200); //串口初始化为 115200LED_Init(); //初始化与 LED 连接的硬件接口while(1){if(USART_RX_STA&0x8000){len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("\r\n 您发送的消息为:\r\n");for(t=0;t<len;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);}}}六、实验总结在程序设计方面,对串口通信的过程有了更深刻的理解和领会。

相关主题