上次我已经讲过如何快速使用在线库建立我们的STM32项目,这次我会给大家介绍如何快速使用Keil5在线库建立FreeRTOS项目,废话不说,没有看我上次建立项目的,可以去看一下我上次建立的STM32项目打个基础
😁😁😁😁😁😁😁😁😁😁😁😁 上次文章连接😁😁😁😁😁😁😁😁😁😁😁😁😁😁
首先找到在线下载按键,在库函数中找到FreeRTOS的库函数进行下载

勾选这些选项参数,如果出现警告,看过我前一篇文章的小伙伴自动如何解决,我这里就不多赘述了


- /*
- FreeRTOS V10.4.6- Copyright (C) 2016 Real Time Engineers Ltd.
- All rights reserved
- VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
- This file is part of the FreeRTOS distribution.
- FreeRTOS is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License (version 2) as published by the
- Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
- ***************************************************************************
- >>! NOTE: The modification to the GPL is included to allow you to !<<
- >>! distribute a combined work that includes FreeRTOS without being !<<
- >>! obliged to provide the source code for proprietary components !<<
- >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
- FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. Full license text is available on the following
- link: http://www.freertos.org/a00114.html
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * http://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
- http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- the FAQ page "My application does not run, what could be wrong?". Have you
- defined configASSERT()?
- http://www.FreeRTOS.org/support - In return for receiving this top quality
- embedded software for free we request you assist our global community by
- participating in the support forum.
- http://www.FreeRTOS.org/training - Investing in training allows your team to
- be as productive as possible as early as possible. Now you can receive
- FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- Ltd, and the world's leading authority on the world's leading RTOS.
- http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- compatible FAT file system, and our tiny thread aware UDP/IP stack.
- http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
- http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
- Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
- licenses offer ticketed support, indemnification and commercial middleware.
- http://www.SafeRTOS.com - High Integrity Systems also provide a safety
- engineered and independently SIL3 certified version for use in safety and
- mission critical applications that require provable dependability.
- 1 tab == 4 spaces!
- */
-
-
- #ifndef FREERTOS_CONFIG_H
- #define FREERTOS_CONFIG_H
-
- #include "sys.h"
- #include "usart.h"
- //针对不同的编译器调用不同的stdint.h文件
- #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
- #include
- extern uint32_t SystemCoreClock;
- #endif
-
- //断言
- #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
- #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
-
- /***************************************************************************************************************/
- /* FreeRTOS基础配置配置选项 */
- /***************************************************************************************************************/
- #define configUSE_PREEMPTION 1 //1使用抢占式内核,0使用协程
- #define configUSE_TIME_SLICING 1 //1使能时间片调度(默认式使能的)
- #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1启用特殊方法来选择下一个要运行的任务
- //一般是硬件计算前导零指令,如果所使用的
- //MCU没有这些硬件指令的话此宏应该设置为0!
- #define configUSE_TICKLESS_IDLE 0 //1启用低功耗tickless模式
- #define configUSE_QUEUE_SETS 1 //为1时启用队列
- #define configCPU_CLOCK_HZ (SystemCoreClock) //CPU频率
- #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
- #define configMAX_PRIORITIES (32) //可使用的最大优先级
- #define configMINIMAL_STACK_SIZE ((unsigned short)130) //空闲任务使用的堆栈大小
- #define configMAX_TASK_NAME_LEN (16) //任务名字字符串长度
-
- #define configUSE_16_BIT_TICKS 0 //系统节拍计数器变量数据类型,
- //1表示为16位无符号整形,0表示为32位无符号整形
- #define configIDLE_SHOULD_YIELD 1 //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
- #define configUSE_TASK_NOTIFICATIONS 1 //为1时开启任务通知功能,默认开启
- #define configUSE_MUTEXES 1 //为1时使用互斥信号量
- #define configQUEUE_REGISTRY_SIZE 8 //不为0时表示启用队列记录,具体的值是可以
- //记录的队列和信号量最大数目。
- #define configCHECK_FOR_STACK_OVERFLOW 0 //大于0时启用堆栈溢出检测功能,如果使用此功能
- //用户必须提供一个栈溢出钩子函数,如果使用的话
- //此值可以为1或者2,因为有两种栈溢出检测方法。
- #define configUSE_RECURSIVE_MUTEXES 1 //为1时使用递归互斥信号量
- #define configUSE_MALLOC_FAILED_HOOK 0 //1使用内存申请失败钩子函数
- #define configUSE_APPLICATION_TASK_TAG 0
- #define configUSE_COUNTING_SEMAPHORES 1 //为1时使用计数信号量
-
- /***************************************************************************************************************/
- /* FreeRTOS与内存申请有关配置选项 */
- /***************************************************************************************************************/
- #define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
- #define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) //系统所有总的堆大小
-
- /***************************************************************************************************************/
- /* FreeRTOS与钩子函数有关的配置选项 */
- /***************************************************************************************************************/
- #define configUSE_IDLE_HOOK 0 //1,使用空闲钩子;0,不使用
- #define configUSE_TICK_HOOK 0 //1,使用时间片钩子;0,不使用
-
- /***************************************************************************************************************/
- /* FreeRTOS与运行时间和任务状态收集有关的配置选项 */
- /***************************************************************************************************************/
- #define configGENERATE_RUN_TIME_STATS 0 //为1时启用运行时间统计功能
- #define configUSE_TRACE_FACILITY 1 //为1启用可视化跟踪调试
- #define configUSE_STATS_FORMATTING_FUNCTIONS 1 //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
- //prvWriteNameToBuffer(),vTaskList(),
- //vTaskGetRunTimeStats()
-
- /***************************************************************************************************************/
- /* FreeRTOS与协程有关的配置选项 */
- /***************************************************************************************************************/
- #define configUSE_CO_ROUTINES 0 //为1时启用协程,启用协程以后必须添加文件croutine.c
- #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //协程的有效优先级数目
-
- /***************************************************************************************************************/
- /* FreeRTOS与软件定时器有关的配置选项 */
- /***************************************************************************************************************/
- #define configUSE_TIMERS 1 //为1时启用软件定时器
- #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
- #define configTIMER_QUEUE_LENGTH 5 //软件定时器队列长度
- #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
-
- /***************************************************************************************************************/
- /* FreeRTOS可选函数配置选项 */
- /***************************************************************************************************************/
- #define INCLUDE_xTaskGetSchedulerState 1
- #define INCLUDE_vTaskPrioritySet 1
- #define INCLUDE_uxTaskPriorityGet 1
- #define INCLUDE_vTaskDelete 1
- #define INCLUDE_vTaskCleanUpResources 1
- #define INCLUDE_vTaskSuspend 1
- #define INCLUDE_vTaskDelayUntil 1
- #define INCLUDE_vTaskDelay 1
- #define INCLUDE_eTaskGetState 1
- #define INCLUDE_xTimerPendFunctionCall 1
-
- /***************************************************************************************************************/
- /* FreeRTOS与中断有关的配置选项 */
- /***************************************************************************************************************/
- #ifdef __NVIC_PRIO_BITS
- #define configPRIO_BITS __NVIC_PRIO_BITS
- #else
- #define configPRIO_BITS 4
- #endif
-
- #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级
- #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级
- #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
- #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
-
- /***************************************************************************************************************/
- /* FreeRTOS与中断服务函数有关的配置选项 */
- /***************************************************************************************************************/
- #define xPortPendSVHandler PendSV_Handler
- #define vPortSVCHandler SVC_Handler
-
- #endif /* FREERTOS_CONFIG_H */
-
- #ifndef __DELAY_H
- #define __DELAY_H
- #include "sys.h"
- //
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //使用SysTick的普通计数模式对延迟进行管理(适合STM32F10x系列)
- //包括delay_us,delay_ms
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //创建日期:2010/1/1
- //版本:V1.8
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //********************************************************************************
- //V1.2修改说明
- //修正了中断中调用出现死循环的错误
- //防止延时不准确,采用do while结构!
- //V1.3修改说明
- //增加了对UCOSII延时的支持.
- //如果使用ucosII,delay_init会自动设置SYSTICK的值,使之与ucos的TICKS_PER_SEC对应.
- //delay_ms和delay_us也进行了针对ucos的改造.
- //delay_us可以在ucos下使用,而且准确度很高,更重要的是没有占用额外的定时器.
- //delay_ms在ucos下,可以当成OSTimeDly来用,在未启动ucos时,它采用delay_us实现,从而准确延时
- //可以用来初始化外设,在启动了ucos之后delay_ms根据延时的长短,选择OSTimeDly实现或者delay_us实现.
- //V1.4修改说明 20110929
- //修改了使用ucos,但是ucos未启动的时候,delay_ms中中断无法响应的bug.
- //V1.5修改说明 20120902
- //在delay_us加入ucos上锁,防止由于ucos打断delay_us的执行,可能导致的延时不准。
- //V1.6修改说明 20150109
- //在delay_ms加入OSLockNesting判断。
- //V1.7修改说明 20150319
- //修改OS支持方式,以支持任意OS(不限于UCOSII和UCOSIII,理论上任意OS都可以支持)
- //添加:delay_osrunning/delay_ostickspersec/delay_osintnesting三个宏定义
- //添加:delay_osschedlock/delay_osschedunlock/delay_ostimedly三个函数
- //V1.8修改说明 20150519
- //修正UCOSIII支持时的2个bug:
- //delay_tickspersec改为:delay_ostickspersec
- //delay_intnesting改为:delay_osintnesting
- //
-
- void delay_init(void);
- void delay_ms(u32 nms);
- void delay_us(u32 nus);
- void delay_xms(u32 nms);
-
- #endif
-
-
-
-
-
- #include "FreeRTOSConfig.h" // ARM.FreeRTOS::RTOS:Config
- #include "delay.h"
- #include "sys.h"
- //
- //如果需要使用OS,则包括下面的头文件即可.
- #if SYSTEM_SUPPORT_OS
- #include "FreeRTOS.h" //FreeRTOS使用
- #include "task.h"
- #endif
- //
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //使用SysTick的普通计数模式对延迟进行管理(支持OS)
- //包括delay_us,delay_ms
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //创建日期:2016/11/28
- //版本:V1.8
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //********************************************************************************
- //修改说明
- //
-
- static u8 fac_us=0; //us延时倍乘数
- static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数
-
-
- extern void xPortSysTickHandler(void);
-
- systick中断服务函数,使用ucos时用到
- void SysTick_Handler(void)
- {
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
- {
- xPortSysTickHandler();
- }
- }
-
- //初始化延迟函数
- //SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8
- //这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率!
- //SYSCLK:系统时钟频率
- void delay_init()
- {
- u32 reload;
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
- fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用
- reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M
- reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
- //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
- fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位
-
- SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
- SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
- }
-
-
- //延时nus
- //nus:要延时的us数.
- //nus:0~204522252(最大值即2^32/fac_us@fac_us=168)
- void delay_us(u32 nus)
- {
- u32 ticks;
- u32 told,tnow,tcnt=0;
- u32 reload=SysTick->LOAD; //LOAD的值
- ticks=nus*fac_us; //需要的节拍数
- told=SysTick->VAL; //刚进入时的计数器值
- while(1)
- {
- tnow=SysTick->VAL;
- if(tnow!=told)
- {
- if(tnow
//这里注意一下SYSTICK是一个递减的计数器就可以了. - else tcnt+=reload-tnow+told;
- told=tnow;
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
- }
- };
- }
- //延时nms
- //nms:要延时的ms数
- //nms:0~65535
- void delay_ms(u32 nms)
- {
- // vTaskDelay(nms); //FreeRTOS延时
- if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
- {
- if(nms>=fac_ms) //延时的时间大于OS的最少时间周期
- {
- vTaskDelay(nms/fac_ms); //FreeRTOS延时
- }
- nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时
- }
- delay_us((u32)(nms*1000)); //普通方式延时
- }
-
- //延时nms,不会引起任务调度
- //nms:要延时的ms数
- void delay_xms(u32 nms)
- {
- u32 i;
- for(i=0;i
1000); - }
-
-
-
-
-
-
- #ifndef __USART_H
- #define __USART_H
- #include "stdio.h"
- #include "sys.h"
- //
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //串口1初始化
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //修改日期:2012/8/18
- //版本:V1.5
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //********************************************************************************
- //V1.3修改说明
- //支持适应不同频率下的串口波特率设置.
- //加入了对printf的支持
- //增加了串口接收命令功能.
- //修正了printf第一个字符丢失的bug
- //V1.4修改说明
- //1,修改串口初始化IO的bug
- //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
- //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
- //4,修改了EN_USART1_RX的使能方式
- //V1.5修改说明
- //1,增加了对UCOSII的支持
- #define USART_REC_LEN 200 //定义最大接收字节数 200
- #define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
-
- extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
- extern u16 USART_RX_STA; //接收状态标记
- //如果想串口中断接收,请不要注释以下宏定义
- void uart_init(u32 bound);
- #endif
-
-
- #include "sys.h"
- #include "usart.h"
- //
- //如果使用ucos,则包括下面的头文件即可.
- #if SYSTEM_SUPPORT_OS
- #include "FreeRTOS.h" //FreeRTOS使用
- #endif
- //
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //串口1初始化
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //修改日期:2012/8/18
- //版本:V1.5
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //********************************************************************************
- //V1.3修改说明
- //支持适应不同频率下的串口波特率设置.
- //加入了对printf的支持
- //增加了串口接收命令功能.
- //修正了printf第一个字符丢失的bug
- //V1.4修改说明
- //1,修改串口初始化IO的bug
- //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
- //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
- //4,修改了EN_USART1_RX的使能方式
- //V1.5修改说明
- //1,增加了对UCOSII的支持
- //
-
-
- //
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- #if 1
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
-
- };
-
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
- USART1->DR = (u8) ch;
- return ch;
- }
- #endif
-
- /*使用microLib的方法*/
- /*
- int fputc(int ch, FILE *f)
- {
- USART_SendData(USART1, (uint8_t) ch);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
-
- return ch;
- }
- int GetKey (void) {
- while (!(USART1->SR & USART_FLAG_RXNE));
- return ((int)(USART1->DR & 0x1FF));
- }
- */
-
- #if EN_USART1_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART_RX_STA=0; //接收状态标记
-
- void uart_init(u32 bound){
- //GPIO端口设置
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
-
- //USART1_TX GPIOA.9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
-
- //USART1_RX GPIOA.10初始化
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
- GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
-
- //Usart1 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
-
- //USART 初始化设置
-
- USART_InitStructure.USART_BaudRate = bound;//串口波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
-
- USART_Init(USART1, &USART_InitStructure); //初始化串口1
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
- USART_Cmd(USART1, ENABLE); //使能串口1
- }
-
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u8 Res;
-
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
- {
- Res =USART_ReceiveData(USART1); //读取接收到的数据
-
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(Res==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- }
- }
- #endif
-


因为STM32F103的内存没有我们配置的内存大需要修改配置函数
换芯片,把芯片配置改成STM32F103RCT6等大容量芯片



修改 FreeRTOSConfig,h文件的configTOTAL_HEAP_SIZE参数

- /*----------------------------------------*
- * *
- * 星之援网络科技工作室学习资料v1.0 *
- * 时间:2022.7.14 *
- * 程序介绍:点灯实验 *
- * 实现效果:板载LED灯闪烁 *
- * *
- *----------------------------------------*
- */
-
-
- /* FreeRTOS头文件 */
- #include "FreeRTOSConfig.h"
- #include "string.h"
- #include "FreeRTOS.h"
- #include "task.h"
- /* 设备文件*/
- #include "delay.h"
- #include "led.h"
- #include "usart.h"
- //任务优先级
- #define START_TASK_PRIO 1
- //任务堆栈大小
- #define START_STK_SIZE 512
- //任务句柄
- TaskHandle_t StartTask_Handler;
- //任务函数
- void start_task(void *pvParameters);
- //任务优先级
- #define TASK1_TASK_PRIO 2
- //任务堆栈大小
- #define TASK1_STK_SIZE 512
- //任务句柄
- TaskHandle_t Task1Task_Handler;
- //任务函数
- void task1_task(void *pvParameters);
-
- int main(void)
- {
- BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
- delay_init(); //延时函数初始化
- uart_init(115200); //初始化串口
- /* LED 端口初始化 */
- LED_GPIO_Config();
-
- //创建开始任务
- xReturn = xTaskCreate((TaskFunction_t )start_task, //任务函数
- (const char* )"start_task", //任务名称
- (uint16_t )START_STK_SIZE, //任务堆栈大小
- (void* )NULL, //传递给任务函数的参数
- (UBaseType_t )START_TASK_PRIO, //任务优先级
- (TaskHandle_t* )&StartTask_Handler); //任务句柄
- /* 启动任务调度 */
- if(pdPASS == xReturn)
- vTaskStartScheduler(); /* 启动任务,开启调度 */
- else
- return -1;
-
- while(1); /* 正常不会执行到这里 */
- }
- //开始任务任务函数
- void start_task(void *pvParameters)
- {
-
- BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
- taskENTER_CRITICAL(); //进入临界区
- //创建TASK1任务
- xReturn= xTaskCreate((TaskFunction_t )task1_task,
- (const char* )"Usart_task",
- (uint16_t )TASK1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK1_TASK_PRIO,
- (TaskHandle_t* )&Task1Task_Handler);
- if(pdPASS == xReturn)
-
-
- printf("\r\nFree heap: %d bytes\n", xPortGetFreeHeapSize()); /*打印剩余堆栈大小*/
-
- vTaskDelete(StartTask_Handler); //删除开始任务
- taskEXIT_CRITICAL(); //退出临界区
- }
- /*********************************************************************************
- * @Function : 任务1
- * @Input : None
- * @Output : None
- * @Return : None
- * @Others : None
- * @Date : 2022-07-23
- **********************************************************************************/
- void task1_task(void *pvParameters)
- {
- u8 time;
- while(1)
- {
- time++;
- if(time%300==0){
- time=0;
- LED1_TOGGLE; // 亮
- }
- delay_ms(10);
- }
- }
-
链接:程序连接
提取码:ogin