嵌入式系统实验报告 - 图文

更新时间:2024-04-01 02:01:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验报告

课程名称: 学 院: 专 业: 班 级: 学生姓名: 学 号: 指导教师: 开课时间:

嵌入式系统 信息工程 电子信息工程

学年 第一 学期

实验名称: 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中输入相应的代码。 1

(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所示:

2

图1.3

五、实验源程序

相关代码如下所示: (1) led.c文件 #include \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 \//LED 端口定义

#define LED0 PFout(9) // DS0 #define LED1 PFout(10) // DS1 void LED_Init(void); //初始化 #endif

(3)main函数

#include \#include \#include \3

int main(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)编写代码时,注意格式和符号,在英文环境下输入。

4

实验名称: 触摸屏 实验时间: 11.23 一、 实验目的 1. 掌握触摸屏的工作原理。 2. 通过外接带触摸屏的LCD模块,来实现触摸屏控制。 3. 通过对电阻触摸和电容触摸的学习,实现触摸屏驱动,最终实现一个手写板的功能。 实验成绩: 二、实验原理 电阻式触摸屏原理:当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器检测到这个接通点并计算出X、Y轴的位置。 特点:精度高、价格便宜、抗干扰能力强、稳定性好; 易被划伤、透光性差、不支持多点触摸。 电容式触摸屏原理:利用人体的电流感应进行工作。当手指触摸金属层时,由于人体电场,用户和触摸屏表面形成一个耦合电容。对于高频电流来说电容是直接导体,于是手指从接触点吸走一个很小的电流。这个电流分别从触摸屏的4个角的电极流出,并且流经4个电极的电流与手指到4角的距离成正比。控制器通过对电流比例的计算,得到触摸点的位置。 特点:手感好、无需校正、透光性好、支持多点触摸; 成本高、精度不高、抗干扰力差。 三、实验资源 实验器材:探索者STM32F4开发板 硬件资源:1、DS0(连接在PF9) 2、串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面) 3、ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过FSMC驱动,FSMC_NE4接LCD 片选/A6 接RS) 4、按键KEY0(PE4) 四、实验内容及步骤 1.硬件设计 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

图2.3

五、实验源程序

(1)main函数

int main(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,\LCD_ShowString(30,70,200,16,16,\LCD_ShowString(30,90,200,16,16,\LCD_ShowString(30,110,200,16,16,\

if(tp_dev.touchtype!=0XFF)LCD_ShowString(30,130,200,16,16,\

3

Adjust\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]

{

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 ==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++)

4

{ 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(); //清除 } }

}else lastpos[t][0]=0XFFFF; }

delay_ms(5);i++;

if(i ==0)LED0=!LED0; } }

六、实验总结

基本达到实验的要求,了解触摸屏基本概念与原理,以及通过编程实现对触摸屏的控制,以及知道如何验证实验结果是否属于预期目标,并了解实验原理,为今后嵌入式的学习打下一定的学习基础。

七、预习思考题

八、注意事项

(1)新建文件夹时,区分不同的文件夹之间的关系。 (2)编写代码时,注意格式和符号,在英文环境下输入。

5

实验名称: 串口通信 实验时间: 11.30 一、实验目的 1.了解STM32F4串口。 2.掌握如何使用STM32F4的串口来发送和接收数据。 3.学会如何初始化串口。 4.掌握串口编程与调试方法。 实验成绩: 二、实验原理 串行通信需要将传输的数据分解成二进制位,然后采用一条信号线将多个二进制数据位按一定的时间和顺序,逐位由信息发送端传到信息的接收端。根据数据的传输方向和发送接收是否能同时进行,数据传输的工作方式分为单工方式,半双工方式和全双工方式。 单工通信是指信息只能单方向传输的工作方式,发送端和接收端的方向是固定的。 半双工通信方式可以实现双向的通信,不能在两个方向上同时进行工作,但可以轮流交替地进行通信,即通信信道的任意端,既可以是发送端也可以是接收端。 全双工通信方式是指在通信的任意时刻,允许数据同时在两个方向上传输,即通信双方可以同时发送和接收数据。 三、实验资源 实验器材: 探索者STM32F4开发板 硬件资源: a. DS0(连接在PF9) b. 串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面) 1

四、实验内容及步骤

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:波特率 2

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=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; //串口发送使能 #if EN_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 \#include \#include \#include \int main(void) {

u8 t; u8 len;

u16 times=0;

Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz delay_init(168); //延时初始化

uart_init(84,115200); //串口初始化为 115200 LED_Init(); //初始化与 LED 连接的硬件接口 while(1)

3

{ if(USART_RX_STA&0x8000) {

len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf(\您发送的消息为:\\r\\n\for(t=0;t

USART1->DR=USART_RX_BUF[t];

while((USART1->SR&0X40)==0);//等待发送结束

}

printf(\插入换行 USART_RX_STA=0; }else {

times++;

if(timesP00==0)

{

printf(\探索者 STM32F407 开发板 串口实验\\r\\n\printf(\正点原子@ALIENTEK\\r\\n\\r\\n\\r\\n\}

if(times 0==0)printf(\请输入数据,以回车键结束\\r\\n\

if(times0==0)LED0=!LED0;//闪烁 LED,提示系统正在运行. delay_ms(10);

} } }

六、实验总结

在程序设计方面,对串口通信的过程有了更深刻的理解和领会。通过本次实验,使我对ARM嵌入式开发有了一定的掌握和理解,巩固了我在课程中所学的基本理论知识和实验技能,使我对嵌入式系统课程有了更深入的了解,熟悉了串口的使用,了解了内部功能模块及内核架构。

七、预习思考题

八、注意事项

(1)新建文件夹时,区分不同的文件夹之间的关系。 (2)编写代码时,注意格式和符号,在英文环境下输入。

4

5

实验名称: 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、ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过FSMC驱动,FSMC_NE4接LCD片选/A6接RS) 1

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

2

图4.3

五、实验源程序

1.RTC_Init //RTC 初始化

//返回值:0,初始化成功; // 1,LSE 开启失败;

// 2,进入初始化模式失败; u8 RTC_Init(void) {

3

u16 retry=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)return 1; //LSE 开启失败.

RCC->BDCR|=1<<8; //选择 LSE,作为 RTC 的时钟 RCC->BDCR|=1<<15; //使能 RTC 时钟 //关闭 RTC 寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53;

if(RTC_Init_Mode())return 2; //进入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_Set_WakeUp(4,0); //配置 WAKE UP 中断,1 秒钟中断一次 return 0;

}

2.int main(void) {

u8hour,min,sec,ampm; u8 year,month,date,week; u8 tbuf[40]; u8 t=0;

Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz delay_init(168); //延时初始化

uart_init(84,115200); //初始化串口波特率为 115200 usmart_dev.init(84); //初始化 USMART LED_Init(); //初始化 LED LCD_Init(); //初始化 LCD RTC_Init(); //初始化 RTC

4

RTC_Set_WakeUp(4,0); //配置 WAKE UP 中断,1 秒钟中断一次 POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,\LCD_ShowString(30,70,200,16,16,\LCD_ShowString(30,90,200,16,16,\ LCD_ShowString(30,110,200,16,16,\ while(1) {

t++;

if((t)==0) //每 100ms 更新一次显示数据 {

RTC_Get_Time(&hour,&min,&sec,&m);

sprintf((char*)tbuf,\LCD_ShowString(30,140,210,16,16,tbuf); RTC_Get_Date(&year,&month,&date,&week);

sprintf((char*)tbuf,\LCD_ShowString(30,160,210,16,16,tbuf); sprintf((char*)tbuf,\

LCD_ShowString(30,180,210,16,16,tbuf); }

if((t )==0)LED0=!LED0; //每200ms,翻转一次 LED0 delay_ms(10); } }

六、实验总结

通过这次实验,我学会了USMART调试组件的功能,串口调用相关函数,了解了STM32F4的内部实时时钟的硬件控制原理及设计方法,以及使用LCD模块来显示日期和时间,实现一个简单的实时时钟。实验中,下载编程时遇到了一些问题,在老师的帮助下解决了,同时还巩固了知识,实验出真知,实验也是另一种学习的途径。

七、预习思考题

八、注意事项

(1)新建文件夹时,区分不同的文件夹之间的关系。 (2)编写代码时,注意格式和符号,在英文环境下输入。

5

实验名称: μCOSII实验--任务调度 实验时间: 12.14 一、实验目的 1.了解UCOSII(实施多任务操作系统的内核)的使用与工作原理 2.运用嵌入式相关知识实现该试验所要达到的效果,让led0和led1交替闪烁 实验成绩: 二、实验原理 该实验中要用到的UCOSII是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务内核,具有高度可移植性的实时操作系统。 UCOSII的基本功能是多任务进行调度管理,让这些工作可以并发工作,并发不是同时占用,只是各任务轮流占用CPU。 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态和中断服务状态。这5种状态可相互转换。 在STM32F4上面运行UCOSII的步骤: 1)移植UCOSII 2)编写任务函数并设置其堆栈大小和优先级等参数 3)初始化UCOSII,并在UCOSII中创建任务 4)启动UCOSII 三、实验资源 硬件资料: 1)指示灯DS0、DS1 四、实验内容及步骤 1. 硬件设计 本章我们在UCOSII里面创建3个任务:开始任务、LED0任务和LED1任务,开始任务用于创建其他(LED0和LED1)任务,之后挂起:LED0任务用于控制DS0的亮灭,DS0每秒亮80ms;LED1任务用于控制DS1的亮灭,DS1亮300ms,灭300ms,依次循环。 2. 软件设计 本次实验在实验1的基础上进行修改,在该工程源码下面加入UCOSII文件夹,存放UCOSII三个文件夹下的源码,并将这三个文件夹加入头文件包含路径,最后得到工程如下图5.1所示: 1

图5.1 本章中,我们对os_cfg.h里面定义OS_TICKS_PER_SEC的值为200,也就是设置UCOSII的时钟节拍为5ms,同时设置OS_MAX_TASKS为10,也就是最多10个任务(包括空闲任务和统计任务在内)。另外,我们还需要在sys.h里面设置SYSTEM_SUPPORT_UCOS为1,以支持UCOSII,通过这个设置,我们不仅可以实现利用delay_init来初始化SYSTICK,产生UCOSII的系统时钟节拍,还可以让delay_us和delay_ms函数在UCOSII下能够正常使用,这就使得我们之前的代码,可以十分方便的移植到UCOSII下。

在test.c中创建了3个任务:start_task、led0_task和led1_task。在start_task任务中,我们在创建led0_task和led1_task的时候,不希望中断打扰,故使用了临界区,注意这里使用的延时函数是delay_ms,而不是直接使用的OSTimeDly。

另外,一个任务里面一般是必须有延时函数的,以释放CPU使用权,否则可能导致低优先级的任务因高优先级的任务不释放CPU使用权而一直无法得到CPU使用权,从而无法运行。 3.下载验证

使用 flymcu 下载(也可以通过JLINK等仿真器下载),如图 5.2所示:

运行结果如图5.3所示:

图5.2

图5.3

五、实验源程序

1)test.c

int main(void) {

Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz

delay_init(168); //初始化延时函数 LED_Init(); //初始化LED时钟 2

OSInit(); //初始化UCOSII OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务

OSStart(); //启动UCOSII }

void start_task(void *pdata) {

OS_CPU_SR cpu_sr=0; pdata = pdata;

OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)

OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);

OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);

OSTaskSuspend(START_TASK_PRIO); //挂起起始任务.

OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) }

void led0_task(void *pdata) { while(1) {

LED0=0;

delay_ms(80); LED0=1;

delay_ms(920); }; }

void led1_task(void *pdata) {

while(1) {

LED1=0;

delay_ms(300); LED1=1;

delay_ms(300); }; }

2)os_cfg.h

#ifndef OS_CFG_H #define OS_CFG_H

#define OS_APP_HOOKS_EN 0u /* Application-defined hooks are called from the uC/OS-II hooks */

#define OS_MAX_QS 5u /* Max. number of queue control blocks in your application */

3

#define OS_MAX_TASKS 10u /* Max. number of tasks in your application, MUST be >= 2 */

#define OS_SCHED_LOCK_EN 1u /* Include code for OSSchedLock() and OSSchedUnlock() */

#define OS_TICK_STEP_EN 1u /* Enable tick stepping feature for uC/OS-View */

#define OS_TICKS_PER_SEC 200u /* Set the number of ticks in one second */

2) led.c

#include \

//初始化PF9和PF10为输出口.并使能这两个口的时钟 //LED IO初始化

void LED_Init(void) {

RCC->AHB1ENR|=1<<5;//使能PORTF时钟

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关闭 }

六、实验总结

在了解了基础知识之后,我开始进行上机操作,当然,其中遇到很多的难题,很多东西都是第一次接触,又没有别人在旁边指导操作,完全凭借自己去摸索练习。其中的困难可想而知。然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的。可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰。它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,只有真正下功夫去学习,才能有收获,正所谓一份耕耘,一份收获。没有付出,何谈回报呢?再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的不足,继而去排除解决问题,这就是一个自我学习的过程。当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆。

七、预习思考题

八、注意事项

4

本文来源:https://www.bwwdw.com/article/35mr.html

Top