久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2525|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

tf卡基本讀寫和cdc數(shù)據(jù)傳送例程分享-基于stc32g12k128單片機(jī)的應(yīng)用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   這是一個(gè)使用stc32g12k128的tf卡讀寫程序,
      tf卡優(yōu)點(diǎn)是體積小,成本低,容量大,存取速度快。
   本例程任務(wù)是把一幅圖像從上位機(jī)下載到mcu并寫入tf卡。再?gòu)膖f卡讀出。顯示在mcu的彩屏上。借此驗(yàn)證tf卡讀寫程序的工作和usb-cdc下載的操作細(xì)節(jié)。
   程序中使用了硬件SPI與tf卡通訊,LCM_DMA驅(qū)動(dòng)彩屏顯示。SPI在P3口,LCM在P2口。
tf卡在使用上有個(gè)特殊的地方,就是初始化時(shí)要求mcu運(yùn)行頻率很低,而正常讀寫時(shí)要求高的運(yùn)行頻率,本例程使用了stc32g12k128靈活的頻率變換特性和異步運(yùn)行特性,很好的滿足了tf卡初始化與正常讀寫時(shí)對(duì)頻率的不同要求。既保證了系統(tǒng)的可靠性,又提高了速度。
   為方便有興趣的朋友移植,本例程采用了模塊化編程。主要模塊如下:
SD.C        //ft卡讀寫函數(shù)
usb_initia.c   //usb-cdc打開命令
tft_320_drv.c  //tft彩屏驅(qū)動(dòng)函數(shù),這個(gè)函數(shù)與使用的屏有關(guān),不同的屏請(qǐng)換用相應(yīng)的驅(qū)動(dòng)
main.c       //主函數(shù)
stc_usb_cdc_32g.lib  //stc官方的cdc驅(qū)動(dòng)庫(kù)
   下面是主函數(shù),
#include "SD.h"
#include "tft_320_drv.h"
#include "usb_initial.h"
#include "mcu_initial.h"
#include "stc32g.h"
#include "stc32_stc8_usb.h"
#include "string.h"
char *USER_DEVICEDESC=NULL;
char *USER_PRODUCTDESC=NULL;
char *USER_STCISPCMD="@STCISP*";
u8 extern xdata  MCU_write_SD_data[];
u8 extern xdata  MCU_read_SD_data[];
extern BYTE xdata UsbInBuffer[64];
extern BYTE xdata UsbOutBuffer[64];
void main()
{
        unsigned char xdata *qq;//寫卡緩存的指針,用于usb下載數(shù)據(jù)向?qū)懣ň彺孓D(zhuǎn)移數(shù)據(jù)
        unsigned int i,cnt,cnt0,j,k,cc;
        mcu_initial();
   SD_init();    //SD卡初始化(SD卡讀寫速度在SD_init函數(shù)中設(shè)置)
         Delay10ms();
  HSCLKDIV=2;//擔(dān)心速度太快寫卡出錯(cuò)。降一下速,主頻35M,讀寫tf卡速度35/4=8.75M
SPCTL|=3;
                delay(22);
        lcd_initial();
        display_black();//清屏對(duì)調(diào)試程序有利
        digit_display(0,0,1234);//在屏上顯示個(gè)數(shù)據(jù),當(dāng)歡迎詞用
                delay(22);
  usb_initial();//開usb-cdc
  j=0;i=0;
        digit_display(0,64,1234);//在屏上顯示個(gè)數(shù)據(jù),表示通過usb初始化
        strcpy(UsbInBuffer,"data_transffer_over");//準(zhǔn)備了一個(gè)在上位機(jī)顯示的結(jié)束用語(yǔ)
        cc=1;//循環(huán)狀態(tài)
        cnt0=299;//(320x240x2/512-1=299)準(zhǔn)備接收的扇區(qū)數(shù)
        cnt=0;//正在接收的扇區(qū)
        k=0;//輔助計(jì)數(shù)
  qq=MCU_write_SD_data;//寫卡緩存指針初始化
while(cc)
{
        if(bUsbOutReady)//查詢是否有信息過來(lái)。沒有的話就繼續(xù)查詢,有信息就進(jìn)入信息處理程序
        {
    memcpy(qq, UsbOutBuffer, 64);  //將接收數(shù)據(jù)(UsbOutBuffer)復(fù)制到寫卡緩沖區(qū)(MCU_write_SD_data),應(yīng)該用OutNumber替代64
    if(OutNumber<64)cc=1;//OutNumber小于64說(shuō)明發(fā)送完了。后面沒有數(shù)據(jù)可發(fā)了
        qq=qq+64;//移動(dòng)寫卡緩存指針,準(zhǔn)備存放下一組接收到的數(shù)據(jù)
        k++;
                if(k>7)//寫卡處理,注意這樣最后八組數(shù)據(jù)可能沒有寫上tf卡
                {
          MCU_write_SD_512Byte(4730+cnt,512);//MCU向SD卡寫入數(shù)據(jù),一次最多512字節(jié)        k=0;
                qq=MCU_write_SD_data;//寫卡緩存指針復(fù)位
  cnt++;
                }
                usb_OUT_done();//準(zhǔn)備再次接收
        }
    if(cnt>cnt0)cc=0;//寫入扇區(qū)數(shù)達(dá)到預(yù)定的值,退出接收狀態(tài)
}
   USB_SendData(UsbInBuffer,19);//向上位機(jī)發(fā)送數(shù)據(jù),表示接收數(shù)據(jù)完成
   lcd_address(0,0,320,240);//設(shè)定寫屏窗口
   for(i=0;i<cnt0;i++)
   {
        MCU_read_SD_512Byte(4730+i,512);//MCU從SD卡讀取512字節(jié)數(shù)據(jù),                Delay10ms();
        lcm_dma_only(512,MCU_read_SD_data);//把讀出的數(shù)據(jù)送屏顯示
        while(!(DMA_LCM_STA&0x01));//因?yàn)樽x卡與刷屏用了同一個(gè)緩沖區(qū),所以要等待dma完成,
   }
while(1);
        }
可以看到主函數(shù)里調(diào)用的函數(shù)
1、SD_initial()
    這個(gè)函數(shù)的構(gòu)架是在網(wǎng)上下載的,根據(jù)我自己的理解做了改動(dòng)。另外,它使用了stc32g12k128的硬件SPI功能,選擇的P3口與tf卡通訊。并使用了兩個(gè)語(yǔ)句使運(yùn)行頻率下降
  HSCLKDIV=9;//這是重點(diǎn)
        SPI_init(2);//硬件SPI初始化
   系統(tǒng)主頻采用的是35M,這兩個(gè)語(yǔ)句使得SPI的運(yùn)行頻率為:
35000000/9/16=243055HZ;低于400K,滿足tf卡初始化的要求
2、Lcd_initial()
    這是對(duì)應(yīng)顯示屏的初始化程序,不同的顯示屏要換用自己相應(yīng)的初始化函數(shù),我使用了一款320X240并口彩屏,2.4吋。
對(duì)屏初始化前,運(yùn)行了兩個(gè)語(yǔ)句,用來(lái)提高spi運(yùn)行速度。
  HSCLKDIV=2;//擔(dān)心速度太快寫卡出錯(cuò)。降一下速,主頻35M,讀寫tf卡速度35/4=8.75M
        SPCTL|=3;
3、Digit_display()
這是屏驅(qū)動(dòng)里的函數(shù),用于在屏上顯示數(shù)字,方便調(diào)試
4、Usb_initial()
    這是開啟cdc通訊的函數(shù),執(zhí)行它,就能與上位機(jī)進(jìn)行cdc通訊了。當(dāng)然通訊是相互的,上位機(jī)也要打開相應(yīng)的串口。這里我直接使用了stc-isp工具上的串口功能。(據(jù)說(shuō)其它串口工具也一樣用,我沒試)
5、Strcpy()
這是C語(yǔ)言自帶的拷貝函數(shù),不多說(shuō)
6、Memcpy()
這個(gè)也是C語(yǔ)言自帶的拷貝函數(shù)。
7、MCU_write_SD_512Byte(4730+cnt,512)
    把寫卡緩沖區(qū)的數(shù)據(jù)寫入tf卡指定扇區(qū)。第一個(gè)參數(shù)是扇區(qū)的位置,第二個(gè)參數(shù)是數(shù)據(jù)的字節(jié)數(shù),最多512,沒必要少,因?yàn)閠f卡是按扇區(qū)寫入的。扇區(qū)位置一般不要從零開始,那里通常是tf卡管理信息存放的位置。另外做實(shí)驗(yàn)時(shí)也不要一直在一個(gè)位置反復(fù)寫入,每次實(shí)驗(yàn)都換個(gè)起始位置比較好。要考慮卡的寫入壽命。
8、USB_SendData(UsbInBuffer,19)
    把發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送給上位機(jī)(也就是電腦)第一個(gè)參數(shù)表示數(shù)據(jù)的存放位置,第二個(gè)參數(shù)是發(fā)送的字節(jié)數(shù)。前面我把19字節(jié)的信息依次存入數(shù)組,現(xiàn)在可以用這個(gè)指令發(fā)送給上位機(jī)了。
strcpy(UsbInBuffer,"data_transffer_over");//這是存入信息的語(yǔ)句,字符串的長(zhǎng)度是19
9、MCU_read_SD512Byte(4730+i,512)
   把指定扇區(qū)的數(shù)據(jù)讀入讀卡緩沖區(qū),第一個(gè)參數(shù)是tf卡上扇區(qū)的位置,第二個(gè)參數(shù)是讀出的字節(jié)數(shù),讀出的數(shù)據(jù)存放在讀卡緩沖區(qū)MCU_read_SD_data[]。
10、Lcm_dma_only(512,MCU_read_SD_data)
    把緩沖區(qū)的數(shù)據(jù)送到彩屏上顯示,第一個(gè)參數(shù)是字節(jié)數(shù),第二個(gè)是數(shù)據(jù)存放位置。本來(lái)dma要有自己的專用緩沖區(qū),為了編程簡(jiǎn)單,我直接用讀卡緩沖區(qū)做dma緩沖區(qū)了。如果想提高速度,可以采用雙緩沖區(qū)結(jié)構(gòu),一個(gè)讀卡,一個(gè)顯示,然后再換過來(lái),這樣把讀卡和顯示的速度都發(fā)揮出來(lái)。
    在主程序中,接收上位機(jī)的數(shù)據(jù)采用了循環(huán)查詢的方式
while(cc)
{      
if(bUsbOutReady)//查詢是否有信息。沒有就繼續(xù)查詢,有信息就進(jìn)入信息處理程序
{...信息處理
                usb_OUT_done();//準(zhǔn)備再次接收
}
}
    它的工作模式是,
    先查詢標(biāo)志位,看看上位機(jī)是否發(fā)送信息完成,
    如果沒有。就循環(huán)繼續(xù)查詢
    如果上位機(jī)發(fā)送信息完成,則進(jìn)入信息處理程序
    處理完信息,做接收下次信息的準(zhǔn)備
    運(yùn)行這段程序前設(shè)置了接收完成的條件cnt0,在程序中進(jìn)行判斷。
    為使用這個(gè)例程,我找了一個(gè)圖像,使用軟件把它裁剪成320X240尺寸,再轉(zhuǎn)換成二進(jìn)制文件(.bin).備用。
程序執(zhí)行時(shí),打開stc-isp軟件,切換到USB-CDC/串口助手。右鍵“發(fā)送文件”,調(diào)出設(shè)置界面,在設(shè)置界面上設(shè)置發(fā)送包512(1024也能用),延時(shí)間隔用2毫秒(用1毫秒時(shí)數(shù)據(jù)出現(xiàn)錯(cuò)誤)。確定后左鍵“發(fā)送文件”,找到準(zhǔn)備好的二進(jìn)制數(shù)據(jù)文件,確認(rèn)后串口自動(dòng)打開,并開始向mcu發(fā)送數(shù)據(jù),在接收緩沖窗口上能看到快速發(fā)送的數(shù)據(jù)。每個(gè)包512字節(jié)。發(fā)送完成后,mcu向上位機(jī)發(fā)送信息data_transffer_over也在接收緩沖區(qū)顯示出來(lái)。然后mcu的彩屏很快顯示出從tf卡讀出的數(shù)據(jù)圖像。感覺速度比從code數(shù)組讀出的速度要快不少。
    圖片裁剪使用的工具是:
提取圖片數(shù)據(jù)V5.exe
    轉(zhuǎn)化圖片數(shù)據(jù)使用的工具是:
Img2lcd.exe.
    驗(yàn)證時(shí)使用的tf卡是256M的行車記錄儀儲(chǔ)存卡。
完整程序見附件。
程序運(yùn)行完后使用winhex軟件查看了tf卡的信息。
過程中使用的bin文件我壓縮了一下,不知解壓后能不能正常使用

stc-isp.png (64.38 KB, 下載次數(shù): 149)

stc-isp.png

圖像效果.jpg (108.91 KB, 下載次數(shù): 143)

圖像效果.jpg

實(shí)際電路.jpg (173.87 KB, 下載次數(shù): 158)

實(shí)際電路.jpg

明湖.png (200.63 KB, 下載次數(shù): 141)

明湖.png

tf_usb.zip

204.59 KB, 下載次數(shù): 25, 下載積分: 黑幣 -5

源程序

明湖bin.zip

79.25 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

解壓為bin格式后低下載用

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:297903 發(fā)表于 2023-3-17 11:36 | 只看該作者
好資料,有空時(shí)折騰下!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av网站免费 | 日韩成人国产 | 亚洲精品久久国产高清情趣图文 | 91爱啪啪| 欧美日韩在线一区二区 | 欧美一区不卡 | 国产精品免费在线 | 成人精品一区 | 日韩精品一区二区三区中文在线 | 久久综合久久综合久久综合 | 国产成人综合一区二区三区 | 黄色毛片免费看 | 91久久国产综合久久91精品网站 | 国产一区二区 | 日日夜夜天天 | 永久看片 | 久久久久久久久久久久久9999 | 中文字幕日韩一区 | 日韩在线播放网址 | www久久久| 久久精品在线播放 | 亚洲国产成人精品女人久久久 | 久久精品国产一区 | 国产精品69毛片高清亚洲 | 久久免费高清 | 久久久高清 | 婷婷色国产偷v国产偷v小说 | 免费精品| 欧美性jizz18性欧美 | 精品一区二区三区91 | 国产精品揄拍一区二区 | 在线视频成人 | 国产高清一区二区三区 | 欧美视频在线播放 | 欧美影院 | 国产高清视频一区 | 久久精品青青大伊人av | 欧美精品久久久 | av一区在线观看 | 日韩av在线免费 | 激情一区 |