【STM32】利用CubeMX对FreeRTOS用按键控制任务

这篇具有很好参考价值的文章主要介绍了【STM32】利用CubeMX对FreeRTOS用按键控制任务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。

此次实验目标:

1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印

2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印

3.创建任务三:通过KEY1实现对任务一的创建和删除。

按键按下以后如果有任务一就删除任务一,没有任务一就创建任务一。

4. 创建任务四:通过KEY2实现对任务二的暂停和恢复。

按键按下以后如果任务二在执行就暂停任务二,任务二在暂停就恢复任务二。

实现方式:

使用正点原子探索者,主控芯片为STM32F407ZGT6。

一、主要的电气原理图如下:

【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32

【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32 【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32

二、CubeMX配置

1.设置FreeRTOS

【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32

2.设置usart1

波特率115200

3.设置时钟,选择外部高速时钟

配置时钟树如下

【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32

4.注意一定要修改时基

【STM32】利用CubeMX对FreeRTOS用按键控制任务,STM32,按键,FreeRTOS,单片机,嵌入式硬件,stm32

5.生成代码

三、编写代码(都在freertos.c中写)

1.串口重定向

#include <stdio.h>// 包含标准输入输出头文件
 
int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

2.实现任务的代码

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* definition and creation of LED1 */
  osThreadDef(LED1, led1, osPriorityNormal, 0, 128);
  LED1Handle = osThreadCreate(osThread(LED1), NULL);

  /* definition and creation of LED2 */
  osThreadDef(LED2, led2, osPriorityIdle, 0, 128);
  LED2Handle = osThreadCreate(osThread(LED2), NULL);

  /* definition and creation of KEY1 */
  osThreadDef(KEY1, key1, osPriorityIdle, 0, 128);
  KEY1Handle = osThreadCreate(osThread(KEY1), NULL);

  /* definition and creation of KEY2 */
  osThreadDef(KEY2, key2, osPriorityIdle, 0, 128);
  KEY2Handle = osThreadCreate(osThread(KEY2), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Header_led1 */
/**
  * @brief  Function implementing the LED1 thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_led1 */
void led1(void const * argument)
{
  /* USER CODE BEGIN led1 */
  /* Infinite loop */
  for(;;)
  {
		printf("led1\n\r");
		HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);
    osDelay(1000);
  }
  /* USER CODE END led1 */
}

/* USER CODE BEGIN Header_led2 */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_led2 */
void led2(void const * argument)
{
  /* USER CODE BEGIN led2 */
  /* Infinite loop */
  for(;;)
  {
    printf("led2\n\r");
		HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);
    osDelay(500);
  }
  /* USER CODE END led2 */
}

/* USER CODE BEGIN Header_key1 */
/**
* @brief Function implementing the KEY1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_key1 */
void key1(void const * argument)
{
  /* USER CODE BEGIN key1 */
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0)
		{
			osDelay(20);//防误触
			if(LED1Handle==NULL)
			{
				printf("key1==creat\n\r");
				osThreadDef(LED1, led1, osPriorityNormal, 0, 128);
				LED1Handle = osThreadCreate(osThread(LED1), (void*)"new task1");
				
			}
			else
			{
				vTaskDelete(LED1Handle);
				LED1Handle=NULL;
				printf("key1==delete\n\r");
			}
		}
  }
  /* USER CODE END key1 */
}

/* USER CODE BEGIN Header_key2 */
/**
* @brief Function implementing the KEY2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_key2 */
void key2(void const * argument)
{
  /* USER CODE BEGIN key2 */
	char Flag=0;
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0)
		{
			osDelay(20);//防误触
			if(Flag==0)
			{
				printf("key2 suspend\n\r");
				vTaskSuspend(LED2Handle);
				Flag=1;
			}
			else
			{
				vTaskResume(LED2Handle);
				printf("key2  resume \n\r");
				Flag=0;
			}
		}
  }
  /* USER CODE END key2 */
}

/* Private application code --------------------------------------------------*/

注意:任务被删除时,句柄不会删除,需要手动清空。文章来源地址https://www.toymoban.com/news/detail-640126.html

到了这里,关于【STM32】利用CubeMX对FreeRTOS用按键控制任务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

    这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。 本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。 实现功能:LED0与LED1默认熄灭,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按

    2024年02月16日
    浏览(42)
  • STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

    搭建完成开发STM32开发环境之后,开始GPIO的学习。上一节已经测试了使用GPIO的输出模式,实现LED点亮的功能。 本次案例实现GPIO的输入检测功能,实现按键状态检测,通过按键状态控制LED。 需求分析: 接线:PA6-KEY1、PA7-KEY2、PA0-LED1、PA1-LED2; KEY1控制LED1、KEY2控制LED2; 按键闭

    2024年04月23日
    浏览(42)
  • 【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率

    采用德飞莱STM32板,主控芯片STM32F103ZET6。 任务内容 :利用按键B1控制指示灯LD2的闪烁频率,闪烁频率设置为3档:初始状态时,LD2按照2Hz的频率闪烁;第一次按键后,LD2按照10 Hz的频率闪烁;第二次按键后,LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁,并重复

    2024年02月07日
    浏览(43)
  • (第48-59讲)STM32F4单片机,FreeRTOS【事件标志、任务通知、软件定时器、Tickless低功耗】【纯文字讲解】【】

    【吐血总结】FreeRTOS难点、Systick中断-滴答定时器、PendSV中断-任务切换、SVC中断-系统底层、时间片调度-时钟节拍【已完结】 (第1-8讲)STM32F4单片机,FreeRTOS基础知识总结【视频笔记、代码讲解】【正点原子】【原创】 (第9-10讲)STM32F4单片机,FreeRTOS任务创建和删除(动态方

    2024年02月01日
    浏览(54)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(77)
  • K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数         1、参数         2、引脚说明 三、驱动说明         TB6612模块驱动说明         对应程序:         ENA ENB输出PWM 四、部分代码说明         接线说明                 1、STC89C52RC+TB6612模块                 2、STM32F

    2024年02月15日
    浏览(29)
  • K_A08_013 基于 STM32等单片机驱动大功率MOS管模块按键控制直流电机加减速启停

    目录 一、资源说明 二、基本参数         参数         引脚说明 三、驱动说明         大功率MOS模块驱动         对应程序: 四、部分代码说明         接线说明                 STC89C52RC+大功率MOS模块                 STM32F103C8T6+大功率MO

    2023年04月26日
    浏览(45)
  • 基于STM32CubeMX创建FreeRTOS—以STM32F429为例

    目录 1. 实验任务 2. 使用STM32CubeMX创建基础工程 2.1 使用STM32CubeMX创建项目 2.2 创建新项目 2.3 时钟设置 2.4 时钟配置树 2.5 修改时钟基准,打开串行调试 2.6 配置串口 2.7 配置状态指示灯 2.8 FreeRTOS配置 2.9 配置工程输出项 3. 代码编辑 3.1 printf重映射 3.1.1 使用ARMCC 5编译器时的print

    2024年01月22日
    浏览(35)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(51)
  • K_A08_005 基于 STM32等单片机驱动XY-160D模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数 四、部分代码说明         接线说明                 1、STC89C52RC+XY-160D模块                  2、STM32F103C8T6+XY-160D模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目所有材料清单 八、注意事项 九

    2024年02月14日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包