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

ARM開發(fā),stm32mp157a-A7核IIC實(shí)驗(yàn)(采集溫濕度傳感器值)

這篇具有很好參考價(jià)值的文章主要介紹了ARM開發(fā),stm32mp157a-A7核IIC實(shí)驗(yàn)(采集溫濕度傳感器值)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.實(shí)驗(yàn)?zāi)繕?biāo):采集溫濕度傳感器值;

2.分析框圖(模擬IIC控制器);

ARM開發(fā),stm32mp157a-A7核IIC實(shí)驗(yàn)(采集溫濕度傳感器值),ARM,arm開發(fā),stm32,嵌入式硬件,c語(yǔ)言

3.代碼;

---iic.h封裝時(shí)序協(xié)議頭文件---
#ifndef __IIC_H__
#define __IIC_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
/* 通過程序模擬實(shí)現(xiàn)I2C總線的時(shí)序和協(xié)議
 * GPIOF ---> AHB4
 * I2C1_SCL ---> PF14
 * I2C1_SDA ---> PF15
 *
 * */

#define SET_SDA_OUT     do{GPIOF->MODER &= (~(0x3 << 30)); \
							GPIOF->MODER |= (0x1 << 30);}while(0)
#define SET_SDA_IN      do{GPIOF->MODER &= (~(0x3 << 30));}while(0)

#define I2C_SCL_H       do{GPIOF->BSRR |= (0x1 << 14);}while(0)
#define I2C_SCL_L       do{GPIOF->BRR |= (0x1 << 14);}while(0)

#define I2C_SDA_H       do{GPIOF->BSRR |= (0x1 << 15);}while(0)
#define I2C_SDA_L       do{GPIOF->BRR |= (0x1 << 15);}while(0)

#define I2C_SDA_READ    (GPIOF->IDR & (0x1 << 15))

void delay_us(void);   //延時(shí)函數(shù)
void i2c_init(void);   //模擬I2C總線初始化
void i2c_start(void);   //開始信號(hào)時(shí)序
void i2c_stop(void);   //停止信號(hào)時(shí)序
void i2c_write_byte(unsigned char  dat);   //主機(jī)向從機(jī)寫數(shù)據(jù)
unsigned char i2c_read_byte(unsigned char ack);   //主機(jī)從從機(jī)讀取數(shù)據(jù)
unsigned char i2c_wait_ack(void);   //主機(jī)作為發(fā)送器,等待接收器返回的應(yīng)答信號(hào)
void i2c_ack(void);   //主機(jī)作為接收器,給發(fā)送器發(fā)送應(yīng)答信號(hào)
void i2c_nack(void);   //主機(jī)作為接收器時(shí),給發(fā)送器發(fā)送非應(yīng)答信號(hào)

#endif 
---iic.c封裝時(shí)序函數(shù)實(shí)現(xiàn)---
#include "iic.h"

extern void printf(const char* fmt, ...);
/*
 * 函數(shù)名 : delay_us
 * 函數(shù)功能:延時(shí)函數(shù)
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */
void delay_us(void)
{
	unsigned int i = 2000;
	while(i--);
}
/*
 * 函數(shù)名 : i2c_init
 * 函數(shù)功能: i2C總線引腳的初始化, 通用輸出,推挽輸出,輸出速度,
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */
void i2c_init(void)
{
 	// 使能GPIOF端口的時(shí)鐘
	RCC->MP_AHB4ENSETR |= (0x1 << 5);
	// 設(shè)置PF14,PF15引腳為通用的輸出功能
	GPIOF->MODER &= (~(0xF << 28));
	GPIOF->MODER |= (0x5 << 28);
	// 設(shè)置PF14, PF15引腳為推挽輸出
	GPIOF->OTYPER &= (~(0x3 << 14));
	// 設(shè)置PF14, PF15引腳為高速輸出
	GPIOF->OSPEEDR |= (0xF << 28);
	// 設(shè)置PF14, PF15引腳的禁止上拉和下拉
	GPIOF->PUPDR &= (~(0xF << 28));
	// 空閑狀態(tài)SDA和SCL拉高 
	I2C_SCL_H;
	I2C_SDA_H;
}

/*
 * 函數(shù)名:i2c_start
 * 函數(shù)功能:模擬i2c開始信號(hào)的時(shí)序
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */
void i2c_start(void)
{
	/*
	 * 開始信號(hào):時(shí)鐘在高電平期間,數(shù)據(jù)線從高到低的變化
	 *     --------
	 * SCL         \
	 *              --------
	 *     ----
	 * SDA     \
	 *          --------
	 * */	
	//1.設(shè)置數(shù)據(jù)線為輸出模式
	SET_SDA_OUT;

	//2.在SCL為高電平
	I2C_SCL_H;
	delay_us();

	//3.SDA高電平
	I2C_SDA_H;
	delay_us();

	//4.SDA低電平
	I2C_SDA_L;

	//5.起始信號(hào)產(chǎn)生之后,總線處于占用狀態(tài)
	I2C_SCL_L;
}

/*
 * 函數(shù)名:i2c_stop
 * 函數(shù)功能:模擬i2c停止信號(hào)的時(shí)序
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */

void i2c_stop(void)
{
	/*
	 * 停止信號(hào) : 時(shí)鐘在高電平期間,數(shù)據(jù)線從低到高的變化 
	 *             ----------
	 * SCL        /
	 *    --------
	 *    ---         -------
	 * SDA   X       /
	 *    --- -------
	 * */

	//1.設(shè)置數(shù)據(jù)線輸出模式
	SET_SDA_OUT;

	//2.SCL為低電平,改變數(shù)據(jù)線上數(shù)據(jù)
	I2C_SCL_L;
	delay_us();

	//3.SDA為低電平
	I2C_SDA_L;
	delay_us();

	//4.SCL為高電平
	I2C_SCL_H;
	delay_us();

	//5.SDA為高電平
	I2C_SDA_H;
	delay_us();
}

/*
 * 函數(shù)名: i2c_write_byte
 * 函數(shù)功能:主機(jī)向i2c總線上的從設(shè)備寫8bits數(shù)據(jù)
 * 函數(shù)參數(shù):dat : 等待發(fā)送的字節(jié)數(shù)據(jù)
 * 函數(shù)返回值: 無(wú)
 * */

void i2c_write_byte(unsigned char dat)
{
	/*
	 * 數(shù)據(jù)信號(hào):時(shí)鐘在低電平期間,發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)
	 * 			時(shí)鐘在高電平期間,接收器從數(shù)據(jù)線上讀取數(shù)據(jù) 
	 *      ----          --------
	 * 	SCL     \        /        \
	 *           --------          --------
	 *      -------- ------------------ ---
	 * 	SDA         X                  X
	 *      -------- ------------------ ---
	 *
	 *      先發(fā)送高位在發(fā)送低位 
	 * */
	unsigned int i;

	//1.設(shè)置數(shù)據(jù)線為輸出模式
	SET_SDA_OUT;

	//2.for循環(huán),先發(fā)高位再發(fā)低位
	
	for(i=0; i<8; i++)
	{
		I2C_SCL_L;  //SCL低電平
		delay_us();

		if(dat & 0x80)  //先發(fā)高位
			I2C_SDA_H;  //3.向數(shù)據(jù)線上寫入高電平
		else
			I2C_SDA_L;  //4.向數(shù)據(jù)線上寫入低電平
		delay_us();

		I2C_SCL_H;  //5.等待從機(jī)從數(shù)據(jù)線上讀取數(shù)據(jù)
		delay_us();
		delay_us();
		
		dat <<= 1;  //6.移位
	}
}

/*
 * 函數(shù)名:i2c_read_byte
 * 函數(shù)功能: 主機(jī)從i2c總線上的從設(shè)備讀8bits數(shù)據(jù), 
 *          主機(jī)發(fā)送一個(gè)應(yīng)答或者非應(yīng)答信號(hào)
 * 函數(shù)參數(shù): 0 : 應(yīng)答信號(hào)   1 : 非應(yīng)答信號(hào)
 * 函數(shù)返回值:讀到的有效數(shù)據(jù)
 *
 * */
unsigned char i2c_read_byte(unsigned char ack)
{
	/*
	 * 數(shù)據(jù)信號(hào):時(shí)鐘在低電平期間,發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)
	 * 			時(shí)鐘在高電平期間,接收器從數(shù)據(jù)線上讀取數(shù)據(jù) 
	 *      ----          --------
	 * 	SCL     \        /        \
	 *           --------          --------
	 *      -------- ------------------ ---
	 * 	SDA         X                  X
	 *      -------- ------------------ ---
	 *
	 *      先接收高位, 在接收低位 
	 * */
	unsigned int i;
	unsigned char dat;

	SET_SDA_IN;  //1.設(shè)置數(shù)據(jù)線輸入模式
	
	for(i=0; i<8; i++)
	{
		I2C_SCL_L;  //2保證發(fā)送器向數(shù)據(jù)線上寫入數(shù)據(jù)完成
		delay_us();
		delay_us();

		I2C_SCL_H;  //3從數(shù)據(jù)線上讀取數(shù)據(jù)
		delay_us();
		delay_us();
		dat <<= 1;  //4移位放if前面

		if(I2C_SDA_READ)
			dat |= 1;  //讀取的數(shù)據(jù)為1
		else
			dat |= 0;  //讀取的數(shù)據(jù)為0
		delay_us();
	}
		if(!ack)
			i2c_ack();  //主機(jī)給從機(jī)返回應(yīng)答信號(hào)
		else
			i2c_nack();  //主機(jī)給從機(jī)返回非應(yīng)答信號(hào)

		return dat;
}
/*
 * 函數(shù)名: i2c_wait_ack
 * 函數(shù)功能: 主機(jī)作為發(fā)送器時(shí),等待接收器返回的應(yīng)答信號(hào)
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:
 *					0:接收到的應(yīng)答信號(hào)
 *                  1:接收到的非應(yīng)答信號(hào)
 * */
unsigned char i2c_wait_ack(void)
{
	/*
	 * 主機(jī)發(fā)送一個(gè)字節(jié)之后,從機(jī)給主機(jī)返回一個(gè)應(yīng)答信號(hào)
	 *
	 *                   -----------
	 * SCL              /   M:讀    \
	 *     -------------             --------
	 *     --- ---- --------------------
	 * SDA    X    X
	 *     ---      --------------------
	 *     主  釋   從機(jī)    主機(jī)
	 *     機(jī)  放   向數(shù)據(jù)  讀數(shù)據(jù)線
	 *         總   線寫    上的數(shù)據(jù)
	 *         線   數(shù)據(jù)
	 * */	

	I2C_SCL_L;  //1設(shè)置SCL為低電平
	delay_us();

	I2C_SDA_H;  //2.釋放數(shù)據(jù)線
	delay_us();
	SET_SDA_IN;  //3.設(shè)置數(shù)據(jù)線輸入模式
	delay_us();

	I2C_SCL_H;  //SCL為高電平期間
	delay_us();

	//從總線上讀取數(shù)據(jù)
	if(I2C_SDA_READ)
		return 1;  //讀1 非應(yīng)答信號(hào)
	
	I2C_SCL_L;  //SCL為低電平,總線處于占用狀態(tài)
	return 0;  //讀0 應(yīng)答信號(hào)
} 
/*
 * 函數(shù)名: iic_ack
 * 函數(shù)功能: 主機(jī)作為接收器時(shí),給發(fā)送器發(fā)送應(yīng)答信號(hào)
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */
void i2c_ack(void)
{
	/*            --------
	 * SCL       /        \
	 *    -------          ------
	 *    ---
	 * SDA   X 
	 *    --- -------------
	 * */
	SET_SDA_OUT;  //1.數(shù)據(jù)線輸出 
	I2C_SCL_L;   //2.SCL低電平,改變數(shù)據(jù)線上數(shù)據(jù)
	delay_us();

	I2C_SDA_L;  //3.應(yīng)答信號(hào)==0
	delay_us();

	I2C_SCL_H;  //4.等待從機(jī)讀取應(yīng)答號(hào)
	delay_us();
	delay_us();
	I2C_SCL_L;  //5.總線處于占用狀態(tài)
}
/*
 * 函數(shù)名: iic_nack
 * 函數(shù)功能: 主機(jī)作為接收器時(shí),給發(fā)送器發(fā)送非應(yīng)答信號(hào)
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
 * */
void i2c_nack(void)
{
	/*            --------
	 * SCL       /        \
	 *    -------          ------
	 *    --- ---------------
	 * SDA   X 
	 *    --- 
	 * */		
	SET_SDA_OUT;  //1.數(shù)據(jù)線輸出 
	I2C_SCL_L;   //2.SCL低電平,改變數(shù)據(jù)線上數(shù)據(jù)
	delay_us();

	I2C_SDA_H;  //3.非應(yīng)答信號(hào)==1
	delay_us();

	I2C_SCL_H;  //4.等待從機(jī)讀取應(yīng)答號(hào)
	delay_us();
	delay_us();
	I2C_SCL_L;  //5.總線處于占用狀態(tài)
}

---si7006.h讀取溫濕度頭文件---
#ifndef __SI7006_H__
#define __SI7006_H__

#include "iic.h"
#define        SI7006_SLAVE      0x40

//初始化
void si7006_init(void);

//讀取濕度
unsigned short si7006_read_hum_data(unsigned char slave_addr, unsigned char reg_addr);
//讀取溫度
short si7006_read_temp_data(unsigned char slave_addr, unsigned char reg_addr);


#endif //__SI7006_H__
---si7006.c讀取溫濕度函數(shù)---
#include "iic.h"
#include "si7006.h"
extern void delay_ms(unsigned int ms);
/*
 * 函數(shù)名:si7006_init
 * 函數(shù)功能:SI7006芯片的初始化
 * 函數(shù)參數(shù):無(wú)
 * 函數(shù)返回值:無(wú)
*/
void si7006_init(void)
{
	i2c_init();  //模擬I2C總線初始化
	i2c_start();   //開始信號(hào)

	i2c_write_byte(SI7006_SLAVE << 1);  //發(fā)送從機(jī)地址+寫0
	i2c_wait_ack();  //主機(jī)等待從機(jī)應(yīng)答信號(hào)

	i2c_write_byte(0xE6);  //發(fā)送寫用戶寄存器1
	i2c_wait_ack(); 

	i2c_write_byte(0x3A);  //發(fā)送寫用戶寄存器1
	i2c_wait_ack(); 
	
	i2c_stop();  //停止信號(hào)
}

/*
 * 函數(shù)名:si7006_read_data
 * 函數(shù)功能:讀取SI7006的轉(zhuǎn)換結(jié)果
 * 函數(shù)參數(shù):
 *     slave_addr : 從機(jī)地址
 *     reg_addr : 寄存器地址
 * 函數(shù)返回值:無(wú)
*/
unsigned short si7006_read_hum_data(unsigned char slave_addr, 
		unsigned char reg_addr)
{
	unsigned short dat;
	unsigned char dat_h;
	unsigned char dat_l;

	i2c_start();  //起始信號(hào)
	i2c_write_byte(slave_addr << 1 | 0);  //發(fā)送從機(jī)地址+寫0
	i2c_wait_ack();  //主機(jī)等待從機(jī)應(yīng)答信號(hào)

	i2c_write_byte(reg_addr);  //發(fā)送寄存器地址
	i2c_wait_ack();

	i2c_start();  //起始信號(hào)
	i2c_write_byte(slave_addr << 1 | 1);  //發(fā)送從機(jī)地址+讀1
	i2c_wait_ack();

	delay_ms(5000);  //延時(shí)函數(shù)

	dat_h = i2c_read_byte(0);  //參數(shù)ack
	dat_l = i2c_read_byte(1);  //nack

	//高八位低八位拼接
	dat = dat_h;
	dat <<= 8;
	dat |= dat_l;

	return dat;
}

//溫度
short si7006_read_temp_data(unsigned char slave_addr, 
		unsigned char reg_addr)
{
	short dat;
	unsigned char dat_h;
	unsigned char dat_l;

	i2c_start();  //起始信號(hào)
	i2c_write_byte(slave_addr << 1 | 0);  //發(fā)送從機(jī)地址+寫0
	i2c_wait_ack();  //主機(jī)等待從機(jī)應(yīng)答信號(hào)

	i2c_write_byte(reg_addr);  //發(fā)送寄存器地址
	i2c_wait_ack();

	i2c_start();  //起始信號(hào)
	i2c_write_byte(slave_addr << 1 | 1);  //發(fā)送從機(jī)地址+讀1
	i2c_wait_ack();
	delay_ms(5000); //延時(shí)函數(shù)

	dat_h = i2c_read_byte(0);  //參數(shù)ack
	dat_l = i2c_read_byte(1);  //nack

	//高八位低八位拼接
	dat = dat_h;
	dat <<= 8;
	dat |= dat_l;

	return dat;

}

---main.c主函數(shù)測(cè)試---

#include "si7006.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

int main()
{
	short temp;
	unsigned short hum;
	si7006_init();

	while(1)
	{
		hum = si7006_read_hum_data(SI7006_SLAVE,0xE5);
		temp = si7006_read_temp_data(SI7006_SLAVE,0xE3);

		printf("hum = %d\n",hum*125/65536-6);
		printf("temp = %d\n",temp*176/65536-47);
	}

	return 0;

}

4.運(yùn)行結(jié)果;

ARM開發(fā),stm32mp157a-A7核IIC實(shí)驗(yàn)(采集溫濕度傳感器值),ARM,arm開發(fā),stm32,嵌入式硬件,c語(yǔ)言文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-670720.html

到了這里,關(guān)于ARM開發(fā),stm32mp157a-A7核IIC實(shí)驗(yàn)(采集溫濕度傳感器值)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • SQLite3移植STM32MP157 ARM開發(fā)板

    SQLite3移植STM32MP157 ARM開發(fā)板

    移植首先就得有源碼,從SQLite官網(wǎng)下載最新版源碼 下載地址 這里使用的環(huán)境為Ubuntu16 所以直接在Ubuntu下下載的。 下載完成后解壓文件 進(jìn)入解壓后的目錄 進(jìn)入后可以看到解壓出的源碼文件如下 配置生成Makefile 在源碼個(gè)目錄下執(zhí)行如下命令 –host為指定交叉編譯器為arm-linux-

    2024年02月07日
    瀏覽(17)
  • 驅(qū)動(dòng)開發(fā),stm32mp157a開發(fā)板的led燈控制實(shí)驗(yàn)

    驅(qū)動(dòng)開發(fā),stm32mp157a開發(fā)板的led燈控制實(shí)驗(yàn)

    ????????編寫LED燈的驅(qū)動(dòng),在應(yīng)用程序中編寫控制LED燈亮滅的代碼邏輯實(shí)現(xiàn)LED燈功能的控制; LED1-PE10 LED1亮滅: RCC寄存器[4]-1 0X50000A28 GPIOE_MODER[21:20]-01 (輸出) 0X50006000 GPIOE_ODR[10]-1(輸出高電平) 0(輸出低電平)0X50006014 LED2-PF10 LED2亮滅: RCC寄存器[5]-1 0X50000A28 GPIOE_MODER[21:20]

    2024年02月09日
    瀏覽(24)
  • STM32物聯(lián)網(wǎng)項(xiàng)目-SHT30溫濕度采集(IIC通信)

    STM32物聯(lián)網(wǎng)項(xiàng)目-SHT30溫濕度采集(IIC通信)

    SHT30數(shù)字溫濕度傳感器 SHT3x濕度傳感器系列包括低成本版本SHT30、標(biāo)準(zhǔn)版本SHT31,以及高端版本SHT35。 SHT3x濕度傳感器系列結(jié)合了多種功能和各種接口(I2C、模擬電壓輸出),應(yīng)用友好,工作電壓范圍寬(2.15至5.5 V),適合各類應(yīng)用。 SHT3x建立在全新和優(yōu)化的CMOSens? 芯片之上,

    2023年04月21日
    瀏覽(17)
  • cortex-A7核PWM實(shí)驗(yàn)--STM32MP157

    cortex-A7核PWM實(shí)驗(yàn)--STM32MP157

    實(shí)驗(yàn)?zāi)康模候?qū)動(dòng)風(fēng)扇,蜂鳴器,馬達(dá)進(jìn)行工作 目錄 一,PWM相關(guān)概念 有源蜂鳴器和無(wú)源蜂鳴器 二,分析電路圖,框圖 三,分析RCC章節(jié) 1,確定總線連接 2,根據(jù)總線內(nèi)容確定基地址 3.分析RCC章節(jié)所需寄存器 1,RCC_MP_AHB4ENSETR寄存器 2,RCC_MP_APB1ENSETR寄存器 四,分析GPIO章節(jié)寄存器

    2024年02月11日
    瀏覽(31)
  • STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(中斷)

    STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(中斷)

    對(duì)于使用中斷的按鍵驅(qū)動(dòng),內(nèi)核自帶的驅(qū)動(dòng)程序 drivers/input/keyboard/gpio_keys.c 就可以,需要做的只是修改設(shè)備樹指定引腳及鍵值 中斷是引入其他基礎(chǔ)知識(shí)的前提:休眠-喚醒、POLL 機(jī)制、異步通知、定時(shí)器、中斷的線程化處理都離不開中斷 設(shè)備樹相關(guān) 查看原理圖確定按鍵使用的

    2024年02月15日
    瀏覽(28)
  • STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(異步通知)

    STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(異步通知)

    Linux 系統(tǒng)中也有很多信號(hào),在 Linux 內(nèi)核源文件 includeuapiasm-genericsignal.h 中,有很多信號(hào)的宏定義: 就 APP 而言,你想處理 SIGIO 信息,那么需要提供信號(hào)處理函數(shù),并且要跟 SIGIO 掛鉤。這可以通過一個(gè) signal 函數(shù) 來(lái)“給某個(gè)信號(hào)注冊(cè)處理函數(shù)”,用法如下: 重點(diǎn)從②開始:

    2024年02月15日
    瀏覽(20)
  • STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(tasklet)

    STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(tasklet)

    閱讀Linux 系統(tǒng)中異常與中斷可知,Linux 系統(tǒng)對(duì)中斷處理的演進(jìn)過程中,實(shí)現(xiàn)了中斷的擴(kuò)展:硬件中斷、軟件中斷 硬件中斷有:GPIO,網(wǎng)絡(luò)中斷(net),系統(tǒng)滴答中斷(tick)等 軟件中斷有:定時(shí)器,tasklet等 內(nèi)核中的軟中斷: 該數(shù)組里面有個(gè)action成員,該成員是個(gè)函數(shù),函數(shù)會(huì)調(diào)

    2024年02月14日
    瀏覽(79)
  • STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(工作隊(duì)列)

    STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(工作隊(duì)列)

    定時(shí)器、下半部 tasklet,它們都是在中斷上下文中執(zhí)行,它們無(wú)法休眠。當(dāng)要處理更復(fù)雜的事情時(shí),往往更耗時(shí)。這些更耗時(shí)的工作放在定時(shí)器或是下半部中,會(huì)使得系統(tǒng)很卡;并且循環(huán)等待某件事情完成也太浪費(fèi)CPU 資源了。如果使用線程來(lái)處理這些耗時(shí)的工作,那就可以解

    2024年02月15日
    瀏覽(25)
  • STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(POLL 機(jī)制)

    STM32MP157驅(qū)動(dòng)開發(fā)——按鍵驅(qū)動(dòng)(POLL 機(jī)制)

    使用休眠-喚醒的方式等待某個(gè)事件發(fā)生時(shí),有一個(gè)缺點(diǎn):等待的時(shí)間可能很久。我們可以加上一個(gè)超時(shí)時(shí)間,這時(shí)就可以使用 poll 機(jī)制。 ① APP 不知道驅(qū)動(dòng)程序中是否有數(shù)據(jù),可以先調(diào)用 poll 函數(shù)查詢一下,poll 函數(shù)可以傳入超時(shí)時(shí)間; ② APP 進(jìn)入內(nèi)核態(tài), 調(diào)用到驅(qū)動(dòng)程序的

    2024年02月15日
    瀏覽(19)
  • STM32MP157驅(qū)動(dòng)開發(fā)——LED驅(qū)動(dòng)(原始架構(gòu))

    STM32MP157驅(qū)動(dòng)開發(fā)——LED驅(qū)動(dòng)(原始架構(gòu))

    LED 的驅(qū)動(dòng)方式,常見的有四種。 ① 使用引腳輸出 3.3V 點(diǎn)亮 LED,輸出 0V 熄滅 LED。 ② 使用引腳拉低到 0V 點(diǎn)亮 LED,輸出 3.3V 熄滅 LED。 ③ 使用引腳輸出 1.2V 點(diǎn)亮 LED,輸出 0V 熄滅 LED。 ④ 使用引腳輸出 0V 點(diǎn)亮 LED,輸出 1.2V 熄滅 LED。 有的芯片為了省電等原因,其引腳驅(qū)動(dòng)能力

    2024年02月03日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包