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

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

2023-06-02
作者:Echo365
來源:電子技術(shù)應(yīng)用
關(guān)鍵詞: CH579 開發(fā)板測評

感謝電子技術(shù)應(yīng)用的這次活動,申請到了一塊CH579的開發(fā)板。

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

首先來一張系統(tǒng)的照片

微信截圖_20230602145520.png


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

開發(fā)環(huán)境是MounRiver Studio V1.8.4。

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

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

微信截圖_20230602145613.png

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

微信截圖_20230602151945.png


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

先修改系統(tǒng)時鐘,直覺上驅(qū)動文件里應(yīng)該有相關(guān)的時鐘配置函數(shù),那我去哪里找這個函數(shù)呢?

CH57x_clk.c文件里!找到一個函數(shù):

SetSysClock(CLK_SOURCE_PLL_40MHz); //重設(shè)系統(tǒng)時鐘,應(yīng)當(dāng)最先配置

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

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

DelayMs()

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

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

然后在主函數(shù)中調(diào)用下邊的config函數(shù)設(shè)置時基(注意傳入的參數(shù)40000,因為前邊系統(tǒng)主頻已經(jīng)改成了40M)

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

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

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

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

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

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

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

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

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

void user_uart_init(void)
{    
    GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);   
    GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);    
    UART1_DefInit();//調(diào)試串口初始化   
    UART1_ByteTrigCfg(UART_1BYTE_TRIG);//設(shè)置FIFO 1字節(jié)觸發(fā)   
    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);//設(shè)置FIFO 4字節(jié)觸發(fā)
    UART0_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );  
    NVIC_EnableIRQ( UART0_IRQn );
}

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

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

先看怎么移植letter-shell。

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

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

用戶裸機移植的話,只需要實現(xiàn)write函數(shù),init函數(shù)和shellHandler的調(diào)用。

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

微信截圖_20230602152016.png

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

右鍵CH579M的工程,點擊屬性->C/C++構(gòu)建->設(shè)置->工具設(shè)置

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

微信截圖_20230602152053.png


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

微信截圖_20230602152112.png


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

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,還有實現(xiàn)的函數(shù),寫函數(shù)直接調(diào)用的CH579給的驅(qū)動函數(shù)就可以了。

讀數(shù)據(jù)我們?nèi)ゴ谥袛嗬飳崿F(xiàn),不需要定義讀函數(shù)了,所以這里只要定義這兩個函數(shù)就完事了,剩下什么線程啊,鎖啊之類的,裸機我們用不到,就都刪除了。最后再到.h文件里把寫的函數(shù)和變量聲明一下就可以了。

串口1的中斷處理函數(shù)直接定義:

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

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

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

最后主函數(shù)長這樣:

微信截圖_20230602152205.png

還有個shell導(dǎo)出命令測試的函數(shù):

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);

主要完成了在主函數(shù)中解析到SHT30的溫度和濕度數(shù)據(jù),當(dāng)外部指令通過shell調(diào)用函數(shù)時候,將此時的系統(tǒng)時間tick值和溫濕度數(shù)據(jù)打印出來。

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

微信截圖_20230602152251.png


調(diào)試效果如下圖:

微信截圖_20230602152309.png


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

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


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美午夜一区| 黄色成人小视频| 看欧美日韩国产| 欧美亚洲一区二区在线| 亚洲一区二区在| 中国成人亚色综合网站| 亚洲精品一区二| 亚洲精品少妇网址| 亚洲精品少妇30p| 亚洲精品欧美在线| 亚洲理论在线| 99亚洲精品| 一区二区三区欧美成人| 日韩一级精品| 一区二区三区欧美视频| 国产精品99久久久久久久女警| 99视频一区| 亚洲图片欧美日产| 亚洲专区一区| 午夜精品在线| 欧美一区二区三区播放老司机| 欧美一区二区三区播放老司机| 午夜宅男久久久| 欧美一区视频在线| 久久精品视频在线播放| 久久蜜桃精品| 欧美gay视频| 欧美精品一区二区三区在线看午夜| 欧美精品一区二区三区视频| 欧美日本不卡| 国产精品大片| 国产老女人精品毛片久久| 国产午夜精品视频免费不卡69堂| 国产主播在线一区| 亚洲电影欧美电影有声小说| 亚洲精品在线二区| 亚洲一区精品在线| 欧美一区二区三区四区视频| 亚洲高清不卡av| 99综合精品| 午夜性色一区二区三区免费视频| 欧美亚洲一区三区| 久久免费视频在线| 欧美精品日日鲁夜夜添| 国产精品久久77777| 国产香蕉97碰碰久久人人| 一区二区三区在线观看国产| 亚洲国产专区校园欧美| 一区二区三区精品| 久久岛国电影| 日韩视频专区| 欧美一级大片在线免费观看| 久久综合激情| 欧美视频专区一二在线观看| 国产欧美一二三区| 亚洲欧洲日产国产网站| 亚洲女女女同性video| 亚洲激情av在线| 亚洲午夜91| 久久久精品视频成人| 欧美日产在线观看| 国产视频在线观看一区二区| 最近中文字幕mv在线一区二区三区四区| 一区二区三区不卡视频在线观看| 欧美在线亚洲综合一区| 99国产精品国产精品久久| 翔田千里一区二区| 欧美成人午夜剧场免费观看| 国产精品女人网站| 在线观看中文字幕亚洲| 亚洲一区二区三区影院| 亚洲人成在线免费观看| 亚洲欧美日韩精品| 欧美成人免费在线视频| 国产欧美精品国产国产专区| 亚洲国产精品久久久久婷婷884| 中文久久乱码一区二区| 亚洲国产视频一区二区| 性久久久久久久久久久久| 欧美高清成人| 国产视频精品xxxx| 亚洲精品欧美日韩专区| 久久精品女人| 亚洲女人小视频在线观看| 欧美aaa级| 国产视频不卡| 一区二区三区四区五区精品| 亚洲精品人人| 久久久一区二区| 国产精品久久久久一区二区三区共| 亚洲高清在线观看| 欧美资源在线| 香蕉成人久久| 欧美亚州一区二区三区 | 一区二区欧美在线| 麻豆精品视频在线| 国产欧美亚洲视频| 亚洲午夜av| 亚洲天天影视| 欧美国产日韩a欧美在线观看| 国产综合在线视频| 欧美一级淫片aaaaaaa视频| 午夜精品久久久久久久男人的天堂| 欧美福利一区二区| 尤物在线精品| 久久精品人人| 久久美女性网| 国产日韩欧美精品| 亚洲午夜久久久久久久久电影院| 一区二区久久久久久| 欧美极品在线视频| 亚洲黄色在线视频| 亚洲欧洲久久| 免费精品99久久国产综合精品| 国产综合自拍| 久久国产综合精品| 久久偷窥视频| 精品成人乱色一区二区| 亚洲电影有码| 另类激情亚洲| 亚洲成人资源网| 亚洲黑丝在线| 男同欧美伦乱| 亚洲激情女人| 一级成人国产| 欧美日韩视频在线| 一区二区三区不卡视频在线观看| 一区二区三区四区国产精品| 欧美乱人伦中文字幕在线| 亚洲黄色免费| 这里只有精品视频在线| 欧美午夜精品久久久久久孕妇| 日韩午夜在线| 亚洲一区二区三区777| 欧美视频在线一区二区三区| 在线综合亚洲| 欧美亚洲一级| 国产日韩欧美日韩| 欧美在线观看一区| 噜噜噜在线观看免费视频日韩| 亚洲福利视频网| 一本久道久久久| 欧美三区在线观看| 亚洲免费在线| 久久久欧美精品| 在线观看视频一区二区| 亚洲精品视频一区| 欧美视频一区在线观看| 一区二区三区回区在观看免费视频| 亚洲一区视频在线| 国产日韩精品一区| 91久久久久久| 欧美日韩综合精品| 午夜在线精品偷拍| 久久综合色8888| 亚洲日本中文字幕免费在线不卡| 亚洲一二三四区| 国产视频在线观看一区二区| 91久久极品少妇xxxxⅹ软件| 欧美日韩免费在线| 亚洲欧美日韩国产精品 | 欧美午夜电影网| 亚洲欧美日韩视频二区| 免费观看成人www动漫视频| 99av国产精品欲麻豆| 久久国产主播| 亚洲狠狠丁香婷婷综合久久久| 亚洲——在线| 激情视频亚洲| 中文网丁香综合网| 国产日韩专区| 日韩网站在线| 亚洲综合首页| 亚洲国内自拍| 国产精品xnxxcom| 欧美一区二区网站| 欧美电影打屁股sp| 亚洲女同性videos| 女人天堂亚洲aⅴ在线观看| 一级成人国产| 久久夜色精品国产亚洲aⅴ| 日韩视频免费大全中文字幕| 久久精品三级| 99这里只有精品| 久久天堂成人| 中日韩视频在线观看| 美女黄色成人网| 亚洲女人天堂av| 欧美精品激情在线观看| 欧美一级视频| 欧美午夜精品理论片a级按摩| 欧美在线播放视频| 欧美三日本三级少妇三2023 | 亚洲在线一区| 欧美高清在线播放| 欧美一区二区三区免费在线看| 欧美日韩18| 亚洲韩国日本中文字幕| 国产欧美 在线欧美| 正在播放亚洲|