STM32CubeMX FreeRTOS二值信号量实验

发布者:omicron25最新更新时间:2018-06-19 来源: eefocus关键字:STM32CubeMX  FreeRTOS  二值信号量 手机看文章 扫描二维码
随时随地手机看文章

系统:linux mint xfce 64bit 
软件: 
1、SW4STM32 
2、STM32CubeMX 
3、开发板:STM32F407VET6核心

二值信号量作用: 
(1)任务间同步 
(2)中断与任务间同步

本次实验二值信号量的作用是中断与任务间同步,使用STM32CubeMX配置的freertos其API进行了封装,是CMSIS格式的API,关于二值信号量的操作函数如下图所示 
这里写图片描述

实验效果:串口发送5个字节长度的字符串后,触发接收中断,同时发生二值信号量osSemaphoreRelease(myBinarySem01Handle) ,然后在任务函数1里面打印出相关信息已经字符串。

(1)配置RCC(外部晶振8M),SYS(systick设置为TIM4),LED灯所在引脚,串口1(用来打印输出信息),选择FreeRTOS 
(2)配置时钟,选择外部晶振,HCLK输入168会自动寻找配置 
这里写图片描述
(3)使能USART1中断,在设置了freertos之后串口1默认的中断优先级默认为5,使用默认即可 
这里写图片描述 
这里写图片描述 
(4)在freertos里添加信号量semaphore 
这里写图片描述 
(5)生成sw4stm32工程,记得在代码生成设置里面勾选为每个外设生成独立的.c/.h 文件 
这里写图片描述

(6)修改main.c文件内容,首先添加串口重定向,定义变量等

/* USER CODE BEGIN Includes */

#include "stdio.h"

/* USER CODE END Includes */

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

int8_t res[5];  // 接收缓存

extern osSemaphoreId myBinarySem01Handle;


/* USER CODE END PV */

/* USER CODE BEGIN 0 */

int __io_putchar(int ch)

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);


    return ch;

}


int _write(int file, char *ptr, int len)

{

    int DataIdx;


    for (DataIdx = 0; DataIdx < len; DataIdx++)

    {

        __io_putchar(*ptr++);

    }

    return len;

}

/* USER CODE END 0 */


(7)启动串口接收中断


  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_IT(&huart1,res,5);// 启动串口接收中断

  /* USER CODE END 2 */


(8)编写中断处理函数


/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

    printf("SEND SUCCESS\n");

    HAL_UART_Receive_IT(&huart1,res,5);  // 重新启动串口1接收中断

    osSemaphoreRelease(myBinarySem01Handle);// 释放信号量

}

/* USER CODE END 4 */


(9)修改freertos.c 内容


/* USER CODE BEGIN Variables */

extern uint8_t res[5];

/* USER CODE END Variables */

/* StartDefaultTask function */

void StartDefaultTask(void const * argument)

{


  /* USER CODE BEGIN StartDefaultTask */

  /* Infinite loop */

  for(;;)

  {

      if(osOK == osSemaphoreWait(myBinarySem01Handle,10))// 如果接收到信号量

      {

          printf("Semaphore Print\n");

          printf("%s\r\n",res);

//        osDelay(100);

      }

  }

  /* USER CODE END StartDefaultTask */

}


(10)烧写程序验证 
这里写图片描述


关键字:STM32CubeMX  FreeRTOS  二值信号量 引用地址:STM32CubeMX FreeRTOS二值信号量实验

上一篇:STM32控制16路舵机控制板PCA9685
下一篇:STM32CubeMX FreeRTOS软件定时器实验

推荐阅读最新更新时间:2024-03-16 16:06

STM32CubeMX FreeRTOS信号量实验
系统:linux mint xfce 64bit 软件: 1、SW4STM32 2、STM32CubeMX 3、开发板:STM32F407VET6核心 二值信号量作用: (1)任务间同步 (2)中断与任务间同步 本次实验二值信号量的作用是中断与任务间同步,使用STM32CubeMX配置的freertos其API进行了封装,是CMSIS格式的API,关于二值信号量的操作函数如下图所示 实验效果:串口发送5个字节长度的字符串后,触发接收中断,同时发生二值信号量osSemaphoreRelease(myBinarySem01Handle) ,然后在任务函数1里面打印出相关信息已经字符串。 (1)配置RCC(外部晶振8M),SYS(s
[单片机]
<font color='red'>STM32CubeMX</font> <font color='red'>FreeRTOS</font><font color='red'>二</font><font color='red'>值</font><font color='red'>信号量</font>实验
STM32CubeMx新建工程(串口)
新建一个具有串口功能的 这个是在线更新,我们取消不用更新。 选择对应的板子型号 点击进行配置 ①②选择串口 ③使能串口 ④可以根据自己需求修改波特率及一些参数(默认也可以) 出现绿色表示配置OK ①选择工程 ②工程名称 ③工程路径 ④ 选择自己的开发环境 打钩 生成.c 和.h 点击右上角生成
[单片机]
<font color='red'>STM32CubeMx</font>新建工程(串口)
stm32cubemx下stm32f103读ds18b20
环境: IAR 7.4 stm32cubemx 4.13.1 stm32f1 1.3.1 freertos 8.1 读ds18b20主要是时序,就是一个微秒级的delay。 先看电路: 这里使用上拉电阻,DQ设为OD模式,在读取和输出时,也做了PIN的方向改变,不做改变,则只能读取到0值。 不想使用上拉电阻,则可以把DQ设为PP模式,Mbed开发板使用这个可以成功读出。 没有电路的代码,是不完整的,不容易让人理解。 delay的实现,是使用timer,也可以使用nop指令。这里使用Timer3 定时器提供滴答。 GPIO和TIMER的配置使用stm32cubemx,这里不列出,有问题可以在 forum 里提出。
[单片机]
<font color='red'>stm32cubemx</font>下stm32f103读ds18b20
FreeRTOS config开始的宏
FreeRTOSConfig.h系统配置文件中可以自定义,FreeRTOS.h中定义默认值 configAPPLICATION_ALLOCATED_HEAP 默认情况下FreeRTOS的堆内存是由编译器来分配的,将宏configAPPLICATION_ALLOCATED_HEAP定义为1的话堆内存可以由用户自行设置(heap_1.c、heap_2.c、heap_3.c、heap_4.c和heap_5.c) /* Allocate the memory for the heap. */ #if( configAPPLICATION_ALLOCATED_HEAP == 1 ) /* The application writ
[单片机]
STM32CubeMX学习教程之二:GPIO输入之外部中断
本篇主要讲述GPIO外部中断输入检测,实际物理输入方式是按键,但是实际上更适合外部设备信号的输入检测,物理按键输入因为有抖动,还需要硬件或者软件去抖才比较可靠。这个例子不考虑防抖的情况。 软件版本: STM32CubeMX V4.25.0 System Workbench V2.4 硬件:OneNet 麒麟座V2.3 在STM32CubeMX中新建项目,选择正确的MCU型号 设置RCC和SYS,然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M) 根据板子的具体连接设置4个GPIO_OUTPUT (连接到LED)和4个GPIO_EXIT*(外部中断模式,
[单片机]
<font color='red'>STM32CubeMX</font>学习教程之二:GPIO输入之外部中断
STM32F407_FreeRTOS_LwIP调试详解一:Cube_MX生成工程
概要:本次使用的硬件平台是STM32F407ZGT6的板子,外加一块LAN8742A网络模块,先上一张全家福: 软件平台使用的是CubeMX V4.22及Keil V5.21.10软件。 LwIP的架构 LwIP API的三种方式: 1、使用CubeMX新建工程,如下图所示: 2、选择芯片型号:本开发板使用的是STM32F407ZGT6芯片; 3、IO口选择 3.1、选择并使能RCC时钟源为:HSE 3.2、选择并使能ETH接口为:RMII类型接口,本次使用的是LAN8742A模块,是RMII类型接口 3.3、选择并使能LWIP协议栈: 3.4、选择并使能FreeRTOS操作系
[单片机]
STM32F407_<font color='red'>FreeRTOS</font>_LwIP调试详解一:Cube_MX生成工程
如何在FreeRTOS下实现低功耗——MSP430F5438平台
0.前言 MCU实现低功耗本质而言便是停止MCU工作,通过中断的方式重新唤醒MCU,这些中断可以包括外部IO中断,UART接收中断,定时器中断等等。如果结合嵌入式操作系统,可以在空任务或者空任务钩子函数中进入低功耗模式,在系统滴答时钟中断服务函数中重新回到正常工作模式。利用操作系统进入和退出低功耗模式,需要熟悉嵌入式操作系统的空任务和系统滴答时钟中断,下面结合MSP430F5438和FreeRTOS总结一下如何使用嵌入式操作系统实现低功耗工作。 1.进入低功耗模式 多数嵌入式操作系统都包含一个空任务,空任务优先级最低且一直保持就绪状态,空任务可以用于统计CPU使用率,或者让MCU进入低功耗状态。如果不想修改空任务,还可
[单片机]
STM32CubeMX】HAL库中断方式UART串口通信
HAL库下,利用STM32CubeMX生成源代码,确实比较简单,比用标准库简单很多。 现在总结自己学习的过程: 硬件平台:正点原子探索者(STM32F407ZET6) 1、配置STM32CubeMX (1)打开STM32CubeMX,选择相应的芯片型号,并配置调试信息为:Serial Wire (2)配置RCC主频,选择外部高速晶振(HSE):Crystal/Ceramic Resonator(译文:水晶/陶瓷谐振器) 然后开始配置时钟树: 外部晶振为8MHz,配置PLL使主频为168MHz,如下图: (3)配置USART1:选择异步通信模式 (4)配置串口:115200
[单片机]
【<font color='red'>STM32CubeMX</font>】HAL库中断方式UART串口通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved