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

標題: tf卡基本讀寫和cdc數據傳送例程分享-基于stc32g12k128單片機的應用 [打印本頁]

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

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

stc-isp.png

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

圖像效果.jpg

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

實際電路.jpg

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

明湖.png

tf_usb.zip

204.59 KB, 下載次數: 25, 下載積分: 黑幣 -5

源程序

明湖bin.zip

79.25 KB, 下載次數: 16, 下載積分: 黑幣 -5

解壓為bin格式后低下載用


作者: GEECGYJ    時間: 2023-3-17 11:36
好資料,有空時折騰下!!




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91一区二区| 久久免费视频观看 | 亚洲 成人 av | 国产精品美女久久久 | 97国产精品视频人人做人人爱 | 区一区二在线观看 | 亚洲一区 中文字幕 | 久久精彩 | 国产成人jvid在线播放 | 成人性视频免费网站 | 99精品视频在线 | 国产黄色小视频在线观看 | 美女国产一区 | 中文字幕11页 | av网址在线| 欧美影院 | 亚洲欧美一区二区三区国产精品 | 精品国产欧美在线 | www.黄色片视频 | av天天干| 久久久国产视频 | 91av亚洲| 久久激情网| 久草免费在线视频 | 亚洲精品视频网站在线观看 | 精品欧美一区二区精品久久久 | 蜜桃五月天 | 无毛av | 综合色站导航 | av中文字幕在线播放 | 日韩免费一区二区 | 91精品国产91久久久久久最新 | 91久久精品一区二区二区 | 成人精品视频在线观看 | 欧美在线一区二区三区 | 午夜激情小视频 | 蜜桃一区二区三区 | 99国产精品久久久久久久 | 欧美成人激情 | 亚洲精品久久久久中文字幕二区 | 国产精品一区二区视频 |