1、一、实验目的1熟悉STM32F4串口硬件控制器及相应寄存器,基于STM硬件基库编写串口驱动程序,实现串口与PC机通信。二、实验内容1. 学习STM32F4 USART硬件模块;2. 基于提供的stm32f4xx_usart.h和stm32f4xx_usart.c文件,编写main.c文件,实现与PC机之间通过串口数据收发功能。三、预备知识C语言的基础知识,ARM-MDK程序调试的基础知识和方法。四、实验设备及工具硬件:ALIENTEK探索者STM32F4开发板、ST-Link调试器、PC机、串口连接线。软件:PC 机Windows操作系统、ARM MDK5集成开发环境、仿真器驱动程序、超级终端
2、通讯程序。五、实验步骤1USART硬件模块学习2USART驱动代码学习2.1 printf 函数支持2.2 uart_init函数2.3 USART1_IRQHandler函数3. main() 参考代码结果:开始程序,灯亮。实验四 uCOS-II嵌入式实时操作系统实验1了解uCOS-II嵌入式实时操作系统原理,能够编写简单应用程序。1. 学习uCOS-II基本概念,Task调度机制,信号量机制;2. 基于提供的uCOS-II基础工程代码,添加信号量功能,使得开发板开机后led1熄灭,led0闪烁led0 10次后熄灭,led1接着闪烁10次后led0再闪烁,如此反复。C 语言的基础知识,AR
3、M-MDK程序调试的基础知识和方法,RTOS嵌入式实时操作系统基本概念。1. uCOS-II基础知识学习UCOSII是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,UCOSII最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。UCOSII构思巧妙。结构简洁精练,可读性强,同时又具备了实时操作系统的全部功能,虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系统的朋友,可以说是麻雀虽
4、小,五脏俱全。UCOSII(V2.91版本)体系结构如图4.1所示:图4.1 UCOSII体系结构图UCOSII的每个任务都是一个死循环。每个任务都处在以下 5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。UCOSII任务的5个状态转换关系如图61.1.2所示:图61.1.2 UCOSII任务状态转换关系接下来,我们看看在UCOSII中,与任务相关的几个函数:1)建立任务函数OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。2)任务删除函数INT8
5、U OSTaskDel(INT8U prio);3)请求任务删除函数INT8U OSTaskDelReq(INT8U prio);4)改变任务的优先级函数INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio);5)任务挂起函数INT8U OSTaskSuspend(INT8U prio);6)任务恢复函数INT8U OSTaskResume(INT8U prio);7)任务信息查询INT8U OSTaskQuery(INT8U prio,OS_TCB *pdata);UCOSII与任务相关的函数我们就介绍这么多。最后,我们来看看在STM32F4上
6、面运行UCOSII的步骤:1)移植UCOSII 2)编写任务函数并设置其堆栈大小和优先级等参数。3)初始化UCOSII,并在UCOSII中创建任务4)启动UCOSII 2. 添加信号量功能接下来我们看看在UCOSII中,与信号量相关的几个函数(未全部列出,下同)。1)创建信号量函数OS_EVENT*OSSemCreate (INT16U cnt);2)请求信号量函数voidOSSemPend ( OS_EVENT *pevent,INT16U timeout, INT8U *err);3)发送信号量函数INT8UOSSemPost(OS_EVENT *pevent);4)删除信号量函数OS_E
7、VENT*OSSemDel (OS_EVENT *pevent,INT8U opt, INT8U *err)六、实验代码#include sys.hdelay.husart.hled.hincludes.hvoid start_task(void *pdata); #define LED0_TASK_PRIO 7 #define LED0_STK_SIZE 64OS_STK LED0_TASK_STKLED0_STK_SIZE;void led0_task(void *pdata);#define LED1_TASK_PRIO 6 #define LED1_STK_SIZE 64OS_STK
8、LED1_TASK_STKLED1_STK_SIZE;void led1_task(void *pdata);int main(void) delay_init(168); LED_Init(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STKSTART_STK_SIZE-1,START_TASK_PRIO ); OSStart();void start_task(void *pdata) OS_CPU_SR cpu_sr=0; pdata = pdata; OS_ENTER_CRITICAL(); l
9、ed0_led1=OSSemCreate(0); led1_led0=OSSemCreate(1); OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STKLED0_STK_SIZE-1,LED0_TASK_PRIO); OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STKLED1_STK_SIZE-1,LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); OS_EXIT_CRITICAL(); /LED0void led0_task
10、(void *pdata)int t; while(1) OSSemPend(led0_led1,0,0); for(t=0;t10;t+) LED0=0; delay_ms(80); LED0=1; delay_ms(92); OSSemPost(led1_led0); ;void led1_task(void *pdata) OSSemPend(led1_led0,0,0); LED1=0; delay_ms(300); LED1=1; OSSemPost(led0_led1);心得体会:在做B205的实验过程中,掌握了一部分创建嵌入式开发环境的流程,学习了串口通信,ADC转换及uCOS-II嵌入式实时操作系统,了解了STM32F4串口硬件控制器及相应寄存器。虽然只是了解皮毛,可能很多东西还不明白,但经过对程序的理解和对相应软件的应用,对嵌入式开发产生了兴趣,学会了简单应用程序的编写,对概念有更加深刻的认识。“兴趣是最好的老师”,相信在这两节课的引导下,在以后遇到这类情形时能更好地处理,更能激发学习兴趣和动手能力。