【使用C++开发MCU】02-IIC实例之读取温度

S32K144:12.LPI2C驱动AT24C16 1.打开官方例程 2.修改引脚配置 3.时钟可按照实际情况修改,也可不用更改,本例时钟不做更改 4.配置LPI2C模块 设置从机地址:从机地址如下图所示,低三位表示为AT24C16的块地址,AT24C16将2KB的内存空间分为8个块,每个块256个字节的数据,此处先读写块0的内存,故将地址设置为0x50。 I2C频率设置:此处使用标准模式速率为100KHz。按照AT24C16手册,也可配置为快速模式400KHz或1MHz,可按照需求配置。 5.按页写入数据到AT24C16 按照时序,先发送器件地 阅读详情

为什么使用C++进行MCU开发

我从18年开始在STM32等上使用C++编程,在医疗器械行业进行IVD仪器开发,在此之前的项目开发中我是使用C语言。初次在MCU上使用C++,我有很多疑惑:C语言不挺好的吗?MCU上居然可以使用C++? 为什么选择C++?

工作七八年了,以前都没写过博客,现在开始记录一点东西吧!

尽管18年时使用C语言进行MCU开发已经相当熟练,但C++我是刚入茅庐,才会有那些疑问,并还专门请教了部门经理。这几年,随着工作经验的积累,愈发的认通C++在产品开发中的优点,那些疑惑也随之解开。
使用C++进行MCU开发,不代表只用C++,C语言也是可以混用的,特别是原厂提供的一些SDK,可以用C++封装这层SDK,后续、上层驱动业务进行C++开发。

场景描述

这里使用NXP的S32K1系列MCU,使用TI的TMP101温度传感器做示例。开发环境使用NXP的S32DS,使用其C库SDK,编程语言为C++。为了使用C++演示,建立工程时选择C++语言,不选择SDK,SDK部分由我们自行导入工程。
原理框图

软件架构

这里进行演示,架构较为简单,在SDK基础上封装IIC驱动CI2C(C++),基于IIC驱动实现TMP101驱动CTmp(C++),板级相关时钟、引脚封装在CBoard中(C++),最后App中的main.cpp实现读取温度。
软件架构

工程结构

基于上述软件架构[在SDK基础上封装IIC驱动CI2C(C++),基于IIC驱动实现TMP101驱动CTmp(C++),板级相关时钟、引脚封装在CBoard中(C++),最后App中的main.cpp实现读取温度。]实现工程结构:
工程结构

CI2C类

参见NXP S32K1 IIC Driver接口与实现实现该C++类。

头文件:CI2C.h中主要实现初始化、读从机数据、写从机数据三大接口,为了省事,将板机相关的从机枚举、从机地址和波特率等也塞在了这里。

#ifndef CI2C_H_
#define CI2C_H_

#include "stdint.h"
#include "lpi2c.h"

class CI2C{

public:
	void init(void);
	void deinit(void);
	bool read(uint8_t slave, uint8_t addr, uint8_t *data, uint16_t len);
	bool write(uint8_t slave, uint8_t addr, const uint8_t *data, uint16_t len);
	static CI2C *getInstance(void);

	enum SLAVE
	{
			SLAVE_TMP101 = 0x00,
			SLAVE_COUNT
	};

private:
	static CI2C *pI2CInstance;
	void config(uint8_t slave);
	const uint32_t I2C_NO = INST_LPI2C;
	const uint32_t I2C_MAX_LEN = 128U;
	const uint32_t I2C_TOUT = 100U;


	uint8_t addr[SLAVE_COUNT] =
	{
			0x4A,//SLAVE_TMP101
	};
	uint32_t buad[SLAVE_COUNT] =
	{
			400000,//SLAVE_TMP101
	};

};



#endif /* CI2C_H_ */

源文件:CI2C.cpp则是上述接口的具体实现。

void CI2C::init(void)
{
	LPI2C_DRV_MasterInit(CI2C::I2C_NO, &lpi2c_MasterConfig0, &lpi2c_MasterState);
}

void CI2C::deinit(void)
{
	LPI2C_DRV_MasterDeinit(CI2C::I2C_NO);
}

bool CI2C::read(uint8_t slave, uint8_t addr, uint8_t *data, uint16_t len)
{
	bool rtv = true;
	config(slave);
	if( STATUS_SUCCESS == LPI2C_DRV_MasterSendDataBlocking(CI2C::I2C_NO, &addr, 1, false, CI2C::I2C_TOUT))
	{
		if(data && len && (STATUS_SUCCESS == LPI2C_DRV_MasterReceiveDataBlocking(CI2C::I2C_NO, data, len, true, CI2C::I2C_TOUT)))
		{
			rtv = true;
		}
		else
		{
			rtv = false;
		}
	}
	else
	{
		rtv = false;
	}
	return rtv;
}

bool CI2C::write(uint8_t slave, uint8_t addr, const uint8_t  *data, uint16_t len)
{
	bool rtv = true;
	config(slave);
	uint8_t *ptrans = new uint8_t[CI2C::I2C_MAX_LEN];
	uint8_t translen = 1;
	if(ptrans)
	{
		*(ptrans+0) = addr;
		if(len != 0)
		{
			if(data &&(len<CI2C::I2C_MAX_LEN-1))
			{
				memcpy((uint8_t*)(ptrans+1),data,len);
				translen += len;
			}
			else
			{
				rtv = false;
			}

		}
		if(rtv && (STATUS_SUCCESS == LPI2C_DRV_MasterSendDataBlocking(CI2C::I2C_NO, ptrans, translen, true, CI2C::I2C_TOUT)))
		{
			rtv = true;
		}
		else
		{
			rtv = false;
		}

	}
	delete ptrans;


	return rtv;
}

void CI2C::config(uint8_t slave)
{
	lpi2c_baud_rate_params_t baud;
	baud.baudRate = CI2C::buad[slave];
	LPI2C_DRV_MasterSetBaudRate(CI2C::I2C_NO,LPI2C_FAST_MODE, baud);
	LPI2C_DRV_MasterSetSlaveAddr(CI2C::I2C_NO, CI2C::addr[slave], false);
}

由于该款S32K1只有一个IIC模组,为了显得使用C++正规一点,整了一个单例,在其它文件中,只需要通过II2C对象去访问相关函数即可。

#define II2C CI2C::getInstance()

CI2C* CI2C::pI2CInstance = NULL;

CI2C *CI2C::getInstance(void)
{
	if(CI2C::pI2CInstance == NULL)
	{
		CI2C::pI2CInstance = new CI2C;
	}

	return CI2C::pI2CInstance;

}

CTmp类

这是温度传感器TMP101类,只有几个寄存器,使用简单,在此不赘叙,只需要对照其DataSheet进行IIC访问即可。
头文件:

#ifndef CTMP101_H_
#define CTMP101_H_

#include "CI2C.h"


class CTmp{

public:
	float gettmp(void);

private:
	const float res = 0.0625;
	enum
	{
		TMP_REG_TMP = 0x00,
		TMP_REG_CFG = 0x01,
		TMP_REG_TLOW = 0x02,
		TMP_REG_THIGH =  0x03
	};

};


#endif /* CTMP101_H_ */

源文件:

#include "CTmp101.h"
#include "II2C.h"
float CTmp::gettmp(void)
{
	bool rtv = true;
	float ftmp = 0.0;
	uint16_t uiTmp = 0;
	uint8_t ucRead[2] = {0};

	rtv = II2C->read(II2C->SLAVE_TMP101, CTmp::TMP_REG_TMP, ucRead, 2);

	uiTmp = (ucRead[0]<<0x08)|ucRead[1];
	uiTmp >>= 4;
	ftmp = res*uiTmp;

	return ftmp;
}

App应用

应用层实现在main.cpp中,先完成板卡时钟、引脚初始化,接着进行IIC外设初始化,最后读取温度值。

#include "S32K146.h"
#include "CBoard.h"
#include "II2C.h"
#include "CTmp101.h"

int main()
{
	CBoard mybrd;
	mybrd.clk_init();
	mybrd.pin_init();
	mybrd.pwr_Init();
	II2C->init();
	float fVal = 0.0;
	CTmp mTmp;

    while(1)
    {
    	fVal = mTmp.gettmp();

    }

    return 0;
}

结语

时间流逝的好快,一下子就工作了七年,怀念在深圳工作的那5年!

刚开始写博客,语言组织可能不是太好,还望海涵,也欢迎指出博文中不足与改进点。

【使用C++开发MCU】01-IIC实例之接口概述(基于NXP S32K1 MCU) 本文基于S32SDK描述C++版本IIC Driver所需功能,供上层用户使用。 阅读详情

相关推荐

在 MCU 上运行高级 C++ 软件

使用 C++ 开发用户应用程序有很多优势,因此该语言在包括基于 MCU 的系统中变得越来越流行也就不足为奇了。“mbed”项目完全专注于这种语言。许多 RTOS 提供 C++ 兼容层,但与“大”系统(具有 MMU)相比,大多数 RTOS 都有一些限制。在本文中,我们将研究 C++ 的内部结构并找出造成这些限制的原因。 MCU 上的 C++ 有两个主要限制:重新启动应用程序和标准 C++ 库的多线程功能。 本文中的大多数示例都将在Embox RTOS上进行考虑。该 RTOS 允许在 MCU 上运行像Ope

lyfwx的博客 1758

Linux —— Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度

Ubuntu下C++获取CPU使用率、GPU使用率、GPU温度

3492

IAR全面支持国科环宇AS32X系列RISC-V车规MCU

全球领先的嵌入式系统开发软件解决方案供应商IAR与北京国科环宇科技股份有限公司(以下简称“国科环宇”)联合宣布,最新版本IAR Embedded Workbench for RISC-V将全面支持国科环宇AS32X系列RISC-V MCU,双方将共同助力中国汽车行业开发者的创新研发,同时将不断深化合作,扩展在行业的技术探索及生态完善。

mahuahu的博客 966

获取nvidia显卡温度的方法

 int i=0;unsigned long cnt;NvAPI_Status status;NvDisplayHandle hDisplay_a[NVAPI_MAX_PHYSICAL_GPUS * 2] = {0};NvPhysicalGpuHandle nvGPUHandle;//-----------------------------------------------------

intelms的专栏 2794

香瓜树莓派RP2350之max17048电量计实战:IIC通信与精准电量监测

本文详细介绍了如何在树莓派RP2350开发板上使用MAX17048电量计实现精准电量监测。通过IIC通信协议,开发者可以轻松获取电池电压、电量百分比等关键数据,并利用ModelGauge算法提升监测精度。文章还提供了硬件连接、驱动开发及高级功能配置的实战指南,适用于低功耗嵌入式设备开发。

weixin_30555125的博客 365

MS5803-14BA I²C驱动开发:嵌入式压力传感器实战指南

数字压力传感器是工业测控、无人机高度计与水下机器人深度感知的核心器件,其本质是集成MEMS压阻传感单元、ΔΣ ADC与片上温度补偿算法的智能I²C外设。理解I²C时序约束、校准系数CRC校验机制及DUT温度预处理逻辑,是保障高精度(0.012 mbar)数据可靠性的基础。该类传感器广泛应用于气压高度测量、过程压力监控与闭环深度控制等场景,对MCU的I²C硬件配置、电源完整性及抗干扰设计提出明确要求。本文以MS5803-14BA为典型,深入解析寄存器级通信协议、跨平台(Arduino/STM32/FreeRT

weixin_30838971的博客 584

【使用C++开发MCU】03-IIC实例之UML画个图展现设计(分析NXP S32SDK IIC Driver)

使用UML进行代码分析设计,主要是分析NXP官方S32SDK IIC Driver。

Kinetis_Linux的博客 949

2026年百度嵌入式面试题带详细答案

摘要 本文针对百度嵌入式岗位(AIoT/智能硬件/自动驾驶方向)的技术要求,系统梳理了嵌入式开发核心知识点。硬件部分涵盖CAN/IIC/SPI等总线协议原理与实现、Bootloader设计与MCU选型;电路设计部分详解DC-DC电源、DDR3布线及ZYNQ系统布局规范;传感器部分解析IMU解算流程及卡尔曼滤波算法实现。试题设置聚焦硬件驱动开发、实时系统构建与工程实践能力,全面考察嵌入式开发者的底层技术功底与问题解决能力,适用于校招和社招人才评估。(149字)

Open 170

【使用C++开发MCU】00-专栏前言

C语言不挺好的吗?MCU上居然可以使用C++? 为什么选择C++?这几年,随着工作经验的积累,愈发的认同C++。

Kinetis_Linux的博客 1137

五子棋AI实战:极大极小搜索、Alpha-Beta剪枝与禁手实现

博弈树搜索是双人零和博弈AI的经典决策框架,其核心思想是假设对手最优应对,通过递归遍历走法空间寻找最优解。极大极小搜索配合Alpha-Beta剪枝,能在不影响决策结果的前提下将搜索量降至平方根级别,大幅提升搜索效率。在五子棋场景中,还需处理黑棋禁手规则,包括双三、双四和长连判定,并将其融入搜索框架。评估函数基于棋型识别对局面打分,走法排序和迭代加深进一步优化剪枝效果。这些技术共同构成了一个可运行的五子棋AI,适用于棋类AI入门与博弈搜索实践。

weixin_29054399的博客 131

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

基于STM32标准库的MS5837驱动移植与IIC时序调试实战

本文详细介绍了基于STM32标准库的MS5837压力传感器驱动移植与IIC时序调试实战。从硬件准备、工程搭建到IIC模拟时序的细节处理,再到传感器初始化、数据转换及深度海拔计算,全面解析了开发过程中的关键步骤与常见问题解决方案,帮助开发者高效完成MS5837的驱动开发与应用。

weixin_28721917的博客 202

保姆级教程:在S32DS 3.4上安装S32K3xx RTD 4.4驱动包(附常见安装失败排查)

本文提供在S32DS 3.4上安装S32K3xx RTD 4.4驱动包的详细教程,涵盖环境准备、分步安装指南及常见问题排查。特别针对NXP S32K3系列MCU开发者,解决网络问题、路径配置等安装难点,并分享进阶配置技巧和最佳实践,助力高效开发。

weixin_42696271的博客 289

从Arduino到树莓派:手把手教你玩转IIC和SPI通信(附Python/C++代码)

本文详细介绍了从Arduino到树莓派的IIC和SPI通信协议实战指南,涵盖硬件准备、环境搭建、传感器数据读取、TFT屏幕驱动及混合电压系统处理。通过Python和C++代码示例,帮助开发者解决常见通信问题,提升芯片通信效率。

weixin_30383279的博客 438

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

多模型动态路由(Fusion):从“算力霸权”到“架构分权”的工程范式转型

多模型动态路由(Multi-Model Dynamic Routing)是指在多个大语言模型之间,根据请求特征、资源约束和业务目标,动态选择最优模型或模型组合的技术范式。传统网关擅长管理请求流量,但不理解“任务类型”。而AI路由层需要对每个请求进行语义理解、能力匹配和成本评估。从“算力霸权”到“架构分权”,这不是技术的线性演进,而是工程范式的根本转型。过去三年,开发者的核心能力是“选对模型”——在GPT、Claude、Gemini之间做出正确选择。

ZDQ58818的博客 74

从Arduino到STM32:IIC驱动数码管与FreeRTOS系统集成实战

IIC(Inter-Integrated Circuit)是一种广泛应用的同步、半双工串行通信总线协议,以其简洁的两线制(SDA和SCL)和多主多从架构,成为连接各类传感器、存储器和显示模块的基石。其工作原理基于严格的主从时序,包括起始条件、地址寻址、数据字节传输和应答机制,确保了多设备间可靠的数据交换。掌握IIC协议对于嵌入式开发至关重要,它能高效管理外设,简化硬件设计。在工程实践中,开发者常利用该协议驱动如四位数码管、OLED等显示模块,实现人机交互。随着系统复杂度的提升,例如在集成PID控制算法时,实

weixin_30294295的博客 321

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1353

MCU单片机面试题(1)

MCU的一点面试题,主要是有关项目和入职小白的分析以及回答

qq_43493082的博客 1万+

【QGIS】软件下载安装及GIS4WRF插件使用

【QGIS】软件下载安装及GIS4WRF插件使用

WW、forever的博客 1800

微信小程序 - 实现身份证OCR识别人像面与国徽面并提取字段信息,详解从手机相册选取或打开摄像头拍照上传身份证正反面图片ocr文字识别数据填充表单(提供免费纯前端ocr识别插件+百度OCR识别API)

微信小程序身份证识别,微信小程序身份证拍照、上传并OCR识别,微信小程序实现OCR扫描识别,微信小程序识别身份证免费插件,微信小程序实现身份证识别功能。ocr识别插件。微信身份证拍照后进行ocr识别,微信小程序OCR扫描识别身份证,OCR身份证实名认证+图片上传+拍照上传图片,微信小程序之身份证照片正反上传,小程序OCR身份证识别,微信小程序实现文字识别-ocr插件,微信小程序利用百度AI实现扫描身份证获取信息功能,基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例demo,将上传的照片传到服务

🏆 前端领域优质创作者 8134

​IAR全面支持国科环宇AS32X系列RISC-V车规MCU

IAR嵌入式开发解决方案将全面支持国科环宇AS32X系列ASIL-B MCU,共同推动汽车高品质应用的安全开发

ANSILIC的博客 1089

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RA4M2开发板与MLX90614红外测温方案实现

红外测温技术通过检测物体发出的红外辐射能量实现非接触式温度测量,其核心在于传感器对热辐射的精确捕捉与信号转换。MLX90614作为数字式红外温度传感器,采用I2C接口输出,结合RA4M2开发板的丰富外设接口和低功耗特性,可构建高效测温系统。在物联网和工业控制领域,这种组合方案能实现从数据采集、处理到无线传输的全链路功能,特别适合智能家居温度监控、工业设备过热预警等场景。通过硬件加密引擎确保数据安全,利用浮点运算单元进行实时温度补偿,展现了嵌入式系统在传感器应用中的技术价值。

weixin_26742753的博客 296

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32 HAL库实战:F103C8T6驱动MPU6050,DMP解算实现高精度姿态与温度监测

本文详细介绍了如何使用STM32 HAL库驱动MPU6050传感器,并通过DMP解算实现高精度姿态与温度监测。文章涵盖了硬件选型、开发环境搭建、DMP库移植、数据读取与处理等关键步骤,特别适合嵌入式开发者和创客项目。通过优化和校准,系统可实现±0.5°的姿态精度和±1°C的温度监测,适用于无人机、平衡车等应用场景。

weixin_30938149的博客 549

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

武汉-嵌入式软件开发工程师(光模块-固件方向

该职位招聘光模块固件开发工程师,主要负责固件设计编码、功能实现及测试调优工作。要求3年以上嵌入式开发经验,熟练掌握C/C++及常用外设接口,熟悉光模块相关协议规范(CMIS/SFF),具备硬件调试和脚本开发能力。需承担固件全生命周期开发,包括驱动开发、寄存器配置、兼容性适配及故障分析,并能够阅读英文技术文档。本科及以上学历,电子/通信/计算机相关专业背景优先。

2603_96673702的博客 283

STM32开发——简介、开发环境(Keil5、CubeMX)、HAL库

什么是单片机?单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。STM系列单片机命名规则ST -- 意法半导体M -- Microelectronics 微电子32 -- 总线宽度项目。

m0_67794575的博客 1万+
上一篇: 【使用C++开发MCU】01-IIC实例之接口概述(基于NXP S32K1 MCU)
下一篇: 【使用C++开发MCU】03-IIC实例之UML画个图展现设计(分析NXP S32SDK IIC Driver)
mcucpp
博客等级 码龄12年 56粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值