• 如何使用KEIL5快速建立FreeRTOS项目(附建立成功的源代码以及问题解析)


    前言

    上次我已经讲过如何快速使用在线库建立我们的STM32项目,这次我会给大家介绍如何快速使用Keil5在线库建立FreeRTOS项目,废话不说,没有看我上次建立项目的,可以去看一下我上次建立的STM32项目打个基础

    😁😁😁😁😁😁😁😁😁😁😁😁 上次文章连接😁😁😁😁😁😁😁😁😁😁😁😁😁😁

    关于使用KEIL建立STM32项目(附带建立好的工程以及注意事项)https://blog.csdn.net/herui_2/article/details/127068067?spm=1001.2014.3001.5501


    一 配置

    1.下载FreeRTOS库函数

    首先找到在线下载按键,在库函数中找到FreeRTOS的库函数进行下载

    2.添加FreeRTOS库函数

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

    3.修改配置参数代码

    FreeRTOSConfig.h

    1. /*
    2. FreeRTOS V10.4.6- Copyright (C) 2016 Real Time Engineers Ltd.
    3. All rights reserved
    4. VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
    5. This file is part of the FreeRTOS distribution.
    6. FreeRTOS is free software; you can redistribute it and/or modify it under
    7. the terms of the GNU General Public License (version 2) as published by the
    8. Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
    9. ***************************************************************************
    10. >>! NOTE: The modification to the GPL is included to allow you to !<<
    11. >>! distribute a combined work that includes FreeRTOS without being !<<
    12. >>! obliged to provide the source code for proprietary components !<<
    13. >>! outside of the FreeRTOS kernel. !<<
    14. ***************************************************************************
    15. FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
    16. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    17. FOR A PARTICULAR PURPOSE. Full license text is available on the following
    18. link: http://www.freertos.org/a00114.html
    19. ***************************************************************************
    20. * *
    21. * FreeRTOS provides completely free yet professionally developed, *
    22. * robust, strictly quality controlled, supported, and cross *
    23. * platform software that is more than just the market leader, it *
    24. * is the industry's de facto standard. *
    25. * *
    26. * Help yourself get started quickly while simultaneously helping *
    27. * to support the FreeRTOS project by purchasing a FreeRTOS *
    28. * tutorial book, reference manual, or both: *
    29. * http://www.FreeRTOS.org/Documentation *
    30. * *
    31. ***************************************************************************
    32. http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
    33. the FAQ page "My application does not run, what could be wrong?". Have you
    34. defined configASSERT()?
    35. http://www.FreeRTOS.org/support - In return for receiving this top quality
    36. embedded software for free we request you assist our global community by
    37. participating in the support forum.
    38. http://www.FreeRTOS.org/training - Investing in training allows your team to
    39. be as productive as possible as early as possible. Now you can receive
    40. FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
    41. Ltd, and the world's leading authority on the world's leading RTOS.
    42. http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
    43. including FreeRTOS+Trace - an indispensable productivity tool, a DOS
    44. compatible FAT file system, and our tiny thread aware UDP/IP stack.
    45. http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
    46. Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
    47. http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
    48. Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
    49. licenses offer ticketed support, indemnification and commercial middleware.
    50. http://www.SafeRTOS.com - High Integrity Systems also provide a safety
    51. engineered and independently SIL3 certified version for use in safety and
    52. mission critical applications that require provable dependability.
    53. 1 tab == 4 spaces!
    54. */
    55. #ifndef FREERTOS_CONFIG_H
    56. #define FREERTOS_CONFIG_H
    57. #include "sys.h"
    58. #include "usart.h"
    59. //针对不同的编译器调用不同的stdint.h文件
    60. #if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    61. #include
    62. extern uint32_t SystemCoreClock;
    63. #endif
    64. //断言
    65. #define vAssertCalled(char,int) printf("Error:%s,%d\r\n",char,int)
    66. #define configASSERT(x) if((x)==0) vAssertCalled(__FILE__,__LINE__)
    67. /***************************************************************************************************************/
    68. /* FreeRTOS基础配置配置选项 */
    69. /***************************************************************************************************************/
    70. #define configUSE_PREEMPTION 1 //1使用抢占式内核,0使用协程
    71. #define configUSE_TIME_SLICING 1 //1使能时间片调度(默认式使能的)
    72. #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 //1启用特殊方法来选择下一个要运行的任务
    73. //一般是硬件计算前导零指令,如果所使用的
    74. //MCU没有这些硬件指令的话此宏应该设置为0!
    75. #define configUSE_TICKLESS_IDLE 0 //1启用低功耗tickless模式
    76. #define configUSE_QUEUE_SETS 1 //为1时启用队列
    77. #define configCPU_CLOCK_HZ (SystemCoreClock) //CPU频率
    78. #define configTICK_RATE_HZ (1000) //时钟节拍频率,这里设置为1000,周期就是1ms
    79. #define configMAX_PRIORITIES (32) //可使用的最大优先级
    80. #define configMINIMAL_STACK_SIZE ((unsigned short)130) //空闲任务使用的堆栈大小
    81. #define configMAX_TASK_NAME_LEN (16) //任务名字字符串长度
    82. #define configUSE_16_BIT_TICKS 0 //系统节拍计数器变量数据类型,
    83. //1表示为16位无符号整形,0表示为32位无符号整形
    84. #define configIDLE_SHOULD_YIELD 1 //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务
    85. #define configUSE_TASK_NOTIFICATIONS 1 //为1时开启任务通知功能,默认开启
    86. #define configUSE_MUTEXES 1 //为1时使用互斥信号量
    87. #define configQUEUE_REGISTRY_SIZE 8 //不为0时表示启用队列记录,具体的值是可以
    88. //记录的队列和信号量最大数目。
    89. #define configCHECK_FOR_STACK_OVERFLOW 0 //大于0时启用堆栈溢出检测功能,如果使用此功能
    90. //用户必须提供一个栈溢出钩子函数,如果使用的话
    91. //此值可以为1或者2,因为有两种栈溢出检测方法。
    92. #define configUSE_RECURSIVE_MUTEXES 1 //为1时使用递归互斥信号量
    93. #define configUSE_MALLOC_FAILED_HOOK 0 //1使用内存申请失败钩子函数
    94. #define configUSE_APPLICATION_TASK_TAG 0
    95. #define configUSE_COUNTING_SEMAPHORES 1 //为1时使用计数信号量
    96. /***************************************************************************************************************/
    97. /* FreeRTOS与内存申请有关配置选项 */
    98. /***************************************************************************************************************/
    99. #define configSUPPORT_DYNAMIC_ALLOCATION 1 //支持动态内存申请
    100. #define configTOTAL_HEAP_SIZE ((size_t)(20*1024)) //系统所有总的堆大小
    101. /***************************************************************************************************************/
    102. /* FreeRTOS与钩子函数有关的配置选项 */
    103. /***************************************************************************************************************/
    104. #define configUSE_IDLE_HOOK 0 //1,使用空闲钩子;0,不使用
    105. #define configUSE_TICK_HOOK 0 //1,使用时间片钩子;0,不使用
    106. /***************************************************************************************************************/
    107. /* FreeRTOS与运行时间和任务状态收集有关的配置选项 */
    108. /***************************************************************************************************************/
    109. #define configGENERATE_RUN_TIME_STATS 0 //为1时启用运行时间统计功能
    110. #define configUSE_TRACE_FACILITY 1 //为1启用可视化跟踪调试
    111. #define configUSE_STATS_FORMATTING_FUNCTIONS 1 //与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
    112. //prvWriteNameToBuffer(),vTaskList(),
    113. //vTaskGetRunTimeStats()
    114. /***************************************************************************************************************/
    115. /* FreeRTOS与协程有关的配置选项 */
    116. /***************************************************************************************************************/
    117. #define configUSE_CO_ROUTINES 0 //为1时启用协程,启用协程以后必须添加文件croutine.c
    118. #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) //协程的有效优先级数目
    119. /***************************************************************************************************************/
    120. /* FreeRTOS与软件定时器有关的配置选项 */
    121. /***************************************************************************************************************/
    122. #define configUSE_TIMERS 1 //为1时启用软件定时器
    123. #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //软件定时器优先级
    124. #define configTIMER_QUEUE_LENGTH 5 //软件定时器队列长度
    125. #define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //软件定时器任务堆栈大小
    126. /***************************************************************************************************************/
    127. /* FreeRTOS可选函数配置选项 */
    128. /***************************************************************************************************************/
    129. #define INCLUDE_xTaskGetSchedulerState 1
    130. #define INCLUDE_vTaskPrioritySet 1
    131. #define INCLUDE_uxTaskPriorityGet 1
    132. #define INCLUDE_vTaskDelete 1
    133. #define INCLUDE_vTaskCleanUpResources 1
    134. #define INCLUDE_vTaskSuspend 1
    135. #define INCLUDE_vTaskDelayUntil 1
    136. #define INCLUDE_vTaskDelay 1
    137. #define INCLUDE_eTaskGetState 1
    138. #define INCLUDE_xTimerPendFunctionCall 1
    139. /***************************************************************************************************************/
    140. /* FreeRTOS与中断有关的配置选项 */
    141. /***************************************************************************************************************/
    142. #ifdef __NVIC_PRIO_BITS
    143. #define configPRIO_BITS __NVIC_PRIO_BITS
    144. #else
    145. #define configPRIO_BITS 4
    146. #endif
    147. #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级
    148. #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级
    149. #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    150. #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
    151. /***************************************************************************************************************/
    152. /* FreeRTOS与中断服务函数有关的配置选项 */
    153. /***************************************************************************************************************/
    154. #define xPortPendSVHandler PendSV_Handler
    155. #define vPortSVCHandler SVC_Handler
    156. #endif /* FREERTOS_CONFIG_H */

    delay.h

    1. #ifndef __DELAY_H
    2. #define __DELAY_H
    3. #include "sys.h"
    4. //
    5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
    6. //ALIENTEK STM32开发板
    7. //使用SysTick的普通计数模式对延迟进行管理(适合STM32F10x系列)
    8. //包括delay_us,delay_ms
    9. //正点原子@ALIENTEK
    10. //技术论坛:www.openedv.com
    11. //创建日期:2010/1/1
    12. //版本:V1.8
    13. //版权所有,盗版必究。
    14. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
    15. //All rights reserved
    16. //********************************************************************************
    17. //V1.2修改说明
    18. //修正了中断中调用出现死循环的错误
    19. //防止延时不准确,采用do while结构!
    20. //V1.3修改说明
    21. //增加了对UCOSII延时的支持.
    22. //如果使用ucosII,delay_init会自动设置SYSTICK的值,使之与ucos的TICKS_PER_SEC对应.
    23. //delay_ms和delay_us也进行了针对ucos的改造.
    24. //delay_us可以在ucos下使用,而且准确度很高,更重要的是没有占用额外的定时器.
    25. //delay_ms在ucos下,可以当成OSTimeDly来用,在未启动ucos时,它采用delay_us实现,从而准确延时
    26. //可以用来初始化外设,在启动了ucos之后delay_ms根据延时的长短,选择OSTimeDly实现或者delay_us实现.
    27. //V1.4修改说明 20110929
    28. //修改了使用ucos,但是ucos未启动的时候,delay_ms中中断无法响应的bug.
    29. //V1.5修改说明 20120902
    30. //在delay_us加入ucos上锁,防止由于ucos打断delay_us的执行,可能导致的延时不准。
    31. //V1.6修改说明 20150109
    32. //在delay_ms加入OSLockNesting判断。
    33. //V1.7修改说明 20150319
    34. //修改OS支持方式,以支持任意OS(不限于UCOSII和UCOSIII,理论上任意OS都可以支持)
    35. //添加:delay_osrunning/delay_ostickspersec/delay_osintnesting三个宏定义
    36. //添加:delay_osschedlock/delay_osschedunlock/delay_ostimedly三个函数
    37. //V1.8修改说明 20150519
    38. //修正UCOSIII支持时的2个bug:
    39. //delay_tickspersec改为:delay_ostickspersec
    40. //delay_intnesting改为:delay_osintnesting
    41. //
    42. void delay_init(void);
    43. void delay_ms(u32 nms);
    44. void delay_us(u32 nus);
    45. void delay_xms(u32 nms);
    46. #endif

    delay.c

    1. #include "FreeRTOSConfig.h" // ARM.FreeRTOS::RTOS:Config
    2. #include "delay.h"
    3. #include "sys.h"
    4. //
    5. //如果需要使用OS,则包括下面的头文件即可.
    6. #if SYSTEM_SUPPORT_OS
    7. #include "FreeRTOS.h" //FreeRTOS使用
    8. #include "task.h"
    9. #endif
    10. //
    11. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
    12. //ALIENTEK STM32开发板
    13. //使用SysTick的普通计数模式对延迟进行管理(支持OS)
    14. //包括delay_us,delay_ms
    15. //正点原子@ALIENTEK
    16. //技术论坛:www.openedv.com
    17. //创建日期:2016/11/28
    18. //版本:V1.8
    19. //版权所有,盗版必究。
    20. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
    21. //All rights reserved
    22. //********************************************************************************
    23. //修改说明
    24. //
    25. static u8 fac_us=0; //us延时倍乘数
    26. static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数
    27. extern void xPortSysTickHandler(void);
    28. systick中断服务函数,使用ucos时用到
    29. void SysTick_Handler(void)
    30. {
    31. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    32. {
    33. xPortSysTickHandler();
    34. }
    35. }
    36. //初始化延迟函数
    37. //SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8
    38. //这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率!
    39. //SYSCLK:系统时钟频率
    40. void delay_init()
    41. {
    42. u32 reload;
    43. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟 HCLK
    44. fac_us=SystemCoreClock/1000000; //不论是否使用OS,fac_us都需要使用
    45. reload=SystemCoreClock/1000000; //每秒钟的计数次数 单位为M
    46. reload*=1000000/configTICK_RATE_HZ; //根据configTICK_RATE_HZ设定溢出时间
    47. //reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右
    48. fac_ms=1000/configTICK_RATE_HZ; //代表OS可以延时的最少单位
    49. SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
    50. SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次
    51. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
    52. }
    53. //延时nus
    54. //nus:要延时的us数.
    55. //nus:0~204522252(最大值即2^32/fac_us@fac_us=168)
    56. void delay_us(u32 nus)
    57. {
    58. u32 ticks;
    59. u32 told,tnow,tcnt=0;
    60. u32 reload=SysTick->LOAD; //LOAD的值
    61. ticks=nus*fac_us; //需要的节拍数
    62. told=SysTick->VAL; //刚进入时的计数器值
    63. while(1)
    64. {
    65. tnow=SysTick->VAL;
    66. if(tnow!=told)
    67. {
    68. if(tnow//这里注意一下SYSTICK是一个递减的计数器就可以了.
    69. else tcnt+=reload-tnow+told;
    70. told=tnow;
    71. if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
    72. }
    73. };
    74. }
    75. //延时nms
    76. //nms:要延时的ms数
    77. //nms:0~65535
    78. void delay_ms(u32 nms)
    79. {
    80. // vTaskDelay(nms); //FreeRTOS延时
    81. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    82. {
    83. if(nms>=fac_ms) //延时的时间大于OS的最少时间周期
    84. {
    85. vTaskDelay(nms/fac_ms); //FreeRTOS延时
    86. }
    87. nms%=fac_ms; //OS已经无法提供这么小的延时了,采用普通方式延时
    88. }
    89. delay_us((u32)(nms*1000)); //普通方式延时
    90. }
    91. //延时nms,不会引起任务调度
    92. //nms:要延时的ms数
    93. void delay_xms(u32 nms)
    94. {
    95. u32 i;
    96. for(i=0;i1000);
    97. }

    usart.h

    1. #ifndef __USART_H
    2. #define __USART_H
    3. #include "stdio.h"
    4. #include "sys.h"
    5. //
    6. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
    7. //ALIENTEK STM32开发板
    8. //串口1初始化
    9. //正点原子@ALIENTEK
    10. //技术论坛:www.openedv.com
    11. //修改日期:2012/8/18
    12. //版本:V1.5
    13. //版权所有,盗版必究。
    14. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
    15. //All rights reserved
    16. //********************************************************************************
    17. //V1.3修改说明
    18. //支持适应不同频率下的串口波特率设置.
    19. //加入了对printf的支持
    20. //增加了串口接收命令功能.
    21. //修正了printf第一个字符丢失的bug
    22. //V1.4修改说明
    23. //1,修改串口初始化IO的bug
    24. //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
    25. //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
    26. //4,修改了EN_USART1_RX的使能方式
    27. //V1.5修改说明
    28. //1,增加了对UCOSII的支持
    29. #define USART_REC_LEN 200 //定义最大接收字节数 200
    30. #define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
    31. extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
    32. extern u16 USART_RX_STA; //接收状态标记
    33. //如果想串口中断接收,请不要注释以下宏定义
    34. void uart_init(u32 bound);
    35. #endif

    usart.c

    1. #include "sys.h"
    2. #include "usart.h"
    3. //
    4. //如果使用ucos,则包括下面的头文件即可.
    5. #if SYSTEM_SUPPORT_OS
    6. #include "FreeRTOS.h" //FreeRTOS使用
    7. #endif
    8. //
    9. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
    10. //ALIENTEK STM32开发板
    11. //串口1初始化
    12. //正点原子@ALIENTEK
    13. //技术论坛:www.openedv.com
    14. //修改日期:2012/8/18
    15. //版本:V1.5
    16. //版权所有,盗版必究。
    17. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
    18. //All rights reserved
    19. //********************************************************************************
    20. //V1.3修改说明
    21. //支持适应不同频率下的串口波特率设置.
    22. //加入了对printf的支持
    23. //增加了串口接收命令功能.
    24. //修正了printf第一个字符丢失的bug
    25. //V1.4修改说明
    26. //1,修改串口初始化IO的bug
    27. //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
    28. //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
    29. //4,修改了EN_USART1_RX的使能方式
    30. //V1.5修改说明
    31. //1,增加了对UCOSII的支持
    32. //
    33. //
    34. //加入以下代码,支持printf函数,而不需要选择use MicroLIB
    35. #if 1
    36. #pragma import(__use_no_semihosting)
    37. //标准库需要的支持函数
    38. struct __FILE
    39. {
    40. int handle;
    41. };
    42. FILE __stdout;
    43. //定义_sys_exit()以避免使用半主机模式
    44. void _sys_exit(int x)
    45. {
    46. x = x;
    47. }
    48. //重定义fputc函数
    49. int fputc(int ch, FILE *f)
    50. {
    51. while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    52. USART1->DR = (u8) ch;
    53. return ch;
    54. }
    55. #endif
    56. /*使用microLib的方法*/
    57. /*
    58. int fputc(int ch, FILE *f)
    59. {
    60. USART_SendData(USART1, (uint8_t) ch);
    61. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
    62. return ch;
    63. }
    64. int GetKey (void) {
    65. while (!(USART1->SR & USART_FLAG_RXNE));
    66. return ((int)(USART1->DR & 0x1FF));
    67. }
    68. */
    69. #if EN_USART1_RX //如果使能了接收
    70. //串口1中断服务程序
    71. //注意,读取USARTx->SR能避免莫名其妙的错误
    72. u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
    73. //接收状态
    74. //bit15, 接收完成标志
    75. //bit14, 接收到0x0d
    76. //bit13~0, 接收到的有效字节数目
    77. u16 USART_RX_STA=0; //接收状态标记
    78. void uart_init(u32 bound){
    79. //GPIO端口设置
    80. GPIO_InitTypeDef GPIO_InitStructure;
    81. USART_InitTypeDef USART_InitStructure;
    82. NVIC_InitTypeDef NVIC_InitStructure;
    83. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
    84. //USART1_TX GPIOA.9
    85. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    86. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    87. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    88. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
    89. //USART1_RX GPIOA.10初始化
    90. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    91. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    92. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
    93. //Usart1 NVIC 配置
    94. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    95. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    96. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
    97. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    98. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
    99. //USART 初始化设置
    100. USART_InitStructure.USART_BaudRate = bound;//串口波特率
    101. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    102. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    103. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    104. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    105. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
    106. USART_Init(USART1, &USART_InitStructure); //初始化串口1
    107. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
    108. USART_Cmd(USART1, ENABLE); //使能串口1
    109. }
    110. void USART1_IRQHandler(void) //串口1中断服务程序
    111. {
    112. u8 Res;
    113. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    114. {
    115. Res =USART_ReceiveData(USART1); //读取接收到的数据
    116. if((USART_RX_STA&0x8000)==0)//接收未完成
    117. {
    118. if(USART_RX_STA&0x4000)//接收到了0x0d
    119. {
    120. if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    121. else USART_RX_STA|=0x8000; //接收完成了
    122. }
    123. else //还没收到0X0D
    124. {
    125. if(Res==0x0d)USART_RX_STA|=0x4000;
    126. else
    127. {
    128. USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
    129. USART_RX_STA++;
    130. if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
    131. }
    132. }
    133. }
    134. }
    135. }
    136. #endif

    sys.c 


     4.出现问题和如何修改

    问题:

     原因

    因为STM32F103的内存没有我们配置的内存大需要修改配置函数

    方法一:

    换芯片,把芯片配置改成STM32F103RCT6等大容量芯片

     

     

    方法二:

    修改 FreeRTOSConfig,h文件的configTOTAL_HEAP_SIZE参数

    二 使用main建立线程

    main.c

    1. /*----------------------------------------*
    2. * *
    3. * 星之援网络科技工作室学习资料v1.0 *
    4. * 时间:2022.7.14 *
    5. * 程序介绍:点灯实验 *
    6. * 实现效果:板载LED灯闪烁 *
    7. * *
    8. *----------------------------------------*
    9. */
    10. /* FreeRTOS头文件 */
    11. #include "FreeRTOSConfig.h"
    12. #include "string.h"
    13. #include "FreeRTOS.h"
    14. #include "task.h"
    15. /* 设备文件*/
    16. #include "delay.h"
    17. #include "led.h"
    18. #include "usart.h"
    19. //任务优先级
    20. #define START_TASK_PRIO 1
    21. //任务堆栈大小
    22. #define START_STK_SIZE 512
    23. //任务句柄
    24. TaskHandle_t StartTask_Handler;
    25. //任务函数
    26. void start_task(void *pvParameters);
    27. //任务优先级
    28. #define TASK1_TASK_PRIO 2
    29. //任务堆栈大小
    30. #define TASK1_STK_SIZE 512
    31. //任务句柄
    32. TaskHandle_t Task1Task_Handler;
    33. //任务函数
    34. void task1_task(void *pvParameters);
    35. int main(void)
    36. {
    37. BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
    38. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    39. delay_init(); //延时函数初始化
    40. uart_init(115200); //初始化串口
    41. /* LED 端口初始化 */
    42. LED_GPIO_Config();
    43. //创建开始任务
    44. xReturn = xTaskCreate((TaskFunction_t )start_task, //任务函数
    45. (const char* )"start_task", //任务名称
    46. (uint16_t )START_STK_SIZE, //任务堆栈大小
    47. (void* )NULL, //传递给任务函数的参数
    48. (UBaseType_t )START_TASK_PRIO, //任务优先级
    49. (TaskHandle_t* )&StartTask_Handler); //任务句柄
    50. /* 启动任务调度 */
    51. if(pdPASS == xReturn)
    52. vTaskStartScheduler(); /* 启动任务,开启调度 */
    53. else
    54. return -1;
    55. while(1); /* 正常不会执行到这里 */
    56. }
    57. //开始任务任务函数
    58. void start_task(void *pvParameters)
    59. {
    60. BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
    61. taskENTER_CRITICAL(); //进入临界区
    62. //创建TASK1任务
    63. xReturn= xTaskCreate((TaskFunction_t )task1_task,
    64. (const char* )"Usart_task",
    65. (uint16_t )TASK1_STK_SIZE,
    66. (void* )NULL,
    67. (UBaseType_t )TASK1_TASK_PRIO,
    68. (TaskHandle_t* )&Task1Task_Handler);
    69. if(pdPASS == xReturn)
    70. printf("\r\nFree heap: %d bytes\n", xPortGetFreeHeapSize()); /*打印剩余堆栈大小*/
    71. vTaskDelete(StartTask_Handler); //删除开始任务
    72. taskEXIT_CRITICAL(); //退出临界区
    73. }
    74. /*********************************************************************************
    75. * @Function : 任务1
    76. * @Input : None
    77. * @Output : None
    78. * @Return : None
    79. * @Others : None
    80. * @Date : 2022-07-23
    81. **********************************************************************************/
    82. void task1_task(void *pvParameters)
    83. {
    84. u8 time;
    85. while(1)
    86. {
    87. time++;
    88. if(time%300==0){
    89. time=0;
    90. LED1_TOGGLE; // 亮
    91. }
    92. delay_ms(10);
    93. }
    94. }

    三 程序连接

    链接:程序连接 
    提取码:ogin 
     

  • 相关阅读:
    Win10只读文件夹怎么删除
    补码:将减法运算转化为另一种形式的加法运算
    22-07-29 西安 分布式事务、Seata
    运维的利器–监控–zabbix–第二步:建设–部署zabbix agent--windows server系统
    java计算机毕业设计高校在线办公系统源程序+mysql+系统+lw文档+远程调试
    正点原子嵌入式linux驱动开发——Linux PWM驱动
    ​力扣解法汇总1779. 找到最近的有相同 X 或 Y 坐标的点
    如何创建专栏
    【JavaEE初阶】 JUC(java.util.concurrent) 的常见类
    嵌入式系统开发笔记106:发光二极管间隔闪烁
  • 原文地址:https://blog.csdn.net/herui_2/article/details/127090309