国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【正點原子STM32連載】 第四十章 IIC實驗 摘自【正點原子】APM32E103最小系統(tǒng)板使用指南

這篇具有很好參考價值的文章主要介紹了【正點原子STM32連載】 第四十章 IIC實驗 摘自【正點原子】APM32E103最小系統(tǒng)板使用指南。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1)實驗平臺:正點原子APM32E103最小系統(tǒng)板
2)平臺購買地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套實驗源碼+手冊+視頻下載地址: http://www.openedv.com/docs/boards/xiaoxitongban

第四十章 IIC實驗

本章將介紹使用APM32E103驅(qū)動板載的EEPROM進行讀寫操作。通過本章的學(xué)習(xí),讀者將學(xué)習(xí)到使用GPIO模擬IIC時序以及EEPROM的驅(qū)動。
本章分為如下幾個小節(jié):
40.1 硬件設(shè)計
40.2 程序設(shè)計
40.3 下載驗證

40.1 硬件設(shè)計
40.1.1 例程功能

  1. 按下KEY_UP和KEY0按鍵,分別對24C02進行數(shù)據(jù)的寫入和讀取操作,讀取到的數(shù)據(jù)會顯示至LCD
  2. 可通過USMART對24C02進行讀寫一字節(jié)數(shù)據(jù)的操作
  3. LED0閃爍,指示程序正在運行
    40.1.2 硬件資源
  4. LED
    LED0 - PB5
  5. 按鍵
    KEY0 - PE4
    KEY_UP - PA0
  6. USART1(PA9、PA10連接至板載USB轉(zhuǎn)串口芯片上)
  7. 正點原子 2.8/3.5/4.3/7/10寸TFTLCD模塊(僅限MCU屏,16位8080并口驅(qū)動)
  8. 24C02
    IIC_SCL - PB6
    IIC_SDA - PB7
    40.1.3 原理圖
    本章實驗使用了板載的24C02芯片,該芯片是一個EEPROM,MCU是通過兩個GPIO與該EEPROM進行連接與通信的,該EEPROM與MCU的連接原理圖,如下圖所示:
    apm32e103vet6 id位置,stm32,嵌入式硬件,單片機

圖40.1.3.1 EEPROM與MCU的連接原理圖
40.2 程序設(shè)計
40.2.1 Geehy標準庫的GPIO驅(qū)動
本章實驗通過控制與EEPROM連接的GPIO模擬IIC時序,實現(xiàn)EEPROM的讀寫操作,對于GPIO,主要涉及GPIO的配置和讀寫操作,需要一下幾個步驟:
①:配置GPIO引腳為通用輸出模式、開漏輸出和禁止上拉/下拉
②:在與EEPROM通信時,根據(jù)需求控制指定GPIO引腳輸出指定電平
③:在與EEPROM通信時,根據(jù)需求讀取指定GPIO引腳上的輸入電平
在Geehy標準庫中對應(yīng)的驅(qū)動函數(shù)如下:
①:配置GPIO引腳
請見第10.2.1小節(jié)中配置GPIO引腳的相關(guān)內(nèi)容。
②:設(shè)置GPIO引腳輸出電平
請見第10.2.1小節(jié)中設(shè)置GPIO引腳輸出電平的相關(guān)內(nèi)容。
③:讀取GPIO引腳輸入電平
請見第11.2.1小節(jié)中讀取GPIO引腳輸入電平的相關(guān)內(nèi)容。
40.2.2 IIC驅(qū)動
本章實驗使用的IIC的軟件模擬的IIC,即控制GPIO模擬IIC的時序與外部器件進行通信。IIC驅(qū)動主要負責(zé)向EEPROM驅(qū)動提供IIC操作的各種函數(shù),例如:IIC起始信號、IIC停止信號等。本章實驗中,IIC的驅(qū)動代碼包括myiic.c和myiic.h兩個文件。
IIC驅(qū)動中,對GPIO相關(guān)的宏定義,如下所示:
/* 引腳定義 */

#define IIC_SCL_GPIO_PORT           GPIOB
#define IIC_SCL_GPIO_PIN            GPIO_PIN_6
#define IIC_SCL_GPIO_CLK_ENABLE()   do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); }while(0)

#define IIC_SDA_GPIO_PORT           GPIOB
#define IIC_SDA_GPIO_PIN            GPIO_PIN_7
#define IIC_SDA_GPIO_CLK_ENABLE()   do{ RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); }while(0)

/* IO操作 */
#define IIC_SCL(x)                  do{ x ?                           \ 
                                        GPIO_SetBit(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN) :           \
                                        GPIO_ResetBit(IIC_SCL_GPIO_PORT, IIC_SCL_GPIO_PIN);            \
                                    }while(0)

#define IIC_SDA(x)                  do{ x ?                           \
                                        GPIO_SetBit(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN) :           \
                                        GPIO_ResetBit(IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN);            \
                                    }while(0)
 
#define IIC_SDA_READ                GPIO_ReadInputBit( IIC_SDA_GPIO_PORT, IIC_SDA_GPIO_PIN)
IIC驅(qū)動中,IIC的初始化函數(shù),如下所示:
/**
 * @brief       初始化IIC
 * @param       無
 * @retval      無
 */
void iic_init(void)
{
    GPIO_Config_T gpio_init_struct;
    
    /* 使能時鐘 */
    IIC_SCL_GPIO_CLK_ENABLE();                      /* 使能IIC SCL引腳端口時鐘 */
    IIC_SDA_GPIO_CLK_ENABLE();                      /* 使能IIC SDA引腳端口時鐘 */
    
    /* 配置IIC SCL引腳 */
    gpio_init_struct.pin = IIC_SCL_GPIO_PIN;        /* IIC SCL引腳 */
    gpio_init_struct.speed = GPIO_SPEED_50MHz;      /* 高速 */
    gpio_init_struct.mode = GPIO_MODE_OUT_OD;       /* 開漏輸出 */
    GPIO_Config(IIC_SCL_GPIO_PORT, &gpio_init_struct);  
    
    /* 配置IIC SDA引腳 */
    gpio_init_struct.pin = IIC_SDA_GPIO_PIN;        /* IIC SDA引腳 */
    gpio_init_struct.speed = GPIO_SPEED_50MHz;      /* 高速 */
    gpio_init_struct.mode = GPIO_MODE_OUT_OD;       /* 開漏輸出 */
    GPIO_Config(IIC_SDA_GPIO_PORT, &gpio_init_struct);  
    
    iic_stop();                                     /* 停止IIC總線上所有設(shè)備 */
}

可以看到,IIC的初始化實際上就是配置IIC時鐘與數(shù)據(jù)信號對應(yīng)的GPIO引腳。
IIC驅(qū)動中對IIC的各種操作,例如產(chǎn)生IIC起始信號、產(chǎn)生IIC停止信號等,請讀者結(jié)合IIC的時序規(guī)定查看本實驗的配套實驗源碼。
40.2.3 EEPROM驅(qū)動
本章實驗的EEPROM驅(qū)動主要負責(zé)向應(yīng)用層提供EEPROM的初始化和讀寫數(shù)據(jù)等操作函數(shù)。本章實驗中,EEPROM的驅(qū)動代碼包括24cxx.c和24cxx.h兩個文件。
EEPROM驅(qū)動中,EEPROM的初始化函數(shù),如下所示:

/**
 * @brief       初始化AT24CXX
 * @param       無
 * @retval      無
 */
void at24cxx_init(void)
{
    iic_init();
}

可以看到,該函數(shù)實際上就是初始化了與EEPROM通訊的IIC。
EEPROM驅(qū)動中的其他對EEPROM的操作函數(shù),例如:EEPROM的讀寫函數(shù),請讀者結(jié)合24C02 EEPROM芯片的數(shù)據(jù)手冊查看本實驗的配套實驗源碼。
40.2.4 實驗應(yīng)用代碼
本章實驗的應(yīng)用代碼,如下所示:
/* 待寫入24C02的數(shù)據(jù) */

static const uint8_t g_text_buf[] = {"APM32 IIC TEST"};

/* 待寫入24C02數(shù)據(jù)的長度 */
#define TEXT_SIZE sizeof(g_text_buf)

int main(void)
{
    uint8_t t = 0;
    uint8_t key;
    uint8_t data[TEXT_SIZE];
    
    NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 設(shè)置中斷優(yōu)先級分組為組4 */
    sys_apm32_clock_init(15);                        /* 配置系統(tǒng)時鐘 */
    delay_init(120);                                 /* 初始化延時功能 */
    usart_init(115200);                              /* 初始化串口 */
    usmart_dev.init(120);                            /* 初始化USMART */
    led_init();                                      /* 初始化LED */
    lcd_init();                                      /* 初始化LCD */
    key_init();                                      /* 初始化按鍵 */
    at24cxx_init();                                  /* 初始化AT24CXX */
    
    lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "IIC TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 110, 200, 16, 16, "KEY_UP:Write  KEY0:Read", RED);
    
    while (at24cxx_check() != 0)                     /* 檢測不到24C02 */
    {
        lcd_show_string(30, 130, 200, 16, 16, "24C02 Check Failed!", RED);
        delay_ms(500);
        lcd_show_string(30, 130, 200, 16, 16, "Please Check!      ", RED);
        delay_ms(500);
        LED0_TOGGLE();
}
/* 24C02檢測正常 */
    lcd_show_string(30, 130, 200, 16, 16, "24C02 Ready!       ", RED);
    
    while (1)
    {
        t++;
        key = key_scan(0);
        
        if (key == WKUP_PRES)                        /* 寫入數(shù)據(jù) */
        {
            lcd_fill(0, 150, 239, 319, WHITE); 
            lcd_show_string( 30, 150, 200, 16, 16,
"Start Write 24C02....",
BLUE);
            at24cxx_write(0, (uint8_t *)g_text_buf, TEXT_SIZE);
            lcd_show_string( 30, 150, 200, 16, 16,
"24C02 Write Finished!",
BLUE);
        }
        else if (key == KEY0_PRES)                   /* 讀取數(shù)據(jù) */
        {
            lcd_show_string( 30, 150, 200, 16, 16,
"Start Read 24C02.... ",
BLUE);
            at24cxx_read(0, data, TEXT_SIZE);
            lcd_show_string(30, 150, 200, 16, 16,
"The Data Readed Is:  ",
BLUE);
            lcd_show_string(30, 170, 200, 16, 16, (char *)data, BLUE);
        }
        
        if (t == 20)
        {
            LED0_TOGGLE();
            t = 0;
        }
        
        delay_ms(10);
    }
}

從本章實驗的應(yīng)用代碼中可以看到,在初始化完EEPROM后,會檢測與EEPROM的連接是否正常,若與EEPROM的連接正常,則會不斷地等待按鍵輸入,若檢測到KEY_UP按鍵被按下,則會往EEPROM的指定地址中寫入指定的數(shù)據(jù),若檢測到KEY_0按鍵被按下,則會從EEPROM的指定地址中讀取數(shù)據(jù),并在LCD上進行顯示。
40.3 下載驗證
在完成編譯和燒錄操作后,若MCU與EEPROM的連接無誤,則可以在LCD上看到“24C02 Ready!”的提示信息,此時可以按下KEY_UP按鍵往EEPROM的指定地址寫入指定數(shù)據(jù),然后再按下KEY_0按鍵從EEPROM的指定地址將寫入的數(shù)據(jù)讀回來在LCD上進行顯示,此時便可以看到在LCD上顯示了“APM32 IIC TEST”的提示信息,該提示信息就是從EEPROM中讀回的數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-834053.html

到了這里,關(guān)于【正點原子STM32連載】 第四十章 IIC實驗 摘自【正點原子】APM32E103最小系統(tǒng)板使用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包