国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

STM32F103學(xué)習(xí)筆記(1)——FreeRTOS下模擬I2C

發(fā)布者:電子設(shè)計(jì)藝術(shù)家最新更新時(shí)間:2025-02-21 來源: jianshu關(guān)鍵字:STM32F103  FreeRTOS  模擬I2C 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

一、硬件連接

功能口引腳
SCLPB.6
SDAPB.5
二、移植文件

鏈接:https://pan.baidu.com/s/1wxbQTMlnX2pavrbW2RYg4g 提取碼:dxex
將 board_i2c.c 和 board_i2c.h 兩個(gè)文件加入工程的User文件夾下

注意:延時(shí)函數(shù)使用了FreeRTOS的vTaskDelay任務(wù)延時(shí)函數(shù)


2.1 board_i2c.c

/*********************************************************************

 * INCLUDES

 */

#include 'FreeRTOS.h'

#include 'task.h' 

 

#include 'board_i2c.h'

#include 'board_systick.h'


static void SDA_OUT_MODE(void);

static void SDA_IN_MODE(void);


/*********************************************************************

 * PUBLIC FUNCTIONS

 */

/**

 @brief I2C驅(qū)動(dòng)初始化,采用模擬IO的方式實(shí)現(xiàn)

 @param 無(wú)

 @return 無(wú)

*/

void IIC_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(IIC_SCL_CLK | IIC_SDA_CLK, ENABLE);

    

    GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            

    GPIO_Init(IIC_SCL_PORT, &GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;

    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);

    

    IIC_Stop();             // 給一個(gè)停止信號(hào), 復(fù)位I2C總線上的所有設(shè)備到待機(jī)模式

}


/**

 @brief CPU發(fā)起I2C總線啟動(dòng)信號(hào)

 @param 無(wú)

 @return 無(wú)

*/

void IIC_Start(void)

{

    SDA_OUT_MODE();         // SDA線輸出模式

    

    IIC_SDA_1();                      

    IIC_SCL_1();

    vTaskDelay(1);

    IIC_SDA_0();            // 當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)下跳沿表示I2C總線啟動(dòng)信號(hào)

    vTaskDelay(1);    

    IIC_SCL_0();            // 鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) 

}   


/**

 @brief CPU發(fā)起I2C總線停止信號(hào)

 @param 無(wú)

 @return 無(wú)

*/

void IIC_Stop(void)

{

    SDA_OUT_MODE();         // SDA線輸出模式

    

    IIC_SCL_0();

    IIC_SDA_0();          

    IIC_SCL_1();

    vTaskDelay(1);

    IIC_SDA_1();            // 當(dāng)SCL高電平時(shí),SDA出現(xiàn)一個(gè)上跳沿表示I2C總線停止信號(hào)       

    vTaskDelay(1);

}


/**

 @brief CPU向I2C總線設(shè)備發(fā)送8bit數(shù)據(jù)

 @param ucByte -[in] 等待發(fā)送的字節(jié)

 @return 無(wú)

*/  

void IIC_SendByte(uint8_t ucByte)

{                        

    uint8_t i;  

    

    SDA_OUT_MODE();         // SDA線輸出模式

    

    IIC_SCL_0();            // 拉低時(shí)鐘開始數(shù)據(jù)傳輸

    

    for(i = 0; i < 8; i++)

    {              

        if(ucByte & 0x80)   

        {            

            IIC_SDA_1();

        }

        else

        {

            IIC_SDA_0();

        }

        ucByte <<= 1;   

        vTaskDelay(1);        

        IIC_SCL_1();

        vTaskDelay(1);

        IIC_SCL_0();

        vTaskDelay(1);        

    }    


/**

 @brief CPU從I2C總線設(shè)備讀取8bit數(shù)據(jù)

 @param 無(wú)

 @return 讀到的數(shù)據(jù)

*/ 

uint8_t IIC_ReadByte(void)

{

    uint8_t i = 0;

    uint8_t value = 0;

    

    SDA_IN_MODE();          // SDA線輸入模式

    

    for(i = 0; i < 8; i++)

    {

        value <<= 1;

        IIC_SCL_1();

        vTaskDelay(1);

        if(IIC_SDA_READ())

        {

            value++;

        }            

        IIC_SCL_0(); 

        vTaskDelay(1); 

    }                   

    IIC_Ack();

    

    return value;

}


/**

 @brief CPU產(chǎn)生一個(gè)時(shí)鐘,并讀取器件的ACK應(yīng)答信號(hào)

 @param 無(wú)

 @return 返回0表示正確應(yīng)答,1表示無(wú)器件響應(yīng)

*/

uint8_t IIC_WaitAck(void)

{

    uint8_t result = 0; 

    

    SDA_IN_MODE();          // SDA線輸入模式

    

    IIC_SDA_1();            // CPU釋放SDA總線

    vTaskDelay(1); 

    IIC_SCL_1();            // CPU驅(qū)動(dòng)SCL = 1, 此時(shí)器件會(huì)返回ACK應(yīng)答

    vTaskDelay(1);

    if(IIC_SDA_READ())

    {

        result = 1;

    }

    else

    {

        result = 0;

    }

    IIC_SCL_0();

    vTaskDelay(1);


    return result;  


/**

 @brief CPU產(chǎn)生一個(gè)ACK信號(hào)

 @param 無(wú)

 @return 無(wú)

*/

void IIC_Ack(void)

{

    SDA_OUT_MODE();         // SDA線輸出模式

    

    IIC_SDA_0();            // CPU驅(qū)動(dòng)SDA = 0

    vTaskDelay(1);

    IIC_SCL_1();            // CPU產(chǎn)生1個(gè)時(shí)鐘

    vTaskDelay(1);

    IIC_SCL_0();

    vTaskDelay(1);

    IIC_SDA_1();            // CPU釋放SDA總線

}


/**

 @brief CPU產(chǎn)生1個(gè)NACK信號(hào)

 @param 無(wú)

 @return 無(wú)

*/    

void IIC_NAck(void)

{

    SDA_OUT_MODE();         // SDA線輸出模式

    

    IIC_SDA_1();            // CPU驅(qū)動(dòng)SDA = 1

    vTaskDelay(1);

    IIC_SCL_1();            // CPU產(chǎn)生1個(gè)時(shí)鐘

    vTaskDelay(1);

    IIC_SCL_0();

    vTaskDelay(1);

}


/**

 @brief 檢測(cè)I2C總線設(shè)備,CPU向發(fā)送設(shè)備地址,然后讀取設(shè)備應(yīng)答來判斷該設(shè)備是否存在

 @param address -[in] 設(shè)備的I2C總線地址+讀寫控制bit(0 = w, 1 = r)

 @return 0 - 表示正確, 1 - 表示未探測(cè)到

*/  

uint8_t IIC_CheckDevice(uint8_t address)

{

    uint8_t ucAck;


    IIC_Init();             // 初始化I2C

    IIC_Start();            // 發(fā)送啟動(dòng)信號(hào)

    IIC_SendByte(address);  // 設(shè)備的I2C總線地址+讀寫控制bit(0 = w, 1 = r)

    ucAck = IIC_WaitAck();  // 檢測(cè)設(shè)備的ACK應(yīng)答

    IIC_Stop();             // 發(fā)送停止信號(hào)


    return ucAck;

}



/*********************************************************************

 * LOCAL FUNCTIONS

 */

/**

 @brief SDA輸出配置 

 @param 無(wú)

 @return 無(wú)

*/ 

static void SDA_OUT_MODE(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);

}


/**

 @brief SDA輸入配置 

 @param 無(wú)

 @return 無(wú)

*/ 

static void SDA_IN_MODE(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    

    GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(IIC_SDA_PORT, &GPIO_InitStructure);

}


/****************************************************END OF FILE****************************************************/



2.2 board_i2c.h

#ifndef _BOARD_I2C_H_

#define _BOARD_I2C_H_


/*********************************************************************

 * INCLUDES

 */

#include 'stm32f10x.h'


/*********************************************************************

 * DEFINITIONS

 */

// I2C_SCL時(shí)鐘

#define IIC_SCL_CLK         RCC_APB2Periph_GPIOB        // GPIO端口時(shí)鐘

#define IIC_SCL_PORT        GPIOB                       // GPIO端口

#define IIC_SCL_PIN         GPIO_Pin_6                  // GPIO引腳

// I2C_SDA時(shí)鐘

#define IIC_SDA_CLK         RCC_APB2Periph_GPIOB        // GPIO端口時(shí)鐘

#define IIC_SDA_PORT        GPIOB                       // GPIO端口

#define IIC_SDA_PIN         GPIO_Pin_5                  // GPIO引腳


/*********************************************************************

 * MACROS

 */

#define IIC_SCL_0()         GPIO_ResetBits(IIC_SCL_PORT, IIC_SCL_PIN) 

#define IIC_SCL_1()         GPIO_SetBits(IIC_SCL_PORT, IIC_SCL_PIN)

#define IIC_SDA_0()         GPIO_ResetBits(IIC_SDA_PORT, IIC_SDA_PIN) 

#define IIC_SDA_1()         GPIO_SetBits(IIC_SDA_PORT, IIC_SDA_PIN) 

#define IIC_SDA_READ()      GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN) 


/*********************************************************************

 * API FUNCTIONS

 */

void IIC_Init(void);             

void IIC_Start(void);

void IIC_Stop(void);

void IIC_SendByte(uint8_t ucByte);

uint8_t IIC_ReadByte(void);

uint8_t IIC_WaitAck(void);

void IIC_Ack(void);

void IIC_NAck(void);

uint8_t IIC_CheckDevice(uint8_t address);

[1] [2]
關(guān)鍵字:STM32F103  FreeRTOS  模擬I2C 引用地址:STM32F103學(xué)習(xí)筆記(1)——FreeRTOS下模擬I2C

上一篇:STM32F103學(xué)習(xí)筆記(2)——收音機(jī)模塊TEA5767使用
下一篇:OSW-MMOS直驅(qū)方向盤DIY過程記錄2-PWM+DIR模式

推薦閱讀最新更新時(shí)間:2025-06-05 20:49

將STemWin移植到在STM32F103RCT6上的FreeRTOS
1、版本信息 STM32固件庫(kù)V3.5.0 FreeRTOS V8.2.3 STemWin 5.26 Keil 4 2、移植步驟 將FreeRTOS移植到STM32F103RCT6上,這個(gè)前面的博客有提到,課參考; 添加LCD屏的驅(qū)動(dòng)代碼,在這個(gè)實(shí)驗(yàn)中使用的正點(diǎn)原子的MINI板,使用的ILI9341的驅(qū)動(dòng)芯片,添加好并在裸機(jī)下測(cè)試可用; 將STemWin 5.26相關(guān)文件添加到工程中,如下圖 將涉及到的頭文件路徑加到工程的頭文件路徑中去 修改GUIConf.c文件中的一處地方,這個(gè)地方根據(jù)芯片來改,太大了編譯會(huì)不通過,提示內(nèi)存不足。如下圖 在FreeRTOS創(chuàng)建一個(gè)任務(wù)來顯示,效果如圖 至此,就
[單片機(jī)]
將STemWin移植到在<font color='red'>STM32F103</font>RCT6上的<font color='red'>FreeRTOS</font>上
C51單片機(jī)模擬I2C總線驅(qū)動(dòng)程序設(shè)計(jì)(2)
/************************************ I2C_RcvB ******************************** 函數(shù)名:uchar I2C_RcvB() 入口: 出口:uchar 型數(shù)據(jù) 功能描述: 接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),收完后需要調(diào)用應(yīng)答函數(shù)。 調(diào)用函數(shù): 全局變量: ******************************************************************************* uchar I2C_RcvB() { uchar retc;
[單片機(jī)]
STM32+FreeRTOS+CUBEMX_學(xué)習(xí)筆記(五 )ADC采樣
前言 ADC采樣是一種常見的功能 1、STM系列ADC的參數(shù): 手冊(cè)中關(guān)于ADC的介紹 ● 12位分辨率 ● 轉(zhuǎn)換結(jié)束、注入轉(zhuǎn)換結(jié)束和發(fā)生模擬看門狗事件時(shí)產(chǎn)生中斷 ● 單次和連續(xù)轉(zhuǎn)換模式 ● 從通道0到通道n的自動(dòng)掃描模式 ● 自校準(zhǔn) ● 帶內(nèi)嵌數(shù)據(jù)一致性的數(shù)據(jù)對(duì)齊 ● 采樣間隔可以按通道分別編程 ● 規(guī)則轉(zhuǎn)換和注入轉(zhuǎn)換均有外部觸發(fā)選項(xiàng) ● 間斷模式 ● 雙重模式(帶2個(gè)或以上ADC的器件) ● ADC轉(zhuǎn)換時(shí)間: ─ STM32F103xx增強(qiáng)型產(chǎn)品:時(shí)鐘為56MHz時(shí)為1μs(時(shí)鐘為72MHz為1.17μs) ─ STM32F101xx基本型產(chǎn)品:時(shí)鐘為28MHz時(shí)為1μs(時(shí)鐘為36MHz為1.55μs) ─ STM3
[單片機(jī)]
STM32+<font color='red'>FreeRTOS</font>+CUBEMX_學(xué)習(xí)筆記(五 )ADC采樣
在stm32的freeRTOS上進(jìn)行微秒級(jí)延時(shí)
因?yàn)闀r(shí)間片的原因freeRTOS自身貌似無(wú)法進(jìn)行微秒級(jí)的延時(shí),實(shí)測(cè)通過以下函數(shù)可以進(jìn)行微秒級(jí)的消息 dwt_stm32_delay.h #ifndef DWT_STM32_DELAY_H #define DWT_STM32_DELAY_H #ifdef __cplusplus extern C { #endif #include stm32f4xx_hal.h /** * @brief Initializes DWT_Cycle_Count for DWT_Delay_us function * @return Error DWT counter * 1: DWT counter Error *
[單片機(jī)]
STM32F103學(xué)習(xí)筆記(3)——讀寫內(nèi)部Flash
一、簡(jiǎn)介 在STM32芯片內(nèi)部有一個(gè) FLASH 存儲(chǔ)器,它主要用于存儲(chǔ)代碼,我們?cè)陔娔X上編寫好應(yīng)用程序后,使用下載器把編譯后的代碼文件燒錄到該內(nèi)部 FLASH 中,由于 FLASH 存儲(chǔ)器的內(nèi)容在掉電后不會(huì)丟失,芯片重新上電復(fù)位后,內(nèi)核可從內(nèi)部 FLASH 中加載代碼并運(yùn)行。 STM32 的內(nèi)部 FLASH 包含主存儲(chǔ)器、系統(tǒng)存儲(chǔ)器以及選項(xiàng)字節(jié)區(qū)域,它們的地址分布及大小見下表 主存儲(chǔ)器 一般我們說 STM32 內(nèi)部 FLASH 的時(shí)候,都是指這個(gè)主存儲(chǔ)器區(qū)域,它是存儲(chǔ)用戶應(yīng)用程序的空間,芯片型號(hào)說明中的 256K FLASH、512K FLASH 都是指這個(gè)區(qū)域的大小。 主存儲(chǔ)器分為 256 頁(yè),每頁(yè)大小為 2
[單片機(jī)]
gd32f103可以完全替代stm32f103
GD32F103是中國(guó)廠商GigaDevice推出的一款低成本、高性能的微控制器產(chǎn)品線。STM32F103是意法半導(dǎo)體(STMicroelectronics)的旗艦產(chǎn)品之一,享有良好的聲譽(yù)和廣泛的市場(chǎng)份額。兩個(gè)系列都基于ARM Cortex-M3內(nèi)核,因此在功能和性能上有一些相似之處。 一、技術(shù)特點(diǎn)比較: 1.1 處理器核心: GD32F103和STM32F103都采用了ARM Cortex-M3內(nèi)核,因此在核心處理能力和指令集方面并無(wú)差異。 1.2 主頻和性能: 兩個(gè)系列都提供了多個(gè)型號(hào),主頻從72MHz到120MHz不等。但是需要注意的是,盡管在頻率上存在一些差異,但兩個(gè)系列的處理器都是32位的,因此在處理數(shù)據(jù)和執(zhí)行指令方面具
[單片機(jī)]
STM32F103程序調(diào)用printf打印串口數(shù)據(jù)
程序開發(fā)過程中調(diào)試必不可少,一種簡(jiǎn)單直接的調(diào)試方式是使用串口發(fā)送數(shù)據(jù),并使用串口助手進(jìn)行觀測(cè)。以前使用MSP430做項(xiàng)目時(shí)也同樣使用printf打印數(shù)據(jù),所以現(xiàn)在想在stm32 上實(shí)現(xiàn)。 通常串口發(fā)送單字節(jié)庫(kù)函數(shù):USART_SendData(USART1, (uint8_t) ch);對(duì)顯示小數(shù)等數(shù)據(jù)比較復(fù)雜,如果能夠直接使用C語(yǔ)言 stdio.h中的printf直接輸出就可以省去大部分格式輸出轉(zhuǎn)化時(shí)間。下面將介紹如何調(diào)用printf打印串口數(shù)據(jù)。 建立USART.C和USART.H兩個(gè)文件,分別編寫串口設(shè)置程序與頭文件 USART.C中需要添加如下代碼: 對(duì)printf進(jìn)行重定向; USART.H中需要添加如下代碼
[單片機(jī)]
<font color='red'>STM32F103</font>程序調(diào)用printf打印串口數(shù)據(jù)
基于STM32F103入門3——外部中斷
外部中斷 基本概念 CPU在處理某一事件A時(shí),發(fā)生了另一事件B請(qǐng)求CPU迅速去處理(中斷發(fā)生),那么CPU就會(huì)暫停當(dāng)前的工作(A事件),去執(zhí)行B事件(中斷響應(yīng)和中斷服務(wù)),然后B事件做完之后,再回到原來的事件(A事件)中繼續(xù)工作。(中斷的返回)。 簡(jiǎn)單的說就是 比如你在家看電視,突然電話響了(中斷),然后又突然有人敲門(又另一個(gè)中斷),這時(shí),你是不是應(yīng)該先不看電視,先去接電話,然后去開門,然后再回來看電視呢? 當(dāng)然 電話響和有人敲門 你先去干哪個(gè) 取決于你覺得哪個(gè)更重要,更應(yīng)該先去做。這個(gè)屬于中斷嵌套。 框圖 功能說明 外部中斷的配置 代碼編寫步驟 1:打開相應(yīng)的時(shí)鐘 1.1:GPIO的時(shí)鐘 2.2:功能復(fù)用IO的
[單片機(jī)]
基于<font color='red'>STM32F103</font>入門3——外部中斷
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved