基于STM32F103嵌入式實驗指導(dǎo)書_第1頁
基于STM32F103嵌入式實驗指導(dǎo)書_第2頁
基于STM32F103嵌入式實驗指導(dǎo)書_第3頁
基于STM32F103嵌入式實驗指導(dǎo)書_第4頁
基于STM32F103嵌入式實驗指導(dǎo)書_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、實驗一、STM32的開發(fā)環(huán)境與簡單工程一、實驗?zāi)康?、熟悉STM32開發(fā)板的開發(fā)環(huán)境;2、熟悉MDK創(chuàng)建和配置STM32工程項目的基本流程;3、熟悉STM32官方庫的應(yīng)用;4、規(guī)范編程格式。二、實驗內(nèi)容本次實驗配置MDK集成開發(fā)環(huán)境,新建一個簡單的工程文件,添加STM32官方庫并配置工程,編譯運行這個工程文件。下載已經(jīng)編譯好的文件到開發(fā)板中運行。學(xué)會在程序中設(shè)置斷點,觀察系統(tǒng)內(nèi)存和變量,為調(diào)試應(yīng)用程序打下基礎(chǔ)。三、預(yù)備知識基本單片機硬件知識、單片機軟件編程語言、程序創(chuàng)建和調(diào)試的基本方法。四、實驗設(shè)備及工具硬件:STM32開發(fā)平臺軟件:STM32官方庫;PC機操作系統(tǒng)Windows 98、Win

2、dows 2000或Windows XP;KEIL MDK集成開發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動。五、實驗步驟1、在準(zhǔn)備存放工程文件的目錄下創(chuàng)建一新文件夾,命名為Proj_GPIO;在Proj_GPIO文件夾里面分別再創(chuàng)建四個文件夾:CMSIS、USER、LIB、OBJ。如圖1。其中CMSIS(Cortex Microcontroller Software Interface Standard)用于存放Cortex-M 處理器系列的與供應(yīng)商無關(guān)的軟件抽象層和啟動相關(guān)的代碼文件;USER用于存放我們自己編寫的代碼文件(含自己移植的底層驅(qū)動),還有MDK工程;LIB存放所有的官方底層驅(qū)動庫文件;OBJ用于

3、工程輸出的過程文件和最終的二進制文件。圖12、將官方庫STM32F10x_StdPeriph_Lib_V3.5.0.rar解壓。1)把STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport下的所有文件和STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x下的所有文件都到第一步所創(chuàng)建的CMSIS文件夾中;2)把STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver目錄下的

4、文件(目錄inc和scr)復(fù)制到第一步創(chuàng)建的LIB文件夾中;3)把STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template目錄下的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三個文件復(fù)制到USER文件夾中。3、打開MDK軟件,新建一個工程Proj_GPIO保存到Proj_GPIO/USER中。CPU選擇STM32F103ZE,如圖2;圖24、新建一個空文檔main.c保存到USER中,然后根據(jù)絕對路徑將文件對應(yīng)添加到工程中,如右圖。5、配置工程屬性,右鍵點擊工程文件中的Ta

5、rget 1選擇Options for Target Target 1打開工程選項對話框。做如下修改:1)Output選項勾選Create HEX File,然后點擊Select Folder for Objects按鈕定位輸出文件保存目錄到工程的OBJ文件;2)Listing選項,同樣點擊Select Folder for Listings定位輸出文件保存目錄到工程的OBJ文件;3)C/C+選項,Define中填入STM32F10X_HD, USE_STDPERIPH_DRIVER系統(tǒng)的兩個基本宏定義;配置Include Paths屬性,加入工程中包含頭文件的目錄;如右圖4)后面Debug和

6、Utilities兩個選項如果使用J-link或者其他調(diào)試器則需要做對應(yīng)的修改,否則不用。6、根據(jù)實驗任務(wù)硬件原理圖編寫代碼實現(xiàn)四個按鍵控制led燈亮滅。1)其中用戶按鍵和LED原理圖如下:圖52)根據(jù)原理圖初始化各IO引腳,編寫控制函數(shù),然后主函數(shù)中調(diào)用。/* 函數(shù)名稱:io_init* 函數(shù)功能:初始化PA0 PE2 PE3 PE4為輸入口PE5 PB5為輸出口* 參數(shù): 無*/void io_init()GPIO_InitTypeDef gpin_init_struct;/使能每個IO口的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENA

7、BLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);gpin_init_struct.GPIO_Pin = GPIO_Pin_0;/PA0引腳gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;/IO速度為2MHzgpin_init_struct.GPIO_Mode = GPIO_Mode_IPD;/下拉模式GPIO_Init(GPIOA, &gpin_init_struct);

8、/A口按鍵gpin_init_struct.GPIO_Pin = GPIO_Pin_5;gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;gpin_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &gpin_init_struct);/B口led1 GPIO_Init(GPIOE, &gpin_init_struct);/E口led2 gpin_init_struct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;gpin_in

9、it_struct.GPIO_Speed = GPIO_Speed_2MHz;gpin_init_struct.GPIO_Mode = GPIO_Mode_IPU;/上拉模式GPIO_Init(GPIOE, &gpin_init_struct);/E口按鍵、/* 函數(shù)名稱: key_led* 函數(shù)功能: 根據(jù)按鍵情況控制led燈的亮滅 s1 s2控制led1;s3 s4控制led2* 參數(shù): 無* 其他:其中LED1_ON LED1_OFF LED2_ON LED2_OFF為全局宏定義*/void key_led()if(GPIO_ReadInputDataBit(GPIOE, GPI

10、O_Pin_4)=0)LED1_ON;if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)=0)LED1_OFF;if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)=0)LED2_ON;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)=1)LED2_OFF;#include "stm32f10x.h"#define LED2_ONGPIO_ResetBits(GPIOB, GPIO_Pin_5)#define LED2_OFFGPIO_SetBits(GPIOB, G

11、PIO_Pin_5)#define LED1_ONGPIO_ResetBits(GPIOE, GPIO_Pin_5)#define LED1_OFFGPIO_SetBits(GPIOE, GPIO_Pin_5)void io_init();void key_led();int main()io_init();while(1)key_led();3)代碼編寫完成后編譯鏈接,通過下載軟件將hex文件下載到實驗板中運行驗證。實驗二、ucos操作系統(tǒng)的移植一、實驗?zāi)康?、掌握ucos到STM32的移植方法;2、熟悉通過C語音處理底層寄存器的技巧;3、了解STM32在ucos任務(wù)切換時的處理;4、規(guī)范編

12、程格式。二、實驗內(nèi)容本次實驗通過用C語言編寫6個操作系統(tǒng)相關(guān)函數(shù)和用匯編語言編寫4個與處理器相關(guān)的函數(shù),將實時操作系統(tǒng)µC/OS-移植到芯片STM32F103ZE中,并創(chuàng)建兩個用戶任務(wù)點亮led。學(xué)會操作系統(tǒng)的移植方法,深入掌握嵌入式操作系統(tǒng)µC/OS-在初始化任務(wù)和任務(wù)調(diào)度的實現(xiàn)方法,直觀了解實時操作系統(tǒng)的體系結(jié)構(gòu)和設(shè)計思想。三、預(yù)備知識基本單片機硬件知識、單片機軟件編程語言、程序創(chuàng)建和調(diào)試的基本方法、ucos操作系統(tǒng)的任務(wù)調(diào)度原理、STM32的寄存器架構(gòu)。四、實驗設(shè)備及工具硬件:STM32開發(fā)平臺軟件:STM32官方庫;PC機操作系統(tǒng)Windows 98、Windows

13、 2000或Windows XP;KEIL MDK集成開發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動。五、實驗步驟1、按實驗一的步驟新建一個工程Proj2_ucos。2、將移植好的ucos源代碼整個拷貝到我們的新建的工程目錄中,然后按對應(yīng)的文件路徑添加到keil工程里(os_dbg.c和os_dbg_r.c只添加一個),如圖6和圖7。圖6 圖73、配置工程相關(guān)屬性(與實驗一庫應(yīng)用配置一樣),記得將ucos的頭文件路徑添加到工程的include path上面去,找到stm2f10x_it.c的PendSV_Handler函數(shù)注釋掉,main文件中將includes.h包含進來,主函數(shù)為空,編譯通過。4、在main.

14、c中建立sys_init()函數(shù)編寫操作系統(tǒng)運行需要的硬件相關(guān)初始化(見代碼),然后修改stm32f10x_it.c中的系統(tǒng)心跳中斷函數(shù)并加入頭文件includes.h(見代碼,)。/* 函數(shù)名稱:sys_init* 函數(shù)功能:嵌套向量中斷優(yōu)先級分組,時鐘心跳定時初始化1/200 s* 參數(shù): 無*/void sys_init()NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SysTick_Config(SystemCoreClock/200);/* * brief This function handles SysTick Handler. *

15、 param None * retval None */void SysTick_Handler(void)OSIntEnter();OSTimeTick();OSIntExit();5、編寫用戶任務(wù)函數(shù)和相關(guān)的初始化。/* 函數(shù)名稱: led_init* 函數(shù)功能: 初始化LED* 參 數(shù): * 其 他:*/void led_init()GPIO_InitTypeDef gpin_init_struct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);gpin_init_struct.GPIO

16、_Pin = GPIO_Pin_5;gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;gpin_init_struct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &gpin_init_struct);/B口led1 GPIO_Init(GPIOE, &gpin_init_struct);/E口led2 /* 函數(shù)名稱: my_task* 函數(shù)功能: 用戶任務(wù)* 參 數(shù): * 其 他:*/void my_task()sys_init();led_init();OSStatInit();wh

17、ile(1)LED1_ON;LED2_OFF;OSTimeDly(50);LED1_OFF;LED2_ON;OSTimeDly(100);6、最后在主函數(shù)中創(chuàng)建任務(wù)并啟動操作系統(tǒng)。編譯并調(diào)試運行。#include "stm32f10x.h"#include "includes.h"#define LED2_ONGPIO_ResetBits(GPIOB, GPIO_Pin_5)#define LED2_OFFGPIO_SetBits(GPIOB, GPIO_Pin_5)#define LED1_ONGPIO_ResetBits(GPIOE, GPIO_Pi

18、n_5)#define LED1_OFFGPIO_SetBits(GPIOE, GPIO_Pin_5)OS_STK task_stk128;void my_task(void);void led_init(void);void sys_init(void);int main()OSInit();OSTaskCreate(my_task, (void *)0, (OS_STK *)&task_stk127, 10);OSStart();while(1);實驗三、ucos操作系統(tǒng)的任務(wù)通信一、實驗?zāi)康?、掌握ucos任務(wù)間通信的各種方法;2、了解嵌入式操作系統(tǒng)任務(wù)間可能出現(xiàn)的資源沖突;3、

19、掌握ucos中信號量和郵箱的應(yīng)用;4、規(guī)范編程格式。二、實驗內(nèi)容本次實驗通過用C語言編寫基于ucos操作系統(tǒng)下的多個用戶任務(wù),并且實現(xiàn)任務(wù)間的正確通信。通過信號量處理公共資源的等待和使用,通過郵箱實現(xiàn)任務(wù)間的多個數(shù)據(jù)變量的傳遞。建立正確的操作系統(tǒng)編程理念,深入掌握µC/OS-中信號量與郵箱的創(chuàng)建和使用,了解各任務(wù)間通信方法的大概原理及優(yōu)缺點。三、預(yù)備知識基本單片機硬件知識、單片機軟件編程語言、程序創(chuàng)建和調(diào)試的基本方法、ucos操作系統(tǒng)的任務(wù)調(diào)度原理。四、實驗設(shè)備及工具硬件:STM32開發(fā)平臺。軟件:STM32官方庫;PC機操作系統(tǒng)Windows 98、Windows 2000或Win

20、dows XP;KEIL MDK集成開發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動。五、實驗步驟1、建立基于操作系統(tǒng)µC/OS-的工程Proj3_ucos1,并配置好工程各項屬性。2、創(chuàng)建用戶任務(wù)文件task.c和task.h兩個文件,詳細(xì)代碼如下。/task.c文件代碼#include "task.h"INT32U NUM_COUNT1;INT32U NUM_COUNT2;void test_sem(void);void my_task()while(1)test_sem();void test_sem()INT8U sem_err;INT32U tmp;tmp = NUM_COU

21、NT1;OSTimeDlyHMSM(0,0,0,50);/用延時代替任務(wù)的其他任務(wù)tmp+;NUM_COUNT1 = tmp;OSSemPend(NUM_COUNT, 500, &sem_err);tmp = NUM_COUNT2;OSTimeDlyHMSM(0,0,0,50);/用延時代替任務(wù)的其他任務(wù)tmp+;NUM_COUNT2 = tmp;OSSemPost(NUM_COUNT);/task.h文件代碼#ifndef _MY_TASK_H#define _MY_TASK_H#include "includes.h"extern OS_EVENT *NUM_C

22、OUNT;extern void my_task(void);#endif代碼中,在task1.c中定義兩個全局變量NUM_COUNT1和NUM_COUNT2,兩個變量在my_task函數(shù)里用于記錄該任務(wù)循環(huán)的總次數(shù),區(qū)別在與NUM_COUNT1直接操作,而NUM_COUNT2則通過信號量的方法進行操作。3、在main函數(shù)中初始化操作系統(tǒng)后創(chuàng)建一個信號量NUM_COUNT,然后用OSTaskCreate創(chuàng)建兩個任務(wù),優(yōu)先級分別是8和9,兩個任務(wù)的入口地址都是task1.c文件中的my_task函數(shù)。NUM_COUNT = OSSemCreate(1);/創(chuàng)建一個信號量OSTaskCreate(

23、my_task, (void *)0, (OS_STK *)&task1_stkSIZE_STK-1, 9);OSTaskCreate(my_task, (void *)0, (OS_STK *)&task2_stkSIZE_STK-1, 8);4、編譯通過后調(diào)試,在debug界面中,將NUM_COUNT1,NUM_COUNT2兩個全局變量加入到變量觀察窗口watch1中,然后在task.c的my_task函數(shù)里面設(shè)置斷點,運行并觀察兩個變量的變化,理解信號量的使用。5、關(guān)于操作系統(tǒng)郵箱的應(yīng)用由例子工程Proj3_ucos2實現(xiàn),請自行理解代碼。實驗四、ucos操作系統(tǒng)的文件系

24、統(tǒng)實現(xiàn)一、實驗?zāi)康?、了解文件系統(tǒng)FATFS的基本實現(xiàn)原理;2、掌握FATFS的移植步驟;3、掌握基于ucos中FATFS的應(yīng)用;4、掌握STM32對SD卡的讀寫操作;5、規(guī)范編程格式。二、實驗內(nèi)容本實驗實現(xiàn)將FAT文件系統(tǒng)移植到ucos中,并基于ucos的文件系統(tǒng)編寫用戶任務(wù)進行測試,通過對文件系統(tǒng)的移植實驗深入掌握對嵌入式相關(guān)驅(qū)動移植的基本步驟,建立正確的嵌入式操作系統(tǒng)驅(qū)動移植理念,并且熟悉掌握ucos操作系統(tǒng)下的文件系統(tǒng)的基本應(yīng)用,了解其優(yōu)缺點。三、預(yù)備知識基本單片機硬件知識、單片機軟件編程語言、程序創(chuàng)建和調(diào)試的基本方法、ucos操作系統(tǒng)的任務(wù)調(diào)度原理、STM32單片機中的SD卡驅(qū)動、文

25、件系統(tǒng)的操作函數(shù)、FAT文件系統(tǒng)的基礎(chǔ)知識。四、實驗設(shè)備及工具硬件:STM32開發(fā)平臺。軟件: PC機操作系統(tǒng)Windows 98、Windows 2000或Windows XP;KEIL MDK集成開發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動;STM32官方庫;FATFS的官方庫;STM32的uart驅(qū)動和SD卡驅(qū)動源碼。五、實驗步驟1、拷貝實驗三的所有代碼到新的目錄地下,刪除USER和OBJ文件夾里工程相關(guān)的文件,重新建立實驗四的工程并命名為Proj4_FATFS,配置好工程各項屬性。2、在USER文件夾里面創(chuàng)建文件夾myapp,將串口驅(qū)動uart和SD卡驅(qū)動sdio_sdcard的源代碼拷貝到該文件夾里面

26、,并添加到工程中USER。3、拷貝FAT文件系統(tǒng)源碼到myapp文件夾。在keil的工程中增加一個文件夾FATFS并添加diskio.c、ff.c、cc936.c三個文件到里面,如右圖。4、嘗試編譯字符表文件cc936.c可能發(fā)現(xiàn)出錯:#error directive: This file is not needed in current configuration. 這是因為在ff.h中_CODE_PAGE這個宏的定義值不是936和長文件名宏定義_USE_LFN的值不是1導(dǎo)致的。修改成對應(yīng)的值后該文件的編譯即可通過(如果用其他字符表文件同理)。5、移植FAT文件系統(tǒng)需要做的事情。1)FATF

27、S是一個通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實現(xiàn)FAT文件系統(tǒng)。 FatFs 的編寫遵循ANSI C,因此不依賴于硬件平臺。它可以嵌入到便宜的微控制器中,如 8051,PIC,AVR,SH,Z80,H8,ARM等等,不需要做任何修改。FATFS源代碼的獲取,可以到官網(wǎng)下載/fsw/ff/00index_e.html; 解壓文件會得到兩個文件夾,一個是doc文件夾,保存FATFS的一些使用文檔和說明。另一個是src文件夾,保存代碼源文件。FAT文件系統(tǒng)源碼和sd卡讀寫的底層驅(qū)動。2)移植FAT文件系統(tǒng)只需根據(jù)硬件中可能接入的物理存儲模塊對文件系統(tǒng)的底層I

28、O驅(qū)動(diskio.c)進行修改,具體需要修改的函數(shù)有:DSTATUS disk_initialize (BYTE);/存儲介質(zhì)的初始化DSTATUS disk_status (BYTE);/讀取存儲介質(zhì)的狀態(tài)DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);/讀取數(shù)據(jù)DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);/寫入數(shù)據(jù)DRESULT disk_ioctl (BYTE, BYTE, void*);/讀取存儲介質(zhì)文件系統(tǒng)相關(guān)信息DWORD get_fattime (void);/返回文件系統(tǒng)的

29、時間3)diskio.c文件中添加頭文件sdio_sdcard.h、ff.h,增加SD卡的驅(qū)動號0如下:/* Correspondence between physical drive number and physical drive. */#define SD_CARD0#define ATA1#define MMC2#define USB34)diskio.c五個函數(shù)具體代碼:DSTATUS disk_initialize (BYTE drv/* Physical drive nmuber (0.) */)switch(drv)case SD_CARD:/SD卡if(SD_Init()

30、= SD_OK)return RES_OK;elsereturn RES_NOTRDY;return RES_NOTRDY;DSTATUS disk_status (BYTE drv/* Physical drive nmuber (0.) */)switch(drv)case SD_CARD:/SD卡if(SD_GetStatus() = SD_TRANSFER_ERROR)return STA_NOINIT;elsereturn STA_PROTECT;default:return STA_NODISK;DRESULT disk_read (BYTE drv,/* Physical dri

31、ve nmuber (0.) */BYTE *buff,/* Data buffer to store read data */DWORD sector,/* Sector address (LBA) */BYTE count/* Number of sectors to read (1.255) */)switch (drv) case SD_CARD :for(;count>0;count-)if(SD_ReadBlock(buff, sector<< 9, _MAX_SS) != SD_OK)break;sector+;buff+=_MAX_SS;/* Wait unt

32、il end of DMA transfer */SD_WaitReadOperation(); /* Check if the Transfer is finished */while(SD_GetStatus() != SD_TRANSFER_OK);if(count = 0)return RES_OK;elsereturn RES_ERROR;default:return RES_NOTRDY;#if _READONLY = 0DRESULT disk_write (BYTE drv,/* Physical drive nmuber (0.) */const BYTE *buff,/*

33、Data to be written */DWORD sector,/* Sector address (LBA) */BYTE count/* Number of sectors to write (1.255) */)switch (drv) case SD_CARD :for(;count>0;count-)if(SD_WriteBlock(uint8_t *)buff,sector<<9, _MAX_SS) != SD_OK)break;sector+;buff+=_MAX_SS;/* Wait until end of DMA transfer */SD_WaitW

34、riteOperation(); /* Check if the Transfer is finished */while(SD_GetStatus() != SD_TRANSFER_OK);if(count = 0)return RES_OK;elsereturn RES_ERROR;default:return RES_NOTRDY;#endif /* _READONLY */ disk_ioctl 和 get_fattime 兩個函數(shù)暫時可以不實現(xiàn) 直接返回DRESULT disk_ioctl (BYTE drv,/* Physical drive nmuber (0.) */BYTE

35、ctrl,/* Control code */void *buff/* Buffer to send/receive control data */)return RES_NOTRDY;#if !_FS_READONLY/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */DWORD get_fattime (void)return 0;#endif5)對于最底層(物理層)對SD卡

36、的具體初始化和讀寫操作,STM32有SPI和SDIO兩種方式實現(xiàn),實際應(yīng)用中根據(jù)硬件電路條件選擇。在沒有SPI外設(shè)的單片機中也可以通過IO口模擬SPI協(xié)議。(具體實現(xiàn)代碼略,詳見工程文件中的 sdio_sdcard.c 和 sdio_sdcard.h )6)修改task.c進行文件系統(tǒng)的測試應(yīng)用。在測試FAT文件系統(tǒng)之前,首先應(yīng)該確保對底層SD卡的讀寫驅(qū)動正確。所以第一步通過直接調(diào)用SD卡驅(qū)動函數(shù)實現(xiàn)對SD卡進行初始化檢測和基本的讀寫操作,具體代碼如下:void test_SD()SD_CardInfo SDCardInfo;INT16U i;printf("SD卡驅(qū)動函數(shù)測試程序n

37、r");while(SD_Init()/內(nèi)存卡檢測錯誤printf("內(nèi)存卡檢測錯誤nr");OSTimeDly(200);printf("內(nèi)存卡檢測成功!nr");SD_GetCardInfo(&SDCardInfo);printf("sdcard size is: %unr", SDCardInfo.CardCapacity>>22);if(SD_ReadBlock(RxBuffer, 0, 512) = SD_OK)for(i=0; i<512; i+)printf("%X &quo

38、t;, RxBufferi);7)如果上一步能初始化并檢測出SD卡的大小,讀出前512個字節(jié)的數(shù)據(jù),則說明SD卡和驅(qū)動函數(shù)都正常。下一步設(shè)計一個FAT測試函數(shù):實現(xiàn)檢測TEST.txt文件是否存在,存在則讀取文件中的前100個字節(jié)內(nèi)容并串口輸出;然后打開TEST2.txt文件(不存在則創(chuàng)建)寫入讀取到的內(nèi)容(沒有內(nèi)容則寫入“is no file TEST.txt!”);打開TEST2.txt讀取文件中的前100個字節(jié)內(nèi)容并串口輸出。具體代碼如下。void test_FAT()FATFS fs;FIL f_1, f_2;INT32U read_count=21;FRESULT error;err

39、or = f_mount(0, &fs);/掛載SD卡error = f_open(&f_1, "TEST.txt", FA_OPEN_EXISTING|FA_READ);if(error=FR_OK)error = f_read(&f_1, RxBuffer, BUFFER_SIZE, &read_count);printf("nrread the file: TEST.txt nr");printf("read 100 bytes, then return %d bytes! nr", read_c

40、ount);printf("the data is :nr");printf(char*)RxBuffer);error = f_close(&f_1); error = f_open(&f_2, "TEST2.txt", FA_OPEN_ALWAYS|FA_WRITE);printf("nrwrite test2.txt %d words!nr", read_count);error = f_write(&f_2, RxBuffer, read_count, &read_count);if(error

41、=FR_OK)printf("write OK ! %d words are writednr", read_count);elseprintf("write errornr");error = f_close(&f_2); error = f_open(&f_1, "TEST2.txt", FA_OPEN_EXISTING|FA_READ);if(error=FR_OK)error = f_read(&f_1, RxBuffer, BUFFER_SIZE, &read_count);printf(&q

42、uot;nrread the file: TEST2.txt nr");printf("read 100 bytes, then return %d bytes! nr", read_count);printf("the data is :nr");printf(char*)RxBuffer);error = f_close(&f_1); 8)至此,我們已經(jīng)將FATFS移植成功了,下面我們設(shè)計一個基于ucos的文件系統(tǒng)應(yīng)用實驗,實現(xiàn)在用戶中檢測是否有SD卡插入,如果有則任務(wù)沒循環(huán)一次在SD卡中的文件mytask.txt的末尾寫入一句“這

43、是本任務(wù)的第xx次循環(huán)”,然后在主函數(shù)中創(chuàng)建兩個以上的該任務(wù)的線程(這里需要注意實驗三的資源沖突問題!)。9)具體代碼,詳見實例工程!*擴展知識1:在本工程中的SD底層驅(qū)動中,因為用32位存儲SD卡的容量大小,所以最大只能識別到4GB,如果采用大于4G的卡進行測試則讀出的容量是錯誤的。*擴展知識2:對于FAT32的MBR區(qū)不一定是在0扇區(qū)中。*擴展知識3:配置ff.h(可能是ffconf.h)文件中 _USE_STRFUNC 宏定義為1,可以使用f_putc、f_puts、f_printf、f_gets、f_eof、f_error 等函數(shù)實驗五、基于ucos操作系統(tǒng)的網(wǎng)絡(luò)模塊一、實驗?zāi)康?、了

44、解W5500網(wǎng)絡(luò)模塊的基本實現(xiàn)原理;2、掌握ucos下網(wǎng)絡(luò)底層庫的移植步驟;3、掌握基于ucos的網(wǎng)絡(luò)編程TCP、UDP思路;4、了解嵌入式軟件設(shè)計的分層思路;二、實驗內(nèi)容本實驗通過STM32的SPI協(xié)議讀寫W5500網(wǎng)絡(luò)模塊,移植網(wǎng)絡(luò)協(xié)議驅(qū)動到ucos嵌入式操作系統(tǒng),并通過編寫ucos操作系統(tǒng)的應(yīng)用任務(wù)實現(xiàn)實驗板和上位機的網(wǎng)絡(luò)通信。了解基于網(wǎng)絡(luò)通信的嵌入式軟件設(shè)計的思路。三、預(yù)備知識本實驗要求學(xué)生具備基本的C語言讀寫能力、基本單片機軟硬件知識、了解SPI協(xié)議、了解基礎(chǔ)的網(wǎng)絡(luò)協(xié)議應(yīng)用、ucos操作系統(tǒng)的用戶任務(wù)設(shè)計能力四、實驗設(shè)備及工具硬件:STM32開發(fā)平臺、PC機軟件: keilMDK編程環(huán)境、串口轉(zhuǎn)usb驅(qū)動、STM32官方庫、移植好的ucos源碼、基于STM32的SPI驅(qū)動庫、基于STM32的uart驅(qū)動庫、W5500網(wǎng)絡(luò)模塊驅(qū)動庫、五、實驗步驟1、了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論