【STM32】使用CubeMX快速创建FreeRTOS的基础工程,基于正点原子

这篇具有很好参考价值的文章主要介绍了【STM32】使用CubeMX快速创建FreeRTOS的基础工程,基于正点原子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

【STM32】HAL库 新建MDK工程

【STM32】HAL库 串口轮询发送

【STM32】HAL库 LED闪烁、流水灯

【STM32】HAL库 定时器中断

【STM32】HAL库 外部中断


前言

使用STM32F103C8T6开发板,用STM32CubeMX配置FreeRTOS,可以适配正点原子FreeRTOS所有实验的基础工程

一、STM32CubeMX设置

选择芯片

stm32cubemx freertos,stm32,嵌入式硬件,单片机
stm32cubemx freertos,stm32,嵌入式硬件,单片机

配置系统时钟

stm32cubemx freertos,stm32,嵌入式硬件,单片机
stm32cubemx freertos,stm32,嵌入式硬件,单片机

HAL的时基不能选择系统定时器
stm32cubemx freertos,stm32,嵌入式硬件,单片机

GPIO

PA0和PA1输出模式,驱动两个LED灯。
PB4、PB6和PB11输入模式,PB1外部中断下降沿触发,全部上拉,检测按键。
stm32cubemx freertos,stm32,嵌入式硬件,单片机

定时器

定时器2和定时器3的周期设置为1秒
stm32cubemx freertos,stm32,嵌入式硬件,单片机
stm32cubemx freertos,stm32,嵌入式硬件,单片机

定时器4,设置为1000Hz的10到100倍,100倍为100000Hz。用于测任务运行时间。
stm32cubemx freertos,stm32,嵌入式硬件,单片机

串口

用于打印信息
stm32cubemx freertos,stm32,嵌入式硬件,单片机

FreeRTOS设置

stm32cubemx freertos,stm32,嵌入式硬件,单片机

中断

把定时器3优先级改为6,生成工程文件后,再将定时器2优先级改为4。
定时器1优先级改为最高,可以在任务中使用HAL_Delay代替正点原子的delay_ms
stm32cubemx freertos,stm32,嵌入式硬件,单片机

设置堆空间

这款芯片的RAM空间为20k,可以设置堆空间为10k
stm32cubemx freertos,stm32,嵌入式硬件,单片机

Config parameters

stm32cubemx freertos,stm32,嵌入式硬件,单片机

Include parameters

stm32cubemx freertos,stm32,嵌入式硬件,单片机

互斥量

stm32cubemx freertos,stm32,嵌入式硬件,单片机

事件

stm32cubemx freertos,stm32,嵌入式硬件,单片机

任务

给它们设置不同的优先级
stm32cubemx freertos,stm32,嵌入式硬件,单片机

队列

按键队列和大数据队列
stm32cubemx freertos,stm32,嵌入式硬件,单片机

软件定时器

单次和周期
stm32cubemx freertos,stm32,嵌入式硬件,单片机

二值信号量

stm32cubemx freertos,stm32,嵌入式硬件,单片机

计数信号量

stm32cubemx freertos,stm32,嵌入式硬件,单片机

工程设置

stm32cubemx freertos,stm32,嵌入式硬件,单片机
stm32cubemx freertos,stm32,嵌入式硬件,单片机

二、代码

LED闪烁

void LED0_TOGGLE(void)
{
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
}
void LED1_TOGGLE(void)
{
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
}
void task1(void *argument)
{
  /* USER CODE BEGIN task1 */
  /* Infinite loop */
  for(;;)
  {
		LED0_TOGGLE();
    	osDelay(500); 
  }
  /* USER CODE END task1 */
}
void task2(void *argument)
{
  /* USER CODE BEGIN task2 */
  /* Infinite loop */
  for(;;)
  {
		LED1_TOGGLE();
    	osDelay(500); 
  }
  /* USER CODE END task2 */
}

串口

stm32cubemx freertos,stm32,嵌入式硬件,单片机

#include <stdio.h>

int fputc(int ch, FILE  *f)
{
	HAL_UART_Transmit(&huart1, (uint8_t*)&ch ,1,1000);
	return (ch);
}
void task1(void *argument)
{
  /* USER CODE BEGIN task1 */
  /* Infinite loop */
	 uint32_t task1_num = 0;
  for(;;)
  {
	printf("task1_num:%d\r\n",++task1_num);
	LED0_TOGGLE();
    osDelay(500);
  }
  /* USER CODE END task1 */
}
void task2(void *argument)
{
  /* USER CODE BEGIN task2 */
  /* Infinite loop */
    uint32_t task2_num = 0;
  for(;;)
  {
	printf("task2_num:%d\r\n",++task2_num);
	LED1_TOGGLE();
    osDelay(500);  
	}
  /* USER CODE END task2 */
}

按键扫描

uint8_t key_scan(uint8_t mode);  

#define KEY0        HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)     
#define KEY1        HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6)     
#define KEY2        HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)     
#define WK_UP       HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_11)     

#define KEY0_PRES    1             
#define KEY1_PRES    2             
#define KEY2_PRES    3             
#define WKUP_PRES    4    

uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1; 
    uint8_t keyval = 0;

    if (mode) key_up = 1;      

    if (key_up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 0))  
    {
        HAL_Delay (10);           
        key_up = 0;

        if (KEY0 == 0)  keyval = KEY0_PRES;

        if (KEY1 == 0)  keyval = KEY1_PRES;

        if (KEY2 == 0)  keyval = KEY2_PRES;

        if (WK_UP == 0) keyval = WKUP_PRES;
    }
    else if (KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 1)        
    {
        key_up = 1;
    }

    return keyval;              
}
void task3(void *argument)
{
  /* USER CODE BEGIN task3 */
  /* Infinite loop */
  uint8_t key = 0;
  for(;;)
  {
		key = key_scan(0);
		if(key) printf("key = %d\r\n",key);
		osDelay(10);
  }
  /* USER CODE END task3 */
}

定时器

修改定时器2的优先级

   HAL_NVIC_SetPriority(TIM2_IRQn, 4, 0);

打开定时器中断

	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);

定时器回调函数,打印定时器的优先级

uint32_t FreeRTOSRunTimeTicks;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */
  uint32_t preemptPriority, subPriority;
  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM1) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */
  if (htim->Instance == TIM2) {
		HAL_NVIC_GetPriority(TIM2_IRQn, NVIC_PRIORITYGROUP_4, &preemptPriority, &subPriority);
		printf("TIM2_Priority:%d\r\n",preemptPriority);
  }
  if (htim->Instance == TIM3) {
		HAL_NVIC_GetPriority(TIM3_IRQn, NVIC_PRIORITYGROUP_4, &preemptPriority, &subPriority);
		printf("TIM3_Priority:%d\r\n",preemptPriority);
  }  
	if (htim->Instance == TIM4) {
	FreeRTOSRunTimeTicks++;
  }
  /* USER CODE END Callback 1 */
}

开启定时器4,用于任务运行时间统计文章来源地址https://www.toymoban.com/news/detail-825183.html

void configureTimerForRunTimeStats(void)
{
	HAL_TIM_Base_Start_IT(&htim4);
}

unsigned long getRunTimeCounterValue(void)
{
	return FreeRTOSRunTimeTicks;
}

FreeRTOSConfig.h

#define configUSE_QUEUE_SETS                            1                       /* 1: 使能队列集, 默认: 0 */

到了这里,关于【STM32】使用CubeMX快速创建FreeRTOS的基础工程,基于正点原子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

    学习使用Freertos第四步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(49)
  • STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事项

    以STM32F429为例: 1、SDIO配置 配置为4bit模式,此配置不是最终配置,后面会在代码进行修改。 2、Fatfs配置 Set Defines 选项中的配置可以默认,最重要注意Advanced Setting 选择中的配置,如下 该界面配置默认Use dma template是默认使能的 ,并且不可以选择,只能选择使能,所以需要使

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

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

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

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

    2024年02月10日
    浏览(63)
  • 使用STM32CubeMX创建STM32工程(串口,硬件IIC配置)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 最近教研室的项目需要使用STM32做处理器,对环境数据进行采集处理,在拿到板子后,需要根据单片机具体型号(STM32F411CEU6)创建工程,再进行上层应用的开发。因为以前都是用的F1系列的开发板,用的

    2023年04月18日
    浏览(51)
  • STM32CubeMX+FATFS+FREERTOS读写U盘

    软件:STM32CubeMX V6.6.1 、 KEIL5 V5.29 硬件:STM32F429ZET6 USB_OTG_FS:PA11/PA12引脚 USART1:PA9/PA10,方便输出调试信息 1)SYS下载方式选择SW方式,因为要使用FREERTOS,提前将时钟源修改为TIM7(其他定时器也可以) 2) RCC设置,选择高速外部晶振HSE(根据具体硬件选择) 3)USART1设置,方便输出调

    2024年01月18日
    浏览(51)
  • 【STM32】利用CubeMX对FreeRTOS用按键控制任务

    对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 3.创建任务三:通过KEY1实现对任务一的创建和删除。 按键按下以后如果有任

    2024年02月13日
    浏览(69)
  • STM32cubemx对FreeRTOS的适配(工程模板配置)

    本篇文章将带大家使用STM32cubemx对FreeRTOS进行工程模板的配置。 1.开始工程的创建: 2.芯片型号选择: 3.修改时钟为TIM8: 在FreeRTOS中SYSTICK需要为FreeRTOS提供心跳,故这里选择TIM8替换SYNTICK。 4.配置RCC: 5.配置FreeRTOS: 6.开启串口方便调试和观察: 7.工程路径及编译器选择等:

    2024年02月07日
    浏览(52)
  • STM32基于HAL库和STM32CubeMX的实时操作系统FreeRtOS开发

    1、FreeRTOS RTOS是一类操作系统,µC/OS,FreeRTOS,RTX,RT-Thread 等这些都是RTOS 类的操作系统 FreeRTOS 是众多RTOS 类操作系统中的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,FreeRTOS 也不仅仅局限于在微控制器中使用。就单从文件数量上来看FreeRTOS 要比µC/OS 少得多

    2024年02月21日
    浏览(64)
  • STM32 CubeMX (第三步Freertos中断管理和软件定时)

    学习使用Freertos第三步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(67)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包