FreeRTOS入门——基于FreeRTOS的多任务程序与AHT20数据采集原理电路

FreeRTOS入门——基于FreeRTOS的多任务程序与AHT20数据采集原理电路

一、AHT20数据采集原理电路绘制

在stm32最小系统电路原理中添加 AHT20数据采集原理电路
在这里插入图片描述

引脚图
在这里插入图片描述

  1. 绘制元器件
    创建一个原理图库
    点击图片中箭头所指的选项,可以添加一个原理图库到所选的工程中去
    在这里插入图片描述
    创建新器件
    点击图片上箭头指向的按钮均可添加器件
    在这里插入图片描述
    绘制元器件
    放置器件底板
    在屏幕白板上点击”右键“,选中”放置“中的”矩形“,即可放置一个底板
    在这里插入图片描述
    放置引脚
    点击图上工具栏中的管脚工具或点击右键选中“放置”里面的管脚选项即可放置引脚
    在这里插入图片描述
    使用Symbol Wizard辅助绘制元器件
    在这里插入图片描述
  2. 添加原理图库
    在参照上一个步骤绘制好所有需要的元器件后,我们就可以开始将我们的原理图库添加进库里备用
    点击“库”窗口中的“Libraries”,在弹出的窗口中点击“安装”,选择“从文件中安装”
    在这里插入图片描述
  3. 绘制采集电路
    应用电路如下
    在这里插入图片描述
    在库中选中需要的元器件,双击并将它放置在原理图上
    在这里插入图片描述
    最后电路如下
### 解决AHT20FreeRTOS中的错误 当在FreeRTOS环境中使用AHT20传感器时,可能会遇到多种类型的错误。这些错误可能来源于硬件通信问题、任务优先级配置不当或者驱动程序的设计缺陷。以下是针对常见问题的分析和解决方案。 #### 1. **I²C通信超时** 如果AHT20未能成功通过I²C总线主机设备建立连接,则可能导致读取失败或超时错误。这通常是因为I²C初始化不正确或外部干扰引起的。可以通过以下方法排查: - 确认I²C外设已正确定义并启用中断支持[^2]。 - 使用逻辑分析仪验证SCL和SDA信号波形是否正常。 ```c void I2C_Init() { // 初始化I²C外设 HAL_I2C_MspInit(&hi2c1); } ``` #### 2. **任务切换引发的数据丢失** 在多任务环境下,多个任务共享同一资源(如I²C总线)时可能发生竞争条件。为了避免这种情况,应引入互斥锁来保护临界区操作。 - 创建一个互斥量用于同步访问I²C接口: ```c SemaphoreHandle_t i2cMutex; // 在系统初始化阶段创建互斥量 i2cMutex = xSemaphoreCreateMutex(); if (i2cMutex != NULL) { // 成功创建 } else { // 错误处理 } ``` - 修改`AHT20_Read()`函数以包含互斥控制逻辑: ```c void AHT20_Read(float *Temperature, float *Humidity) { if (xSemaphoreTake(i2cMutex, portMAX_DELAY)) { // 尝试获取互斥量 // 执行实际的I²C传输过程... // 模拟数据解析流程 uint8_t buffer[7]; HAL_StatusTypeDef status = HAL_I2C_Master_Receive(&hi2c1, AHT20_ADDR << 1, buffer, sizeof(buffer), HAL_MAX_DELAY); if (status == HAL_OK) { // 数据转换成温度湿度浮点数 *Temperature = ((buffer[3] & 0xF) << 16 | buffer[4] << 8 | buffer[5]) / 1048576.0f; *Humidity = (((buffer[1] << 16) | (buffer[2] << 8) | buffer[3]) >> 4) / 1048576.0f; } xSemaphoreGive(i2cMutex); // 释放互斥量 } } ``` #### 3. **软复位机制未生效** 依据描述,在某些情况下执行软复位命令后仍无法恢复正常工作状态。此现象可能是由于等待时间不足所致。按照官方文档说明,软复位完成后至少需要延迟20毫秒才能继续其他指令发送[^4]。 因此建议调整如下代码片段确保足够的延时期间: ```c void AHT20_SoftReset(void){ uint8_t cmdSoftReset[] = {SOFT_RESET_CMD}; HAL_I2C_Master_Transmit(&hi2c1, AHT20_ADDR<<1, cmdSoftReset, sizeof(cmdSoftReset), HAL_MAX_DELAY); vTaskDelay(pdMS_TO_TICKS(20)); // 延迟20ms以便完成内部重置动作 } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值