色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用GD32F310讀取HDC1080環(huán)境溫濕度

科技觀(guān)察員 ? 來(lái)源:兆易創(chuàng)新GD32 MCU ? 作者:cain ? 2022-04-15 15:23 ? 次閱讀

我拿到的開(kāi)發(fā)板實(shí)際板載的MCUGD32F310G8,QFN28pin封裝,基于ARM CORTEX M4內(nèi)核,主頻72MHz,芯片內(nèi)置64KB flash,8KB SRAM,兩路I2C外設(shè)。

poYBAGJZHUuANGnBAAFPRa5cvtA192.png

本次試用目的是利用GD32F310的I2C0實(shí)現(xiàn)對(duì)HDC1080的初始化及讀取環(huán)境溫濕度,并利用UART口在電腦上顯示出來(lái)。

1、新建工程

①首先建立一個(gè)新的項(xiàng)目文件夾,并在此文件夾下建立對(duì)應(yīng)子文件夾,我建立的文件如下圖所示,這個(gè)依個(gè)人習(xí)慣會(huì)有不同:

pYYBAGJZHUaANI-lAABHV_LSPPU501.png

② Document文件夾中存放對(duì)項(xiàng)目的說(shuō)明文件readme.txt;將系統(tǒng)支持包中的GD32F3x0_Firmware_Library_V2.2.0/Firmware文件夾中的內(nèi)容復(fù)制到Libraries文件夾中;Listing/Output文件夾用于存放項(xiàng)目編譯時(shí)生成的目標(biāo)文件及l(fā)ist文件,在MDK的魔術(shù)棒中進(jìn)行設(shè)置路徑;users文件夾中存放main文件及我們自已寫(xiě)的代碼;Project文件夾中存放MDK項(xiàng)目文件;

③打開(kāi)MDK keil5,首先要先導(dǎo)入GD32F310G文件支持包。

poYBAGJZHUGAYE_hAAIuprokS6U913.png

④建立新的項(xiàng)目,選擇所使用的MCU,我們選擇GD32F330G8,如下圖所示

pYYBAGJZHT2ACcnKAAIiA6Rz0Z4597.png

⑤新項(xiàng)目中建立如下文件組,并導(dǎo)入啟動(dòng)文件和外設(shè)支持包。

poYBAGJZHTqAArcDAAHD3JCcZ-o737.png

⑥點(diǎn)擊魔術(shù)棒工具進(jìn)行項(xiàng)目設(shè)置。在C/C++選項(xiàng)中添加include文件路徑;

pYYBAGJZHTaAQD2xAAFXbSyTJts568.png

⑦點(diǎn)擊Debug選項(xiàng)進(jìn)行GDLink的設(shè)置,要選擇CMSIS_DAP Debugger,并將Reset and Run打勾。

pYYBAGJZHTCAYknXAAFsWb10O54560.png

⑧這樣整個(gè)項(xiàng)目的配置基本就結(jié)束了,可以在main.c文件中建立一個(gè)空循環(huán),編譯測(cè)試項(xiàng)目建立是否正確無(wú)誤。

2、硬件映射

硬件映射的目的是按目前的硬件連接建立.h文件,如下圖所示:

pYYBAGJZHSyARUsWAAKHXC6G9oM705.png

因此基于開(kāi)發(fā)板I2C0采用的是PB6/PB7引腳,因?yàn)樾枰蛴∽x出的值,UART0使用的是PA9/PA10引腳。

3、編寫(xiě)代碼

①UART0初始化和printf函數(shù)重定向:

void UART_TypeInit(void)
{
    gpio_deinit(UART0_GPIO_PORT);
    usart_deinit(USART0);
    rcu_periph_clock_enable(UART0_GPIO_PORT_CLK);
    gpio_mode_set(UART0_GPIO_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE,UART0_TX_PIN | UART0_RX_PIN);
    gpio_output_options_set(UART0_GPIO_PORT,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,UART0_TX_PIN | UART0_RX_PIN);
    gpio_af_set(UART0_GPIO_PORT,GPIO_AF_1,UART0_TX_PIN | UART0_RX_PIN);
    
    rcu_periph_clock_enable(UART0_CLK);
    usart_baudrate_set(USART0,UART0_Baudrate);
    usart_parity_config(USART0,USART_PM_NONE);
    usart_word_length_set(USART0,USART_WL_8BIT);
    usart_stop_bit_set(USART0,USART_STB_1BIT);
    usart_enable(USART0);
    usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
    usart_receive_config(USART0,USART_RECEIVE_ENABLE);
}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0,USART_FLAG_TBE)); 
        
    return ch;
}

②I2C0外設(shè)初始化:

void I2C0_TypeInit(void)
{
    gpio_deinit(I2C0_GPIO_PORT);
    i2c_deinit(I2C0);
    rcu_periph_clock_enable(I2C0_GPIO_PORT_CLK);
    gpio_mode_set(I2C0_GPIO_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE,I2C0_SCL_PIN | I2C0_SDA_PIN);
    gpio_output_options_set(I2C0_GPIO_PORT,GPIO_OTYPE_OD,GPIO_OSPEED_MAX,I2C0_SCL_PIN | I2C0_SDA_PIN);
    gpio_af_set(I2C0_GPIO_PORT,GPIO_AF_1,I2C0_SCL_PIN | I2C0_SDA_PIN);
    
    rcu_periph_clock_enable(I2C0_CLK);
    i2c_clock_config(I2C0,I2C0_Frequence,I2C_DTCY_2);
    i2c_mode_addr_config(I2C0,I2C_I2CMODE_ENABLE,I2C_ADDFORMAT_7BITS,I2C0_OWN_Address);
    i2c_enable(I2C0);
    i2c_ack_config(I2C0,I2C_ACK_ENABLE);
}

③讀寄存器操作:

void  I2C0_Register_Read(uint8_t* B_buffer, uint8_t read_address,uint16_t number_of_byte)
{
     /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));

    if(2 == number_of_byte){
        i2c_ackpos_config(I2C0,I2C_ACKPOS_NEXT);
    }
    
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);
    
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
    
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, HDC1080_Addr, I2C_TRANSMITTER);
    
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
    
    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
    
    /* wait until the transmit data buffer is empty */
    while(SET != i2c_flag_get( I2C0 , I2C_FLAG_TBE));

    /* enable I2C0*/
    i2c_enable(I2C0);
    
    /* send the EEPROM's internal address to write to */
    i2c_data_transmit(I2C0, read_address);  
    
    /* wait until BTC bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
        
        delay_1ms(20);
    
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);
    
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
    
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, HDC1080_Addr, I2C_RECEIVER);

    if(number_of_byte < 3){
        /* disable acknowledge */
        i2c_ack_config(I2C0,I2C_ACK_DISABLE);
    }
    
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
    
    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);
    
    if(1 == number_of_byte){
        /* send a stop condition to I2C bus */
        i2c_stop_on_bus(I2C0);
    }
    
    /* while there is data to be read */
    while(number_of_byte){
        if(3 == number_of_byte){
            /* wait until BTC bit is set */
            while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));

            /* disable acknowledge */
            i2c_ack_config(I2C0,I2C_ACK_DISABLE);
        }
        if(2 == number_of_byte){
            /* wait until BTC bit is set */
            while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
            
            /* send a stop condition to I2C bus */
            i2c_stop_on_bus(I2C0);
        }
        
                delay_1ms(1);
        /* wait until the RBNE bit is set and clear it */
        if(i2c_flag_get(I2C0, I2C_FLAG_RBNE)){
            /* read a byte from the EEPROM */
            *B_buffer = i2c_data_receive(I2C0);
            
            /* point to the next location where the byte read will be saved */
            B_buffer++; 
            
            /* decrement the read bytes counter */
            number_of_byte--;
        } 
    }
    
    /* wait until the stop condition is finished */
    while(I2C_CTL0(I2C0)&0x0200);
    
    /* enable acknowledge */
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);

    i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT);
}

④寫(xiě)寄存器操作:

void I2C0_Byte_Write(uint8_t* P_buffer, uint8_t write_address)
{
    uint8_t i;
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));

    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);

    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));

    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, HDC1080_Addr, I2C_TRANSMITTER);

    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));

    /* clear the ADDSEND bit */
    i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);

    /* wait until the transmit data buffer is empty */
    while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE));

    /* send the EEPROM's internal address to write to : only one byte address */
    i2c_data_transmit(I2C0, write_address);

    /* wait until BTC bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));
    
    for(i=0;i<2;i++)
    {

        /* send the byte to be written */
        i2c_data_transmit(I2C0, *(P_buffer+i)); 

        /* wait until BTC bit is set */
        while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
    
    }

    /* send a stop condition to I2C bus */
    i2c_stop_on_bus(I2C0);

    /* wait until the stop condition is finished */
    while(I2C_CTL0(I2C0)&0x0200);
}

⑤對(duì)HDC1080進(jìn)行初始化并讀取其ID:

void HDC1080_Init(void)
{
    uint8_t    IDBuffer[2]={0};
    uint8_t InitSetup[2]={0x90,0x00};
    uint32_t SID[3]={0},MID=0,DID=0;
    I2C0_Byte_Write(InitSetup,CONFIGURATION);
    delay_1ms(20);
    
    I2C0_Register_Read(IDBuffer,DEVICE_ID,2);
    DID = (((uint32_t)IDBuffer[0])<<8 | IDBuffer[1]);
    printf("The DeviceID is 0x%x\n\r",DID);
    I2C0_Register_Read(IDBuffer,MANUFACTURE_ID,2);
    MID = ((uint16_t) IDBuffer[0]<<8 | IDBuffer[1]);
    printf("The ManufactureID is 0x%x\n\r",MID);
    I2C0_Register_Read(IDBuffer,FIRST_SID,2);
    SID[0] = ((uint16_t) IDBuffer[0]<<8 | IDBuffer[1]); 
    I2C0_Register_Read(IDBuffer,MID_SID,2);
    SID[1] = ((uint16_t) IDBuffer[0]<<8 | IDBuffer[1]);
    I2C0_Register_Read(IDBuffer,LAST_SID,2);
    SID[2] = ((uint16_t) IDBuffer[0]<<8 | IDBuffer[1]);
    printf("The First bytes of the serial ID of the part is 0x%x\n\r",SID[0]);
    printf("The MID bytes of the serial ID of the part is 0x%x\n\r",SID[1]);
    printf("The Last bytes of the serial ID of the part is 0x%x\n\r",SID[2]);
    printf("\n\r");
}

⑥讀取溫濕度值并轉(zhuǎn)換成十進(jìn)制顯示:

void readSensor(void)
{
  //holds 2 bytes of data from I2C Line
  uint8_t Buffer_Byte[2];

  //holds the total contents of the temp register
  uint16_t temp,hum;

  //holds the total contents of the humidity register
  double temperature=0,humidity=0 ;
    
    I2C0_Register_Read(Buffer_Byte,T_MEASUREMENT,2);
    temp = (((uint32_t)Buffer_Byte[0])<<8 | Buffer_Byte[1]);
    temperature = (double)(temp)/(65536)*165-40;
    printf("The temperature is %.2f\n\r",temperature);
    
    I2C0_Register_Read(Buffer_Byte,RH_MEASUREMENT,2);
    hum = (((uint32_t)Buffer_Byte[0])<<8 | Buffer_Byte[1]);
    humidity = (double)(hum)/(65536)*100;
    printf("The humidity is %.2f%%\n\r",humidity);    
}

⑦main函數(shù):

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* configure periphreal */
  systick_Init();
    LED_TypeInit();
//    NVIC_config();
//    KEY_EXTI_TypeInit();
    UART_TypeInit();
    I2C0_TypeInit();
    printf("**********DEMO START**********\n\r");
    printf("******************************\n\r");
    HDC1080_Init();

    while(1) 
    {
        readSensor();
        delay_1ms(1000);
    }
}

4、編譯下載

①Build項(xiàng)目文件:

pYYBAGJZHR-Aau-GAAF4k5tcoFo234.png

②沒(méi)有錯(cuò)誤,直接下載到開(kāi)發(fā)板中,可以打開(kāi)串口看到讀出溫濕度每隔1S讀一次并打印出來(lái),與環(huán)境溫度計(jì)比較取值還是比較準(zhǔn)確的。

pYYBAGJZHRuAMxGEAAX3roeRMRU159.png

pYYBAGJZHReAKZFCAAI6fFkP86M893.png

5、試用總結(jié)

GD32F310G8芯片采用4x4 QFN28封裝,結(jié)構(gòu)可以設(shè)計(jì)相當(dāng)緊湊,軟件開(kāi)發(fā)資源也是很豐富,雖然功能不算特別強(qiáng)大,但主流的外設(shè)基本都有囊括,在目前國(guó)產(chǎn)替代的大環(huán)境之下,應(yīng)用前景還是相當(dāng)廣泛的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1489

    瀏覽量

    123963
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1239

    瀏覽量

    101469
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HDC1080濕度和正常濕度計(jì)負(fù)偏差10左右,為什么?

    HDC1080的測(cè)試溫度檢測(cè)是正常的,但是濕度濕度低10左右,用了4塊板子基本都是一個(gè)問(wèn)題,偏差的一致性倒是很好。大家有沒(méi)有類(lèi)似的情況。
    發(fā)表于 11-29 07:55

    HDC1080損壞的可能原因有哪些?

    我司今年分批采購(gòu)了貴司HDC1080芯片,在現(xiàn)場(chǎng)使用過(guò)程中,每個(gè)批次或多或少都有損壞現(xiàn)象。首先能確認(rèn)的是電路圖已經(jīng)按照datasheet中繪制,以及增加了ESD,TVS管保護(hù)。其次,該芯片出廠(chǎng)前進(jìn)
    發(fā)表于 12-02 07:59

    HDC1080濕度測(cè)量非常不準(zhǔn)確,尤其是在高濕度的情況下,怎么解決?

    (1)HDC1080溫濕度傳感器芯片,當(dāng)環(huán)境濕度在80%左右的時(shí)候,HDC1080檢測(cè)到的濕度
    發(fā)表于 12-03 06:39

    使用HDC1080測(cè)溫濕度遇到的疑問(wèn)求解答

    今天使用HDC1080測(cè)溫濕度遇到下面情況,請(qǐng)知道的的幫忙解釋下,謝謝! 首先說(shuō)明下,我查看HDC1080規(guī)格書(shū),沒(méi)有找到說(shuō)明HDC1080測(cè)試溫度結(jié)果有機(jī)會(huì)小數(shù),然后測(cè)試溫度,根據(jù)
    發(fā)表于 12-09 06:15

    hdc1080可以正常讀取設(shè)備ID,但是當(dāng)讀取溫濕度值時(shí)總是0,為什么?如何解決?

    hdc1080可以正常讀取設(shè)備ID,但是當(dāng)讀取溫濕度值時(shí)總是0,配置寄存器值配置為0x1000,是默認(rèn)值,,請(qǐng)問(wèn)該如何解決啊?
    發(fā)表于 12-12 06:04

    HDC1080不能夠測(cè)量溫度和濕度是什么原因呢?

    開(kāi)始使用HDC1080 大概20片,一開(kāi)始20片都能夠正常測(cè)量溫度和濕度,大概過(guò)了有1周時(shí)間后發(fā)現(xiàn)有2片HDC1080完全不能夠測(cè)量溫度和濕度,1片只能測(cè)試溫度,
    發(fā)表于 12-18 07:27

    請(qǐng)問(wèn)HDC1080溫濕度傳感器中間的熱焊盤(pán)該怎么接?

    HDC1080的datasheet中,有這樣的描述: DAP DAP - Die Attach Pad. Should be left floating. (On bottom
    發(fā)表于 12-24 08:19

    hdc1080讀取溫濕度值為0

    hdc1080可以正常讀取設(shè)備ID,但是當(dāng)讀取溫濕度值時(shí)總是0,配置寄存器值配置為0x1000,是默認(rèn)值,,請(qǐng)問(wèn)該如何解決啊?
    發(fā)表于 03-05 06:26

    MSP430FR2433無(wú)法讀取HDC1080

    我在嘗試了硬件IIC讀取無(wú)果后,嘗試模擬IIC讀取,但讀到的始終都為0,實(shí)在不解,讀HDC1080的0XFE的ID也為0,有沒(méi)有用過(guò)的大佬交流一下
    發(fā)表于 07-02 08:49

    HDC1080溫濕度傳感器的使用步驟

    HDC1080溫濕度傳感器的驅(qū)動(dòng)鏈接(函數(shù)都封裝好了,稍微改改就能用了):沒(méi)有積分的小伙伴給我發(fā)消息或者留下郵箱!!白嫖了網(wǎng)上這么多資料也該回饋回饋了!HDC1080使用步驟:1.編寫(xiě)I2C驅(qū)動(dòng)
    發(fā)表于 11-25 06:14

    詳解HDC1080溫濕度傳感器

    HDC1080是什么? HDC1080溫濕度傳感器有哪些功能和典型應(yīng)用呢?
    發(fā)表于 01-18 06:08

    HDC1080溫濕度驅(qū)動(dòng)IIC/I2C/STM32的過(guò)程是怎樣的?

    HDC1080溫濕度驅(qū)動(dòng)IIC/I2C/STM32的過(guò)程是怎樣的?
    發(fā)表于 02-28 06:41

    利用GD32F310的I2C0實(shí)現(xiàn)對(duì)HDC1080的初始化及讀取環(huán)境溫濕度

    ,芯片內(nèi)置64KB flash,8KB SRAM,兩路I2C外設(shè)。  本次試用目的是利用GD32F310的I2C0實(shí)現(xiàn)對(duì)HDC1080的初始化及讀取
    發(fā)表于 11-08 16:24

    HDC1080 HDC1080 具有溫度傳感器的低功耗、高精度數(shù)字濕度傳感器

    電子發(fā)燒友網(wǎng)為你提供TI(ti)HDC1080相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有HDC1080的引腳圖、接線(xiàn)圖、封裝手冊(cè)、中文資料、英文資料,HDC1080真值表,HDC1080管腳等資料,
    發(fā)表于 09-21 16:46
    <b class='flag-5'>HDC1080</b> <b class='flag-5'>HDC1080</b> 具有溫度傳感器的低功耗、高精度數(shù)字<b class='flag-5'>濕度</b>傳感器

    HDC1080傳感器使用

    HDC1080溫濕度傳感器的驅(qū)動(dòng)鏈接(函數(shù)都封裝好了,稍微改改就能用了):沒(méi)有積分的小伙伴給我發(fā)消息或者留下郵箱!!白嫖了網(wǎng)上這么多資料也該回饋回饋了!HDC1080使用步驟:1.編寫(xiě)I2C驅(qū)動(dòng)
    發(fā)表于 11-16 21:06 ?22次下載
    <b class='flag-5'>HDC1080</b>傳感器使用
    主站蜘蛛池模板: 中文中幕无码亚洲在线| 欧美日韩1区| 男人叼女人| 亚洲成人国产| qvod电影在线观看| 加勒比一本之道高清视频在线观看| 欧美人xxxxx| 印度性hd18| 国产婷婷综合在线视频中文| 秋霞成人午夜鲁丝一区二区三区| 曰韩一本道高清无码av| 国产精品免费观看视频播放| 嫩草影院未满十八岁禁止入内| 亚洲精品第一页| 成人小视频在线观看免费| 浪荡受自我调教纯肉BL| 亚洲成人日韩| 公开超碰在线视频| 内射人妻骚骚骚| 月夜直播免费看| 国产最新精品亚洲2021不卡| 色噜噜狠狠色综合中文字幕| 99精品国产高清自在线看超| 久久国产主播福利在线| 亚洲国产日韩a精品乱码| 国产成人国产在线观看入口| 欧美怡红院视频一区二区三区| 中文字幕人妻无码系列第三区 | 欧美乱码伦视频免费66网| 一二三四在线高清中文版免费观看电影 | 亚洲网站视频在线观看| 国产精品一区二区四区| 日韩欧美中文字幕一区| 99久久久无码国产AAA精品| 久久伊人免费| 伊人久久综合| 吉吉影音先锋av资源网| 亚洲国产精品综合久久一线| 国产精品无需播放器| 视频一区视频二区在线观看| 成人影院久久久久久影院|