基于STM32F103嵌入式實(shí)驗(yàn)指導(dǎo)書_第1頁(yè)
基于STM32F103嵌入式實(shí)驗(yàn)指導(dǎo)書_第2頁(yè)
基于STM32F103嵌入式實(shí)驗(yàn)指導(dǎo)書_第3頁(yè)
基于STM32F103嵌入式實(shí)驗(yàn)指導(dǎo)書_第4頁(yè)
基于STM32F103嵌入式實(shí)驗(yàn)指導(dǎo)書_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余18頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

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

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

3、動(dòng)庫(kù)文件;OBJ用于工程輸出的過(guò)程文件和最終的二進(jìn)制文件。+ 充蛀游 Projl GPSD ,,ste - j7斯CMSIS2U16/SA193A LEEM16/SAma* MJM16/1A2016/1圖12、將官方庫(kù) STM32F10x_StdPeriph_Lib_V350.rar解壓。1)把 STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport 下的所有文件和STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x下的所有文件都到第一步所創(chuàng)建

4、的CMSIS文件夾中;2)把 STM32F10x_StdPeriph_Lib_V350LibrariesSTM32F10x_StdPeriph_Driver目錄下的文件(目錄inc和scr)復(fù)制到第一步創(chuàng)建的LIB文件夾中;3)把 STM32F10x_StdPeriph_Lib_V350ProjectSTM32F10x_StdPeriph_Template目錄下的 stm32f10x_conf.h 、stm32f10x_it.c 、stm32f10x_it.h 三個(gè)文件復(fù)制到 USE戲件夾 13、打開(kāi) MDK軟件,新建一個(gè)工程Proj_GPIO 保存到 Proj_GPIO/USER中。CPU選

5、擇PTojertSTM32F103ZE 如圖 2;圖2-! J laraet F 三 CMSI5因 CDra_cm9.c圖 EyEtem_tni32F 3 Ox x舅IQx_hd-s-0合U9ER 母iim.c電 4面3布口T stm3S0x_conf,h4、新建一個(gè)空文檔 main.c保存到USER中,然后根 據(jù)絕對(duì)路徑將文件對(duì)應(yīng)添加到工程中,如右圖。B 3 LE 目 misc.c Etm32FlOK_adcx stm3fiox_bkp,c由 stm33fl0x_can.c百 stm3f LQx_cbc.c &貪面3胃1口工,%c 力型而切口囪 stm32f 1 Oxdbgnoj. c g

6、stm32f Iflx_drrk3.c 或I Ox_extliC-哲麗 33fl QxJliWh 二圖 砒Oxjsmc.c目 stm32d!l0:_gpb.c stmSaiOx.iSc-G stm32fiox_iwda.c圖 stmSSflOxjswr.c g stm32f lOx_rcc.c:-春tmSEfmjtcstm32fl0x_sdio.c國(guó)| 5tm32fl0x&5pi.c西| 5tm32f lOxJim.cstm33flQx_usart.c5、配置工程屬性,右鍵點(diǎn)擊工程文件中的Target 1選擇Options for Target Target1打開(kāi)工程選項(xiàng)對(duì)話框。做如下修改:1

7、) Output 選項(xiàng)勾選 Create HEX File ,然后點(diǎn)擊 Select Folder for Objects 按鈕定 位輸出文件保存目錄到工程的OBJ文件;2) Listing 選項(xiàng),同樣點(diǎn)擊 Select Folder for Listings定位輸出文件保存目錄到工程的OBJ文件;3) ) C/C+選項(xiàng),Define 中填入 S32F10X_HDUSE_STDPERIPH_DRIVER 的兩個(gè)基本宏定義;配置 Include Paths 屬 性,加入工程中包含頭文件的目錄;如右圖4)后面Debug和Utilities 兩個(gè)選項(xiàng)如果使用 J-link 或者其他調(diào)試器則需要做對(duì)應(yīng)

8、的 修改,否則不用。6、根據(jù)實(shí)驗(yàn)任務(wù)硬件原理圖編寫代碼實(shí)現(xiàn)四個(gè)按鍵控制led燈亮滅。1)其中用戶按鍵和 LED原理圖如下:用戶按鍵用戶功能LED燈GPIO_Init(GPIOE, &gpin_init_struct);/E 口按鍵2)根據(jù)原理圖初始化各 IO弓I腳,編寫控制函數(shù),然后主函數(shù)中調(diào)用。I*函數(shù)名稱:io init*函數(shù)功能:初始化 PA0 PE2 PE3 PE4 為輸入口 PE5 PB5為輸出口*1void io_init()GPIO_InitTypeDef gpin_init_struct;/使能每個(gè)IO 口的時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Pe

9、riph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);gpin_init_struct.GPIO_Pin = GPIO_Pin_0;gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;gpin_init_struct.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &gpin_init_struct);gpin_init_

10、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);GPIO_Init(GPIOE, &gpin_init_struct);gpin_init_struct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;gpin_init_struct.GPIO_Speed = GPIO_Speed_2MHz;

11、gpin_init_struct.GPIO_Mode = GPIO_Mode_IPU;/PA0弓|腳/IO 速度為2MHz/下拉模式/A 口按鍵/B 口 ledl/E 口 led2/上拉模式* 函數(shù)名稱:key_led* 函數(shù)功能:根據(jù)按鍵情況控制led燈的亮滅si s2 控制ledl ; s3 s4* 參數(shù):無(wú)* 其他:其中 LED1_ON LED1_OFF LED2_ON LED2_OFF 為全局宏定義*/void key_led()if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)=0) LED1_ON;if(GPIO_ReadInputDataBit

12、(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;控制led2#include stm32f10x.h#define LED2_ON#define LED2_OFF#define LED1ONGPIO_ResetBits(GPIOB, GPIO_Pin_5)GPIO_SetBits(GPIOB, GPIO_Pin_5)GPIO_ResetBits(GPIOE,

13、GPIO_Pin_5)#define LED1OFFGPIO_SetBits(GPIOE, GPIO_Pin_5)void io_init();void key_led();int main()io_init();while(1)key_led();3)代碼編寫完成后編譯鏈接,通過(guò)下載軟件將hex文件下載到實(shí)驗(yàn)板中運(yùn)行驗(yàn)證。實(shí)驗(yàn)二、ucos操作系統(tǒng)的移植一、實(shí)驗(yàn)?zāi)康?、掌握ucos到STM32的移植方法;2、熟悉通過(guò)C語(yǔ)音處理底層寄存器的技巧;3、了解STM3酢ucos任務(wù)切換時(shí)的處理;4、規(guī)范編程格式。二、實(shí)驗(yàn)內(nèi)容本次實(shí)驗(yàn)通過(guò)用C語(yǔ)言編寫6個(gè)操作系統(tǒng)相關(guān)函數(shù)和用匯編語(yǔ)言編寫4個(gè)與處理器相關(guān)的

14、函數(shù),將實(shí)時(shí)操作系統(tǒng)式/OS-n移植到芯片STM32F103ZE中,并創(chuàng)建兩個(gè)用戶任務(wù)點(diǎn)亮led。學(xué)會(huì)操作系統(tǒng)的移植方法,深入掌握嵌入式操作系統(tǒng)4/OS- n在初始化任務(wù)和任務(wù)調(diào)度的實(shí)現(xiàn)方法,直觀了解實(shí)時(shí)操作系統(tǒng)的體系結(jié)構(gòu)和設(shè)計(jì)思想。三、預(yù)備知識(shí)基本單片機(jī)硬件知識(shí)、單片機(jī)軟件編程語(yǔ)言、程序創(chuàng)建和調(diào)試的基本方法、ucos操作系統(tǒng)的任務(wù)調(diào)度原理、STM32的寄存器架構(gòu)。四、實(shí)驗(yàn)設(shè)備及工具硬件:STM3 M發(fā)平臺(tái)軟件:STM32W方庫(kù);PC機(jī)操作系統(tǒng) Windows 98、Windows 2000 或 Windows XP; KEIL MDK 集成開(kāi)發(fā)環(huán)境;串口轉(zhuǎn) usb驅(qū)動(dòng)。五、實(shí)驗(yàn)步驟1、按實(shí)驗(yàn)

15、一的步驟新建一個(gè)工程Proj2_ucos 。2、將移植好的ucos源代碼整個(gè)拷貝到我們的新建的工程目錄中,然后按對(duì)應(yīng)的文件路徑添加到keil工程里(os dbg.c和os dbg r.c只添加一個(gè)),如圖6和圖7。-f=| Ta- flM I理由UBi由uUl ij ETwnjP3.T UCCKJLGNF 口 *ClwSrfchs mV1三 &. ycwcore圖6jj圖73、配置工程相關(guān)屬性(與實(shí)驗(yàn)一庫(kù)應(yīng)用配置一樣),記得將ucos的頭文件路徑添加到工程的 include path 上面去,找到 stm2f10x_it.c 的 PendSV_Handler 函數(shù)注釋掉, main 文件中將i

16、ncludes.h 包含進(jìn)來(lái),主函數(shù)為空,編譯通過(guò)。4、在main.c中建立sys_init()函數(shù)編寫操作系統(tǒng)運(yùn)行需要的硬件相關(guān)初始化(見(jiàn)代碼),然后修改stm32f10x_it.c中的系統(tǒng)心跳中斷函數(shù)并加入頭文件includes.h (見(jiàn)代碼,)。I* 函數(shù)名稱:sys_init* 函數(shù)功能:嵌套向量中斷優(yōu)先級(jí)分組,時(shí)鐘心跳定時(shí)初始化1/200 s* 參數(shù):無(wú)*/*void sys_init()NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SysTick_Config(SystemCoreClock/200);* brief This fun

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

18、ABLE);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 口 ledlI* 函數(shù)名稱:my_task* 函數(shù)功能:用戶任務(wù)* 參數(shù):*其他:*void my_task()sys_init();led_init();OSStatInit();while(1)LED1_ON;LED2_OFF;OSTimeDl

19、y(50);LED1_OFF;LED2_ON;OSTimeDly(IOO);6、最后在主函數(shù)中創(chuàng)建任務(wù)并啟動(dòng)操作系統(tǒng)。編譯并調(diào)試運(yùn)行。#include stm32f10x.h#define LED2_ON#define LED2_OFF#define LED1_ON#define LED1OFF#include includes.hGPIO_ResetBits(GPIOB, GPIO_Pin_5)GPIO_SetBits(GPIOB, GPIO_Pin_5)GPIO_ResetBits(GPIOE, GPIO_Pin_5)GPIO_SetBits(GPIOE, GPIO_Pin_5)OS_ST

20、K 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);實(shí)驗(yàn)三、ucos操作系統(tǒng)的任務(wù)通信一、實(shí)驗(yàn)?zāi)康?、掌握ucos任務(wù)間通信的各種方法;2、了解嵌入式操作系統(tǒng)任務(wù)間可能出現(xiàn)的資源沖突;3、掌握ucos中信號(hào)量和郵箱的應(yīng)用;4、規(guī)范編程格式。二、實(shí)驗(yàn)內(nèi)容本次實(shí)驗(yàn)通過(guò)用 C語(yǔ)言編寫基于ucos操作系統(tǒng)下的多個(gè)用

21、戶任務(wù),并且實(shí)現(xiàn)任務(wù)間的 正確通信。通過(guò)信號(hào)量處理公共資源的等待和使用, 通過(guò)郵箱實(shí)現(xiàn)任務(wù)間的多個(gè)數(shù)據(jù)變量的 傳遞。建立正確的操作系統(tǒng)編程理念,深入掌握心/OS- n中信號(hào)量與郵箱的創(chuàng)建和使用,了解各任務(wù)間通信方法的大概原理及優(yōu)缺點(diǎn)。三、預(yù)備知識(shí)ucos操作基本單片機(jī)硬件知識(shí)、單片機(jī)軟件編程語(yǔ)言、程序創(chuàng)建和調(diào)試的基本方法、 系統(tǒng)的任務(wù)調(diào)度原理。四、實(shí)驗(yàn)設(shè)備及工具硬件:STM3加發(fā)平臺(tái)。軟件:STM32W方庫(kù);PC機(jī)操作系統(tǒng) Windows 98、Windows 2000 或 Windows XP; KEIL MDK 集成開(kāi)發(fā)環(huán)境;串口轉(zhuǎn) usb驅(qū)動(dòng)。五、實(shí)驗(yàn)步驟1、建立基于操作系統(tǒng)2、創(chuàng)建用戶

22、任務(wù)文件/task.c 文件代碼#include task.hINT32U NUM_COUNT1;INT32U NUM_COUNT2;void test_sem(void);void my_task()while(1) test_sem();心/OS-n的工程Proj3_ucos1 ,并配置好工程各項(xiàng)屬性。task.c和task.h兩個(gè)文件,詳細(xì)代碼如下。void test_sem()INT8U sem_err;INT32U tmp;tmp = NUM_COUNT1;OSTimeDlyHMSM(0,0,0,50);/用延時(shí)代替任務(wù)的其他任務(wù)tmp+; NUM_COUNT1 = tmp;OSSe

23、mPend(NUM_COUNT, 500, &sem_err);tmp = NUM_COUNT2;OSTimeDlyHMSM(0,0,0,50);/用延時(shí)代替任務(wù)的其他任務(wù)tmp+; NUM_COUNT2 = tmp;OSSemPost(NUM_COUNT);/task.h 文件代碼#ifndef _MY_TASK_H#define _MY_TASK_H#include includes.hextern OS_EVENT *NUM_COUNT;extern void my_task(void);#endif代碼中,在task1.c 中定義兩個(gè)全局變量 NUM_COUNT1 NUM_COUN下的

24、個(gè)變量在 my_task 函數(shù)里用于記錄該任務(wù)循環(huán)的總次數(shù),區(qū)別在與NUM_COUN直接操彳而NUM_COUNT2通過(guò)信號(hào)量的方法進(jìn)行操作。3、在main函數(shù)中初始化操作系統(tǒng)后創(chuàng)建一個(gè)信號(hào)量NUM_COUN球后用OSTaskCreate創(chuàng)建兩個(gè)任務(wù),優(yōu)先級(jí)分別是 8和9,兩個(gè)任務(wù)的入口地址都是 task1.c文件中的my_task函 數(shù)。NUM_COUNT = OSSemCreate(1);/ 創(chuàng)建一個(gè)信號(hào)量OSTaskCreate(my_task, (void *)0, (OS_STK *)&task1_stkSIZE_STK-1, 9);OSTaskCreate(my_task, (voi

25、d *)0, (OS_STK *)&task2_stkSIZE_STK-1, 8);4、編譯通過(guò)后調(diào)試, 在debug界面中,將NUM_COUNT1NUM_COUNT2個(gè)全局變量力口入至IJ變 量觀察窗口 watch1中,然后在task.c的my_task函數(shù)里面設(shè)置斷點(diǎn), 運(yùn)行并觀察兩個(gè)變量 的變化,理解信號(hào)量的使用。5、關(guān)于操作系統(tǒng)郵箱的應(yīng)用由例子工程Proj3_ucos2實(shí)現(xiàn),請(qǐng)自行理解代碼。實(shí)驗(yàn)四、ucos操作系統(tǒng)的文件系統(tǒng)實(shí)現(xiàn)一、實(shí)驗(yàn)?zāi)康?、了解文件系統(tǒng) FATFS的基本實(shí)現(xiàn)原理;2、掌握FATFS的移植步驟;3、掌握基于 ucos中FATFS的應(yīng)用;4、掌握STM32寸SD卡的讀寫

26、操作;5、規(guī)范編程格式。二、實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)實(shí)現(xiàn)將FAT文件系統(tǒng)移植到 ucos中,并基于ucos的文件系統(tǒng)編寫用戶任務(wù)進(jìn)行 測(cè)試,通過(guò)對(duì)文件系統(tǒng)的移植實(shí)驗(yàn)深入掌握對(duì)嵌入式相關(guān)驅(qū)動(dòng)移植的基本步驟,建立正確的嵌入式操作系統(tǒng)驅(qū)動(dòng)移植理念,并且熟悉掌握ucos操作系統(tǒng)下的文件系統(tǒng)的基本應(yīng)用,了解其優(yōu)缺點(diǎn)。三、預(yù)備知識(shí)基本單片機(jī)硬件知識(shí)、單片機(jī)軟件編程語(yǔ)言、程序創(chuàng)建和調(diào)試的基本方法、ucos操作系統(tǒng)的任務(wù)調(diào)度原理、STM32單片機(jī)中的SD卡驅(qū)動(dòng)、文件系統(tǒng)的操作函數(shù)、FAT文件系統(tǒng)的 基礎(chǔ)知識(shí)。四、實(shí)驗(yàn)設(shè)備及工具硬件:STM3加發(fā)平臺(tái)。軟件:PC機(jī)操作系統(tǒng) Windows 98、Windows 2000或

27、 Windows XP; KEIL MD磔成開(kāi)發(fā)環(huán)境;串口轉(zhuǎn)usb驅(qū)動(dòng);STM32W方庫(kù);FATFS的官方庫(kù);STM32的uart驅(qū)動(dòng)和SD卡驅(qū)動(dòng)源碼。五、實(shí)驗(yàn)步驟1、拷貝實(shí)驗(yàn)三的所有代碼到新的目錄地下,刪除USE濟(jì)口 OBJ文件夾里工程相關(guān)的文件,重新建立實(shí)驗(yàn)四的工程并命名為Proj4 FATFS,配置好工程各項(xiàng)屬性。2、在USE戲件夾里面創(chuàng)建文件夾myapp,將串口驅(qū)動(dòng)uart和SD卡驅(qū)動(dòng)sdio_sdcard 的源代碼拷貝到該文件夾里面, 并添加到工程中 USER3、拷貝FAT文件系統(tǒng)源碼到 myapp文件夾。在keil的工 程中增加一個(gè)文件夾FATFS并添加 diskio.c 、ff.

28、c、cc936.c三個(gè)文件到里面,如右圖。4、嘗試編譯字符表文件 cc936.c可能發(fā)現(xiàn)出錯(cuò):#error directive:This file is not needed in currentconfiguration.這是因?yàn)樵?ff.h 中_CODE_PAGE個(gè)宏的定義值不是936和長(zhǎng)文件名宏定義_USE_LFN勺值不是1導(dǎo) 致的。修改成對(duì)應(yīng)的值后該文件的編譯即可通過(guò)(如果用 其他字符表文件同理)。T&rget 1兇回x:E- 田二I B-ft i+)二i 坦二ICMSISUSER國(guó) m.im c囪 stm32fl0xi t. c國(guó) c用 sdi .idctrd. c因 uftrt.

29、cLIBUSEEJOHHGUSERJORI USER PORT f 0 1 6 k e 3 5 9 藥擊ffl; FATS闌3 0-由:, ,R5、移植FAT文件系統(tǒng)需要做的事情。1) FATFS是一個(gè)通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng)。FatFs的編寫遵循 ANSI C,因此不依賴于硬件平臺(tái)。它可以嵌入到便宜的微控制器中,如 8051 , PIC, AVR SHH Z80, H8, ARMl?等,不需要做任何修改。FATFS源代碼的獲取,可以到官網(wǎng)下載/fsw/ff/00index_e.html;解壓文件會(huì)得到兩個(gè)文件夾,一個(gè)是d

30、oc文件夾,保存FATFS的一些使用文檔和說(shuō)明。另一個(gè)是src文件夾,保存代碼源文件。FAT文件系統(tǒng)源碼和sd卡讀寫的底層驅(qū)動(dòng)。2)移植FAT文件系統(tǒng)只需根據(jù)硬件中可能接入的物理存儲(chǔ)模塊對(duì)文件系統(tǒng)的底層IO驅(qū)動(dòng)(diskio.c )進(jìn)行修改,具體需要修改的函數(shù)有:DSTATUS disk_initialize (BYTE); / 存儲(chǔ)介質(zhì)的初始化DSTATUS disk_status (BYTE); /讀取存儲(chǔ)介質(zhì)的狀態(tài)DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); / 讀取數(shù)據(jù)DRESULT disk_write (BYTE, const BYTE

31、*, DWORD, BYTE); / 寫入數(shù)據(jù)DRESULT disk_ioctl (BYTE, BYTE, void*); /讀取存儲(chǔ)介質(zhì)文件系統(tǒng)相關(guān)信息 DWORD get_fattime (void); /返回文件系統(tǒng)的時(shí)間3) diskio.c 文件中添加頭文件 sdio_sdcard.h 、ff.h ,增加SD卡的驅(qū)動(dòng)號(hào) 0如下:/* Correspondence between physical drive number and physical drive. */# define SD_CARD 0# define ATA1# define MMC2# define USB34)

32、 diskio.c五個(gè)函數(shù)具體代碼:DSTATUS disk_initialize ( BYTE drv/* Physical drive nmuber (0.) */) switch(drv)case SD_CARD:/SD 卡 if(SD_Init() = SD_OK) return RES_OK; else return RES_NOTRDY; return RES_NOTRDY;DSTATUS disk_status (BYTE drv /* Physical drive nmuber (0.) */)switch(drv)case SD_CARD:/SD 卡if(SD_GetStat

33、us() = SD_TRANSFER_ERROR) return STA_NOINIT; else return STA_PROTECT;default:return STA_NODISK;一DRESULT disk_read (BYTE drv,/* Physical drive 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

34、 (drv) case SD_CARD :for(;count0;count-) if(SD_ReadBlock(buff, sector3 9, _MAX_SS) != SD_OK) break;sector+; buff+=_MAX_SS; /* Wait until end of DMA transfer */ SD_WaitReadOperation();/* Check if the Transfer is finished */ while(SD_GetStatus() != SD_TRANSFER_OK); if(count = 0) return RES_OK;else ret

35、urn RES_ERROR; default: return RES_NOTRDY;#if READONLY = 0 DRESULT disk_write ( BYTE drv, const BYTE *buff, DWORD sector, BYTE count /* Physical drive nmuber (0.) */* Data to be written */* Sector address (LBA) */* Number of sectors to write (1.255) */switch (drv) case SD_CARD : for(;count0;count-)

36、if(SD_WriteBlock(uint8_t *)buff,sector22); if(SD_ReadBlock(RxBuffer, 0, 512) = SD_OK) for(i=0; i512; i+) printf(%X , RxBufferi);7)如果上一步能初始化并檢測(cè)出SD卡的大小,讀出前 512個(gè)字節(jié)的數(shù)據(jù),則說(shuō)明 SD卡和驅(qū)動(dòng)函數(shù)都正常。下一步設(shè)計(jì)一個(gè)FAT測(cè)試函數(shù):實(shí)現(xiàn)檢測(cè)TEST.txt文件是否存在,存在則讀取文件中的前100個(gè)字節(jié)內(nèi)容并串口輸出;然后打開(kāi)TEST2.txt文件(不存在則創(chuàng)建)寫入讀取到的內(nèi)容(沒(méi)有內(nèi)容則寫入“ is no file TEST.txt!

37、”);打開(kāi)TEST2.txt讀取 文件中的前100個(gè)字節(jié)內(nèi)容并串口輸出。具體代碼如下。void test_FAT() FATFS fs;FIL f_1, f_2;INT32U read_count=21; FRESULT error;error = 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(品rread the file

38、: TEST.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);一 一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_cou

39、nt, &read_count);if(error=FR_OK)一一一 printf(write OK ! %d words are writednr”, read_count); else printf(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(而rread the file: T

40、EST2.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移植成功了,下面我們?cè)O(shè)計(jì)一個(gè)基于ucos的文件系統(tǒng)應(yīng)用實(shí)驗(yàn),實(shí)現(xiàn)在用戶中檢測(cè)是否有SD卡插入,如果有則任務(wù)沒(méi)循環(huán)一次在SD卡中的文件mytask.txt的末尾寫入一句“這是本任務(wù)的第xx次循環(huán)”,然后在主函數(shù)中創(chuàng)建兩個(gè)以上的該任務(wù)的線程(這里需要注意實(shí)驗(yàn)三的資源沖突問(wèn)題!

41、)。9)具體代碼,詳見(jiàn)實(shí)例工程!* 擴(kuò)展知識(shí)1:在本工程中的SD底層驅(qū)動(dòng)中,因?yàn)橛?32位存儲(chǔ)SD卡的容量大小,所以 最大只能識(shí)別到4GB如果采用大于 4G的卡進(jìn)行測(cè)試則讀出的容量是錯(cuò)誤的。* 擴(kuò)展知識(shí)2:對(duì)于FAT32的MBRK不一定是在 0扇區(qū)中。* 擴(kuò)展知識(shí)3:配置ff.h(可能是ffconf.h )文件中_USE_STRFUNCg定義為1,可以使用 f_putc、f_puts、f_printf 、f_gets、f_eof、f_error 等函數(shù)實(shí)驗(yàn)五、基于ucos操作系統(tǒng)的網(wǎng)絡(luò)模塊一、實(shí)驗(yàn)?zāi)康?、了解 W5500網(wǎng)絡(luò)模塊的基本實(shí)現(xiàn)原理;2、掌握ucos下網(wǎng)絡(luò)底層庫(kù)的移植步驟;3、掌握基

42、于ucos的網(wǎng)絡(luò)編程TCP UDP思路;4、了解嵌入式軟件設(shè)計(jì)的分層思路;、實(shí)驗(yàn)內(nèi)容本實(shí)驗(yàn)通過(guò)STM32的SPI協(xié)議讀寫 W5500網(wǎng)絡(luò)模塊,移植網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)到ucos嵌入式操作系統(tǒng),并通過(guò)編寫 ucos操作系統(tǒng)的應(yīng)用任務(wù)實(shí)現(xiàn)實(shí)驗(yàn)板和上位機(jī)的網(wǎng)絡(luò)通信。了解基 于網(wǎng)絡(luò)通信的嵌入式軟件設(shè)計(jì)的思路。三、預(yù)備知識(shí)本實(shí)驗(yàn)要求學(xué)生具備基本的C語(yǔ)言讀寫能力、基本單片機(jī)軟硬件知識(shí)、了解 SPI協(xié)議、了解基礎(chǔ)的網(wǎng)絡(luò)協(xié)議應(yīng)用、ucos操作系統(tǒng)的用戶任務(wù)設(shè)計(jì)能力四、實(shí)驗(yàn)設(shè)備及工具硬件:STM3叫發(fā)平臺(tái)、PC機(jī)軟件:keilMDK編程環(huán)境、串口轉(zhuǎn)usb驅(qū)動(dòng)、STM32官方庫(kù)、移植好的ucos源碼、基于STM32 的SPI驅(qū)動(dòng)庫(kù)、基于 STM32的uart驅(qū)動(dòng)庫(kù)、W5500網(wǎng)絡(luò)模塊驅(qū)動(dòng)庫(kù)、五、實(shí)驗(yàn)步驟1、了解網(wǎng)絡(luò)編程中 socket、UDP的基本實(shí)現(xiàn)原理。2、了解W5500網(wǎng)絡(luò)模塊的基本功能和官方驅(qū)動(dòng)庫(kù)提供的代碼架構(gòu)。 W5500是一款全硬件 TCP/IP 嵌入式以太網(wǎng) 控制器,為嵌入式系統(tǒng)提供了更加簡(jiǎn)易的互聯(lián)網(wǎng)連接 方案。W5500集成了 TCP/IP協(xié)議棧,10/100M 以太網(wǎng)數(shù)據(jù)鏈路層(MAC及物理層(PHY,使得用戶使用單芯片就能夠在他們的應(yīng)用

溫馨提示

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

評(píng)論

0/150

提交評(píng)論