你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】2、FreeRTOS 测试

[复制链接]
xu@xupt 提问时间:2024-3-6 21:22 / 未解决

这是一个基于 FreeRTOS 的 STM32 示例程序,它展示了如何使用两个任务分别进行数字输入和模拟输入的读取。下面是对代码的详细注释:

包含头文件和定义

#include <STM32FreeRTOS.h>  // 包含 STM32 的 FreeRTOS 库

#ifndef USER_BTN
#define USER_BTN 2          // 如果没有默认定义用户按钮的引脚,则将其定义为引脚 2
#endif

SemaphoreHandle_t xSerialSemaphore;  // 声明一个互斥信号量句柄,用于管理串口的访问

声明任务函数

void TaskDigitalRead(void *pvParameters);  // 声明数字读取任务函数
void TaskAnalogRead(void *pvParameters);   // 声明模拟读取任务函数

setup() 函数

void setup() {
  Serial.begin(9600);  // 初始化串口通信,波特率为 9600

  while (!Serial) {
    ; // 等待串口连接。对于原生 USB 板,如 Leonardo、Micro、Yun 等,这是必要的。
  }

  // 创建并初始化互斥信号量,用于管理串口的访问
  if (xSerialSemaphore == NULL) {
    xSerialSemaphore = xSemaphoreCreateMutex();
    if (xSerialSemaphore != NULL)
      xSemaphoreGive(xSerialSemaphore);
  }

  // 创建两个任务,一个用于数字读取,一个用于模拟读取
  xTaskCreate(TaskDigitalRead, "DigitalRead", 128, NULL, 2, NULL);
  xTaskCreate(TaskAnalogRead, "AnalogRead", 128, NULL, 1, NULL);

  // 启动调度器
  vTaskStartScheduler();

  // 如果 RAM 不足,输出错误信息并进入死循环
  Serial.println("Insufficient RAM");
  while (1);
}

loop() 函数

void loop() {
  // 空函数体。任务在 TaskDigitalRead 和 TaskAnalogRead 中完成。
}

数字读取任务

void TaskDigitalRead(void *pvParameters) {
  uint8_t pushButton = USER_BTN;  // 将用户按钮的引脚号赋给 pushButton
  pinMode(pushButton, INPUT);     // 设置 pushButton 引脚为输入模式

  for (;;) {  // 任务永远不应该返回或退出
    int buttonState = digitalRead(pushButton);  // 读取按钮状态

    if (xSemaphoreTake(xSerialSemaphore, (TickType_t)5) == pdTRUE) {
      // 如果成功获取到信号量,则输出按钮状态
      Serial.print("Button state: ");
      Serial.println(buttonState);
      xSemaphoreGive(xSerialSemaphore);  // 释放信号量
    }

    vTaskDelay(1);  // 在读取之间延迟 15ms 以保持稳定性
  }
}

模拟读取任务

void TaskAnalogRead(void *pvParameters) {
  for (;;) {
    int sensorValue = analogRead(A0);  // 读取模拟引脚 A0 的值

    if (xSemaphoreTake(xSerialSemaphore, (TickType_t)5) == pdTRUE) {
      // 如果成功获取到信号量,则输出传感器值
      Serial.println(sensorValue);
      xSemaphoreGive(xSerialSemaphore);  // 释放信号量
    }

    vTaskDelay(1);  // 在读取之间延迟 15ms 以保持稳定性
  }
}

这个示例展示了如何使用 FreeRTOS 在 STM32 上创建并运行多个任务,以及如何使用信号量来同步对共享资源(如串口)的访问。

效果

1、按下按键

image.png

2、松开按键

image.png

收藏 评论1 发布时间:2024-3-6 21:22

举报

1个回答
背影101 回答时间:2024-3-7 17:00:04
[md]

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版