《電子技術應用》
您所在的位置:首頁 > 測試測量 > 活動進展 > 基于CH579的SHT30模塊溫濕度數據串口解析和letter-shell移植

基于CH579的SHT30模塊溫濕度數據串口解析和letter-shell移植

2023-06-02
作者:Echo365
來源:電子技術應用
關鍵詞: CH579 開發板測評

感謝電子技術應用的這次活動,申請到了一塊CH579的開發板。

在芯片國產化的大趨勢下,很多人都在尋找可以用于替代進口器件的國產芯片,所以趁此機會,簡單體驗了一下沁恒芯片的開發,下面進入正題。

首先來一張系統的照片

微信截圖_20230602145520.png


本次測試使用的開發板型號:CH579M-R1-1V2和維特智能的SHT30溫濕度傳感模塊。

開發環境是MounRiver Studio V1.8.4。

以前沒用過這個開發環境,但是感覺keil不是很好用,就體驗一下,和CubeIDE 或者 RTthread studio差不多,用起來也很好上手,總之代碼補全什么的,好一些了,但是mounriver調試代碼的話好像要使用沁恒的調試器WCH-LINK,但是我沒有,所以想要用stlink什么的調試只能用keil了,不過代碼邏輯也不是太難,不太需要調試。

先新建CH579工程,點擊文件->新建MounRiver工程,查詢型號CH579,這里調試器類型只有WCH-LINK,不能更改,但是我沒有。。。

微信截圖_20230602145613.png

新建好工程之后看看左側資源管理器,里邊就是你的工程文件了,其中主函數在scr文件夾下,一些已經寫好的外設驅動函數在StdPeriphDriver文件夾下。本次我們需要用uart0來和SHT30傳感器通信,uart1用來適配letter-shell作為調試信息輸出。

微信截圖_20230602151945.png


刪掉自動生成的工程里Main.c文件中的所用東西,開始寫自己的代碼。

先修改系統時鐘,直覺上驅動文件里應該有相關的時鐘配置函數,那我去哪里找這個函數呢?

CH57x_clk.c文件里!找到一個函數:

SetSysClock(CLK_SOURCE_PLL_40MHz); //重設系統時鐘,應當最先配置

main函數里直接調用,把系統時鐘設置為40M,根據注釋說明,默認會使用外部晶振。而且此處必須最先配置時鐘,不然先配置了串口之類的外設時序會亂掉。

然后點一個LED燈指示,看驅動文件里有

DelayMs()

這個函數,但是這個函數是用循環nop這種方式寫的,定時的精度em。。。1秒經過編譯后成了1.5。自己寫一個吧,簡單使用systick。定義一個全局變量,然后在systick中斷函數中自減就行了。SysTick_Handler直接定義就好。

volatile uint32_t delay_cnt = 0;//需要加關鍵字修飾 不然會被優化
void SysTick_Handler()
{    
    SysTick->CTRL &= ~(SysTick_CTRL_COUNTFLAG_Msk);//清除中斷標志    
    delay_cnt--;
}
void user_delay_ms(uint32_t ms)//簡單阻塞延時,哪里需要哪里調
{    
    delay_cnt = ms;    
    while(delay_cnt);
}

然后在主函數中調用下邊的config函數設置時基(注意傳入的參數40000,因為前邊系統主頻已經改成了40M)

SysTick_Config(40000);//每過1ms進入一次systick中斷

這樣就有了一個相對靠譜的延時函數了。

下一步控制GPIO9點燈(先把排針連上,那個LED排針還空著的),寫個函數初始化GPIO,注意看清你用的GPIOA和GPIOB,就要調用相關的GPIOX_ModeCfg函數,其他的外設也是如此,比如uart0和uart1就有不同的函數完成類似的功能。

void LED_init()
{    
    GPIOB_SetBits(GPIO_Pin_19);    
    GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeOut_PP_5mA);
}

指示燈能跑了,然后初始化串口。這里先初始化GPIO功能再初始化串口配置,串口需要打開中斷。

這塊芯片本身支持硬件FIFO,但是在做數據解析時候我們自己還要定義一些自己的緩存,不過那是后邊的事情了。

串口1用于給移植的letter-shell做調試輸出使用,所以接收FIFO配配置1個字節就觸發中斷吧。

串口0用于和傳感器通信,配置了4字節觸發一次中斷。

始化完成了還不能用,看看下邊的串口中斷函數怎么寫。

void user_uart_init(void)
{    
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);   
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);    
    UART1_DefInit();//調試串口初始化   
    UART1_ByteTrigCfg(UART_1BYTE_TRIG);//設置FIFO 1字節觸發   
    UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT ); 
    NVIC_EnableIRQ( UART1_IRQn );  
    
    GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);  
    GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA); 
    UART0_DefInit();//通信串口初始化    
    UART0_ByteTrigCfg(UART_4BYTE_TRIG);//設置FIFO 4字節觸發
    UART0_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );  
    NVIC_EnableIRQ( UART0_IRQn );
}

letter-shell是一個命令行調試工具,可以把你文件中定義的函數導出來,通過命令行調用,裸機用來做調試工具還挺方便的。

另一個串口解析的代碼模塊是自己寫的,可以解析挺多種特定格式的數據幀。

先看怎么移植letter-shell。

到git上把源碼下載下來:GitHub - NevermindZZT/letter-shell: letter shell

然后參考了說明開始移植。

用戶裸機移植的話,只需要實現write函數,init函數和shellHandler的調用。

自己在mounriver的工程里創建一個letter-shell的文件夾,然后把你下載的源碼里src文件夾下所有文件都丟letter-shell文件夾里。然后在項目資源管理器里可以看見你復制過來的文件了,但是沒完事,還要右鍵letter-shell文件夾,把它加入工程的編譯。

微信截圖_20230602152016.png

還需要把你自己加進來的這些文件的頭文件路徑添加好:

右鍵CH579M的工程,點擊屬性->C/C++構建->設置->工具設置

我添加了letter-shell的文件夾,還有工程里src文件夾下還定義了一個user_def.h以及uda.h文件,路徑也要添加進來。

微信截圖_20230602152053.png


移植說明寫了,如果用了GCC編譯器,還要修改什么字段,反正最后我們工程里obj文件夾的CH579.ld文件里加點代碼,找到40多行.text:這段,加上就好了。

微信截圖_20230602152112.png


源碼添加好了,然后letter-shell文件夾里創建一個shell_port.c和shell_port.h文件,自己實現的接口函數就保存在這里了。

Shell shell;
char shellBuffer[512];

short userShellWrite(char *data, unsigned short len)
{
    UART1_SendString((uint8_t *)data,len);    
    return len;
}
void userShellInit(void)
{    
    shell.write = userShellWrite;  
    shellInit(&shell, shellBuffer, 512);
 }

這里定義了一些模塊需要的變量和buff,還有實現的函數,寫函數直接調用的CH579給的驅動函數就可以了。

讀數據我們去串口中斷里實現,不需要定義讀函數了,所以這里只要定義這兩個函數就完事了,剩下什么線程啊,鎖啊之類的,裸機我們用不到,就都刪除了。最后再到.h文件里把寫的函數和變量聲明一下就可以了。

串口1的中斷處理函數直接定義:

void UART1_IRQHandler(void)
{   
     switch( UART1_GetITFlag() )//判斷中斷類型    
     {
         case UART_II_RECV_RDY:// 數據達到設置觸發點    
             while( R8_UART1_RFC ) //查看FIFO中剩余數據量  
             {               
                 shellHandler(&shell,R8_UART1_RBR);//R8_UART1_RBR中的數據直接交給letter-shell         
             }
             break;
         case UART_II_RECV_TOUT: // 接收超時,暫時一幀數據接收完成           
             while( R8_UART1_RFC )            
             {               
                 shellHandler(&shell,R8_UART1_RBR);            
             }          
          break;       
         case UART_II_THR_EMPTY:         
         // 發送緩存區空,可繼續發送            
         break;        
         default:            
         break;    
     }
}

很簡單,只是調用shellHandler把FIFO中的數據接收就行了。使用之前在主函數里調用一下剛才你寫的shellinit初始化哪個函數就可以了。

然后 串口解析,在工程里添加了自己寫的uda模塊,用的時候就三個函數,大概思路是先定義一幀數據幀頭啊長度啊之類的東西,在使用功能之前初始化一次。然后在串口0接收中斷里拿到數據,收進自己的解析緩存區,在主whiel中循環解析就可以了,每次解析一幀數據出來。篇幅限制就不再展開說了。

最后主函數長這樣:

微信截圖_20230602152205.png

還有個shell導出命令測試的函數:

void print_current_temp_hum(void)
{    
    uint32_t tick_ = SYS_GetSysTickCnt();   
    printf("current tick = %d\r\n",tick_); 
    printf("mounriver >> temp = %.2f  humi = %.2f\r\n",temp_val, humi_val);
}SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), my_print_cmd, print_current_temp_hum, this is a print test);

主要完成了在主函數中解析到SHT30的溫度和濕度數據,當外部指令通過shell調用函數時候,將此時的系統時間tick值和溫濕度數據打印出來。

最后編譯,并且通過WCHISPStudio工具下載,下載代碼之前要按住開發板上的DOWNLOAD按鍵,再打開開關,這時候下載工具才找得到設備。

微信截圖_20230602152251.png


調試效果如下圖:

微信截圖_20230602152309.png


總體來說,體驗還可以,有機會試下其他的芯片。本測試的代碼附在后邊,需要自取。

https://gitee.com/Echo365/open.git


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲韩国日本中文字幕| 亚洲精品一区久久久久久| 欧美区二区三区| 欧美大片国产精品| 国内精品99| 久久精品噜噜噜成人av农村| 久久激情中文| 欧美日韩在线观看一区二区| 久久嫩草精品久久久精品一| 欧美日本高清| 免费观看一级特黄欧美大片| 欧美日一区二区三区在线观看国产免| 性欧美大战久久久久久久久| 免费久久精品视频| 欧美丝袜一区二区三区| 亚洲精品中文字| 亚洲一区二区在线播放| 欧美日韩综合视频网址| 亚洲激情第一区| 国产精品欧美一区二区三区奶水| 久久久精品性| 99精品国产一区二区青青牛奶| 欧美日本在线| 老司机午夜免费精品视频| 极品日韩av| 亚洲高清激情| 国产一区二区三区在线观看精品| 欧美影院一区| 亚洲主播在线播放| 国产精品国产亚洲精品看不卡15| 欧美亚洲动漫精品| 欧美在线一二三区| 黑人中文字幕一区二区三区| 国产精品成av人在线视午夜片| 国产精品免费一区二区三区在线观看| 国产亚洲欧美aaaa| 9l视频自拍蝌蚪9l视频成人| 亚洲在线免费| 亚洲人午夜精品免费| 欧美国产亚洲视频| 国产伦精品一区二区三区免费迷| 亚洲人体偷拍| 欧美日韩三级电影在线| 先锋影音国产精品| 亚洲国产精品t66y| 99天天综合性| 亚洲精品国产精品国产自| 国产日韩在线亚洲字幕中文| 日韩视频在线一区二区三区| 欧美精品一区二区三| 久久精品中文字幕一区二区三区| 欧美一区二区三区免费观看| 欧美亚洲成人网| 欧美久久久久| 欧美国产日韩一区二区三区| 欧美理论电影网| 久久青草欧美一区二区三区| 悠悠资源网久久精品| 亚洲视频免费在线观看| 精品粉嫩aⅴ一区二区三区四区| 欧美jizz19hd性欧美| 毛片基地黄久久久久久天堂| 欧美日韩 国产精品| 欧美一级专区免费大片| 欧美在线二区| 亚洲在线播放电影| 亚洲国产美国国产综合一区二区| 欧美成黄导航| 国产精品久久久久久久久久三级| 亚洲一区bb| 原创国产精品91| 国产精品自在线| 在线视频精品| 国产精品毛片一区二区三区| 国产在线精品一区二区中文| 久久精品一级爱片| 亚洲每日更新| 欧美日韩午夜剧场| 久久久综合精品| 一区二区三区毛片| 亚洲第一精品影视| 国产精品久久久久久超碰| 欧美大片专区| 亚洲国产成人av在线| 老司机67194精品线观看| 9久草视频在线视频精品| 日韩一区二区精品在线观看| 母乳一区在线观看| 久久国产精品久久久久久电车| 亚洲老板91色精品久久| 久久综合给合久久狠狠狠97色69| 国产欧美日韩一区二区三区在线| 欧美美女bb生活片| 亚洲一区二区毛片| 最新高清无码专区| 亚洲视频电影在线| 亚洲欧美清纯在线制服| 艳妇臀荡乳欲伦亚洲一区| 久久中文字幕导航| 久久综合色一综合色88| 欧美日韩伊人| 久久国产日韩欧美| 国产精品视频自拍| 欧美日韩一区二区精品| 国模一区二区三区| 亚洲午夜久久久久久尤物| 国产在线视频不卡二| 夜夜嗨av一区二区三区四季av| 在线看欧美视频| 欧美成人免费一级人片100| 夜夜爽www精品| 国产精品美女一区二区| 国内精品福利| 亚洲神马久久| 欧美视频在线观看一区二区| 国产精品国产三级国产专区53| 欧美亚洲日本一区| 午夜视频久久久| 国产精品日韩欧美| 老司机aⅴ在线精品导航| 亚洲一区二区欧美日韩| 韩日在线一区| 亚洲日本无吗高清不卡| 国产综合色精品一区二区三区| 怡红院精品视频在线观看极品| 一区二区三区国产在线观看| 国产午夜精品理论片a级探花| 国模精品娜娜一二三区| 美女诱惑一区| 亚洲深爱激情| 一区二区三区导航| 日韩午夜免费视频| 欧美福利一区二区三区| 久久精品国产免费观看| 欧美日韩亚洲成人| 欧美日韩三区| 亚洲欧美日韩另类| 欧美肥婆在线| 欧美视频日韩| 国产精品国色综合久久| 亚洲字幕在线观看| 久久精品99国产精品酒店日本| 亚洲乱码日产精品bd| 国产精品视频免费在线观看| 久久精品99无色码中文字幕| 日韩特黄影片| 亚洲精品视频二区| 久久久久成人精品| 国产精品高潮在线| 亚洲欧美日韩中文在线制服| 欧美影视一区| 在线视频欧美日韩| 久久国产日韩| 99视频精品免费观看| 美女诱惑一区| 韩国一区二区在线观看| 久久午夜色播影院免费高清| 国模一区二区三区| 精品成人a区在线观看| 欧美日韩国产色站一区二区三区| 欧美日韩一区在线观看视频| 国外视频精品毛片| 一区二区三区视频在线播放| 久久精品视频免费观看| 亚洲精品国产精品国自产观看浪潮| 一区二区三区波多野结衣在线观看| 欧美一区=区| 午夜久久久久久久久久一区二区| 国产精品日韩欧美一区二区三区| 欧美精品18+| 伊人影院久久| 国产伦精品一区二区三区照片91| 国产一区二区精品久久99| 欧美噜噜久久久xxx| 国产精品久久久久久久久久妞妞| 国产精品久久久久久福利一牛影视| 亚洲国产一区二区三区在线播| 欧美日韩视频在线观看一区二区三区| 欧美天天在线| 亚洲精品美女久久久久| 亚洲区中文字幕| 欧美性猛交一区二区三区精品| 亚洲成人在线免费| 亚洲黄色影院| 国产精品久久久久久久久借妻| 亚洲日本一区二区| 午夜亚洲福利| 欧美三级电影精品| 亚洲一区二区欧美| 国产一区二区主播在线| 狠狠色综合网站久久久久久久| 亚洲精品国产精品国自产在线| 欧美成人精精品一区二区频| 一区二区三区免费看| 亚洲欧美制服中文字幕| 先锋影音一区二区三区| 国产综合久久久久久鬼色| 亚洲第一网站免费视频| 合欧美一区二区三区| 老鸭窝毛片一区二区三区| 国产精品激情电影| 毛片一区二区三区| 欧美精品在线网站| 国产欧美视频一区二区三区| 亚洲国产网站| 国产精品国码视频| 亚洲字幕在线观看| 老司机凹凸av亚洲导航| 激情文学综合丁香| 亚洲欧洲日韩在线| 国产视频一区免费看| 久久久精品免费视频| 亚洲国产另类精品专区| 欧美一区二区视频观看视频| 久久精品一区四区| 亚洲欧美国产不卡| 亚洲一区二区黄色| 国产女人精品视频| 亚洲高清在线观看一区| 欧美一区午夜精品| 一区二区亚洲精品国产| 国产一区二区丝袜高跟鞋图片| 亚洲激情在线视频| 美女视频黄免费的久久| 性色av一区二区三区红粉影视| 国产精品成人久久久久| 一区二区三区高清| 99re热这里只有精品免费视频| 亚洲免费观看在线观看| 亚洲午夜av电影| 国产日韩欧美91| 久久成人国产精品| 亚洲视频在线观看视频| 国产专区欧美专区| 欧美日韩视频在线观看一区二区三区| 激情欧美日韩一区| 欧美精品一区二区三区在线看午夜| 亚洲欧美另类综合偷拍| 欧美激情久久久久久| 久久av最新网址| 久久这里只有精品视频首页| 国内成人精品2018免费看| 久久精品一区二区三区不卡| 亚洲国产小视频在线观看| 久久国产精品99久久久久久老狼| 久热这里只精品99re8久| 亚洲韩国一区二区三区| 亚洲视频成人| 欧美极品色图| 欧美日韩另类综合| 欧美 日韩 国产在线| 久久久久久91香蕉国产| 亚洲精品自在在线观看| 国产一区二区三区高清在线观看| 在线播放日韩专区| 久久综合成人精品亚洲另类欧美| 国产精品老牛| 国产欧美一区二区精品性色| 国产精品欧美日韩久久| 亚洲日本无吗高清不卡| 亚洲春色另类小说| 亚洲精品在线观看免费| 午夜精品三级视频福利| 亚洲电影下载| 国产精品国产三级国产专播精品人| 亚洲精品国产精品久久清纯直播| 欧美日韩精品一区二区| 亚洲国产专区| 国产精品不卡在线| 亚洲欧美日本国产专区一区| 久久久久久久高潮| 亚洲欧美一区二区三区极速播放| 日韩午夜激情av| 国产精品日韩在线播放| 在线视频亚洲欧美| 欧美日韩中文在线| 亚洲欧美国产精品va在线观看| 国产精品chinese| 亚洲欧洲日本一区二区三区| 欧美日韩一二三区| 国产精品乱码久久久久久| 国产欧美va欧美不卡在线| 欧美成人免费在线观看| 亚洲高清不卡一区| 国产精品视频最多的网站| 久久先锋影音av| 麻豆精品一区二区av白丝在线| 免费观看亚洲视频大全| 欧美精品日日鲁夜夜添| 欧美插天视频在线播放| 国产精品成人一区二区三区吃奶| 欧美日韩专区| 亚洲国产精品美女| 久久久精品一区| 欧美激情亚洲综合一区| 欧美一级一区| 久久久91精品国产一区二区三区| 欧美日韩国产一区二区| 欧美日韩三级视频| 久久综合精品国产一区二区三区| 免费91麻豆精品国产自产在线观看| 一区二区视频免费完整版观看| 嫩草成人www欧美| 在线一区免费观看| 欧美美女视频| 久久噜噜噜精品国产亚洲综合| 久久久久久久久伊人| 夜夜嗨av一区二区三区| 欧美肥婆bbw| 在线视频欧美精品| 国产精品入口麻豆原神| 国产精品久久久久久久久久尿| 国产精品私拍pans大尺度在线| 久久亚洲精品中文字幕冲田杏梨| 国产欧美一区二区三区视频| 国产精品美女久久久久久2018| 亚洲国产精品va在线观看黑人| 亚洲午夜精品一区二区三区他趣| 久久久久久国产精品一区| 欧美日韩视频在线观看一区二区三区| 久久亚洲视频| 亚洲国产精品综合| 一本色道综合亚洲| 久久久久**毛片大全| 欧美在线网址| 欧美日本在线播放| 牛人盗摄一区二区三区视频| 欧美日韩免费网站|