[STM32F4] 【Nucleo设计分享】简易示波器设计之UCOS-III移植

[复制链接]
2162|1
 楼主| fjjjnk1234 发表于 2015-2-12 14:49 | 显示全部楼层 |阅读模式
本帖最后由 fjjjnk1234 于 2015-2-12 15:54 编辑

最近移植了一下UCOS-III,准确来说,是从安富莱的例程中修改过来的,目前测试了单任务创建和多任务的调度。其它信号量,邮箱······暂时没测试。安富莱的例程中固件库用的是1.3版本的,1.3版本的固件库system_stm32f4xx.c文件中,没有针对STM32F411的时钟配置,所以,主要修改文件中针对STM32F40_41xxx的时钟配置,修改的地方如下:
252行:
  1. /************************* PLL Parameters *************************************/
  2. /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
  3. #define PLL_M      16                                       //modify by fjjjnk1234       default:25
  4. /* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
  5. #define PLL_Q      7

  6. #if defined (STM32F40_41xxx)
  7. #define PLL_N      400                                    //modify by fjjjnk1234        default:336
  8. /* SYSCLK = PLL_VCO / PLL_P */
  9. #define PLL_P      4                                        //modify by fjjjnk1234        default:2
  10. #endif /* STM32F40_41xxx */

290行开始:
  1. /** @addtogroup STM32F4xx_System_Private_Variables
  2.   * @{
  3.   */

  4. #if defined (STM32F40_41xxx)
  5.   uint32_t SystemCoreClock = 100000000;               //modify by fjjjnk1234 default:168000000
  6. #endif /* STM32F40_41xxx */

505行:
  1. #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
  2.     /* PCLK2 = HCLK / 2*/
  3.     RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;                      //modify by fjjjnk1234        default:...DIV2
  4.    
  5.     /* PCLK1 = HCLK / 4*/
  6.     RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;                     //modify by fjjjnk1234         default:...DIV4
  7. #endif /* STM32F40_41xxx || STM32F427_437x || STM32F429_439xx */

521行:
  1. /* Configure the main PLL */
  2.     RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |
  3.                    (RCC_PLLCFGR_PLLSRC_HSI) | (PLL_Q << 24);                //modify by fjjjnk1234         default:RCC_PLLCFGR_PLLSRC_HSE

单任务创建测试程序:
  1. #include  <includes.h>



  2. /*
  3. *********************************************************************************************************
  4. *                                       LOCAL GLOBAL VARIABLES
  5. *********************************************************************************************************
  6. */
  7.                                                                
  8. static  OS_TCB        LED_TCB;                     //定义任务控制块
  9. static        CPU_STK        LED_Stk[128];           //定义任务堆栈


  10. /*
  11. *********************************************************************************************************
  12. *                                         FUNCTION PROTOTYPES
  13. *********************************************************************************************************
  14. */
  15. static void Task_LED(void *p_arg);

  16. /*
  17. *********************************************************************************************************
  18. *        函 数 名: main
  19. *        功能说明: 标准c程序入口。
  20. *        形    参:无
  21. *        返 回 值: 无
  22. *********************************************************************************************************
  23. */
  24. int main(void)
  25. {
  26.     OS_ERR  err;

  27. //    BSP_IntDisAll();           /* Disable all interrupts.                              */
  28.         
  29.         bsp_Init();
  30.         CPU_Init();
  31.         BSP_Tick_Init();
  32.    
  33.     OSInit(&err);                                               /* Init uC/OS-III.                                      */


  34.         /*创建任务*/
  35.         OSTaskCreate((OS_TCB     *)&LED_TCB,                    // 任务控制块指针         
  36.                (CPU_CHAR   *)"LED",                                    // 任务名称
  37.                (OS_TASK_PTR )Task_LED,                           // 任务代码指针
  38.                (void       *)0,                                              // 传递给任务的参数parg
  39.                (OS_PRIO     )2,                                              // 任务优先级
  40.                (CPU_STK    *)&LED_Stk[0],                        // 任务堆栈基地址
  41.                (CPU_STK_SIZE)12,                                            // 堆栈剩余警戒线
  42.                (CPU_STK_SIZE)128,                                            // 堆栈大小
  43.                (OS_MSG_QTY  )0,                                              // 可接收的最大消息队列数
  44.                (OS_TICK     )0,                                              // 时间片轮转时间
  45.                (void       *)0,                                              // 任务控制块扩展信息
  46.                (OS_OPT      )(OS_OPT_TASK_STK_CHK |
  47.                               OS_OPT_TASK_STK_CLR),              // 任务选项
  48.                (OS_ERR     *)&err);                                    // 返回值

  49.     OSStart(&err);                                              /* Start multitasking (i.e. give control to uC/OS-III). */
  50.    
  51.     (void)&err;
  52.    
  53.     return (0);
  54. }

  55. void Task_LED(void *p_arg)
  56. {
  57.         OS_ERR err;
  58.   (void)p_arg;                                // 'p_arg' 并没有用到,防止编译器提示警告

  59.   while (1)
  60.   {
  61.       GPIO_SetBits(GPIOA, GPIO_Pin_5);
  62.       OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
  63.       GPIO_ResetBits(GPIOA, GPIO_Pin_5);
  64.       
  65.       GPIO_SetBits(GPIOA, GPIO_Pin_6);
  66.       OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
  67.       GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  68.       
  69.       GPIO_SetBits(GPIOA, GPIO_Pin_7);
  70.       OSTimeDlyHMSM(0, 0,0,500,OS_OPT_TIME_HMSM_STRICT,&err);
  71.       GPIO_ResetBits(GPIOA, GPIO_Pin_7);
  72.   }
  73. }
实验现象:
PA5、PA6、PA7引出的LED流水灯闪烁
完整程序:(单任务创建)
uCos-III Template.rar (1.34 MB, 下载次数: 20)

多任务:
  1. #include  <includes.h>

  2. /*******************设置任务优先级*******************/
  3. #define STARTUP_TASK_PRIO       3
  4. #define        TASK_LED1_PRIO                            4          
  5. #define        TASK_LED2_PRIO                            5
  6. #define        TASK_LED3_PRIO                            6

  7. /************设置栈大小(单位为 OS_STK )************/
  8. #define STARTUP_TASK_STK_SIZE   80
  9. #define        TASK_LED1_STK_SIZE                  80  
  10. #define        TASK_LED2_STK_SIZE                  80
  11. #define        TASK_LED3_STK_SIZE                  80

  12. /*
  13. *********************************************************************************************************
  14. *                                       LOCAL GLOBAL VARIABLES
  15. *********************************************************************************************************
  16. */
  17.                                                                
  18. static        OS_TCB        StartUp_TCB;                       
  19. static  CPU_STK        StartUp_Stk[STARTUP_TASK_STK_SIZE];

  20. static  OS_TCB        LED1_TCB;                                                  
  21. static        CPU_STK        LED1_Stk[TASK_LED1_STK_SIZE];          

  22. static  OS_TCB        LED2_TCB;                                                  
  23. static        CPU_STK        LED2_Stk[TASK_LED2_STK_SIZE];                  

  24. static  OS_TCB        LED3_TCB;                                                          
  25. static        CPU_STK        LED3_Stk[TASK_LED3_STK_SIZE];         


  26. /*
  27. *********************************************************************************************************
  28. *                                         FUNCTION PROTOTYPES
  29. *********************************************************************************************************
  30. */
  31. void Task_Start(void *p_arg);
  32. void Task_LED1(void *p_arg);
  33. void Task_LED2(void *p_arg);
  34. void Task_LED3(void *p_arg);

  35. /*
  36. *********************************************************************************************************
  37. *        函 数 名: main
  38. *        功能说明: 标准c程序入口。
  39. *        形    参:无
  40. *        返 回 值: 无
  41. *********************************************************************************************************
  42. */
  43. int main(void)
  44. {
  45.     OS_ERR  err;

  46. //    BSP_IntDisAll();           /* Disable all interrupts.                              */
  47.        
  48.         bsp_Init();
  49.         CPU_Init();
  50.         BSP_Tick_Init();
  51.    
  52.     OSInit(&err);                                               /* Init uC/OS-III.                                      */


  53.         /*创建任务*/
  54.         OSTaskCreate((OS_TCB     *)&StartUp_TCB,                // 任务控制块指针         
  55.                (CPU_CHAR   *)"StartUp",                                // 任务名称
  56.                (OS_TASK_PTR )Task_Start,                         // 任务代码指针
  57.                (void       *)0,                                              // 传递给任务的参数parg
  58.                (OS_PRIO     )STARTUP_TASK_PRIO,                              // 任务优先级
  59.                (CPU_STK    *)&StartUp_Stk[0],                    // 任务堆栈基地址
  60.                (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE/10,          // 堆栈剩余警戒线
  61.                (CPU_STK_SIZE)STARTUP_TASK_STK_SIZE,                          // 堆栈大小
  62.                (OS_MSG_QTY  )0,                                              // 可接收的最大消息队列数
  63.                (OS_TICK     )0,                                              // 时间片轮转时间
  64.                (void       *)0,                                              // 任务控制块扩展信息
  65.                (OS_OPT      )(OS_OPT_TASK_STK_CHK |
  66.                               OS_OPT_TASK_STK_CLR),              // 任务选项
  67.                (OS_ERR     *)&err);                                    // 返回值

  68.     OSStart(&err);                       /* Start multitasking (i.e. give control to uC/OS-III). */
  69.    
  70.     (void)&err;
  71.    
  72.     return (0);
  73. }


  74. /*
  75. * 函数名:Task_Start
  76. * 描述  : 启动任务,
  77. *                           优先级为3,
  78. *                     创建LED1、LED2和LED3的任务
  79. * 输入  :无
  80. * 输出  : 无
  81. */
  82. void Task_Start(void *p_arg)
  83. {
  84.         OS_ERR err;
  85.   (void)p_arg;       

  86.         //创建任务LED1       
  87.         OSTaskCreate((OS_TCB     *)&LED1_TCB,                                                    // 任务控制块指针         
  88.                (CPU_CHAR   *)"LED1",                                                            // 任务名称
  89.                (OS_TASK_PTR )Task_LED1,                                                    // 任务代码指针
  90.                (void       *)0,                                                                        // 传递给任务的参数parg
  91.                (OS_PRIO     )TASK_LED1_PRIO,                                        // 任务优先级
  92.                (CPU_STK    *)&LED1_Stk[0],                                          // 任务堆栈基地址
  93.                (CPU_STK_SIZE)TASK_LED1_STK_SIZE/10,                      // 堆栈剩余警戒线
  94.                (CPU_STK_SIZE)TASK_LED1_STK_SIZE,                              // 堆栈大小
  95.                (OS_MSG_QTY  )0,                                                                        // 可接收的最大消息队列数
  96.                (OS_TICK     )0,                                                                        // 时间片轮转时间
  97.                (void       *)0,                                                                        // 任务控制块扩展信息
  98.                (OS_OPT      )(OS_OPT_TASK_STK_CHK |
  99.                               OS_OPT_TASK_STK_CLR),                // 任务选项
  100.                (OS_ERR     *)&err);                                                              // 返回值

  101.         //创建任务LED2       
  102.         OSTaskCreate((OS_TCB     *)&LED2_TCB,                                             
  103.                (CPU_CHAR   *)"LED2",                                               
  104.                (OS_TASK_PTR )Task_LED2,                                       
  105.                (void       *)0,                                                       
  106.                (OS_PRIO     )TASK_LED2_PRIO,                               
  107.                (CPU_STK    *)&LED2_Stk[0],                               
  108.                (CPU_STK_SIZE)TASK_LED2_STK_SIZE/10,               
  109.                (CPU_STK_SIZE)TASK_LED2_STK_SIZE,                       
  110.                (OS_MSG_QTY  )0,                                                       
  111.                (OS_TICK     )0,                                                       
  112.                (void       *)0,                                                       
  113.                (OS_OPT      )(OS_OPT_TASK_STK_CHK |
  114.                               OS_OPT_TASK_STK_CLR),         
  115.                (OS_ERR     *)&err);                                       

  116.         //创建任务LED3       
  117.         OSTaskCreate((OS_TCB     *)&LED3_TCB,                                          
  118.                (CPU_CHAR   *)"LED3",                                               
  119.                (OS_TASK_PTR )Task_LED3,                               
  120.                (void       *)0,                                                       
  121.                (OS_PRIO     )TASK_LED3_PRIO,                               
  122.                (CPU_STK    *)&LED3_Stk[0],                               
  123.                (CPU_STK_SIZE)TASK_LED3_STK_SIZE/10,               
  124.                (CPU_STK_SIZE)TASK_LED3_STK_SIZE,                       
  125.                (OS_MSG_QTY  )0,                                               
  126.                (OS_TICK     )0,                                                       
  127.                (void       *)0,                                                       
  128.                (OS_OPT      )(OS_OPT_TASK_STK_CHK |
  129.                               OS_OPT_TASK_STK_CLR),         
  130.                (OS_ERR     *)&err);       
  131.                
  132.   //任务删除自己       
  133.         OSTaskDel(&StartUp_TCB,&err);                                                         
  134. }

  135. /*
  136. * 函数名:Task_LED1
  137. * 描述  : LED任务1,
  138. *                     优先级为4,
  139. *                     以100ms的间隔点亮、关闭LED1
  140. * 输入  :无
  141. * 输出  : 无
  142. */
  143. void Task_LED1(void *p_arg)
  144. {
  145.   OS_ERR err;
  146.   (void)p_arg;                       

  147.   while (1)
  148.   {
  149.     GPIO_SetBits(GPIOA, GPIO_Pin_5);
  150.     OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);        //延时阻塞100ms
  151.     GPIO_ResetBits(GPIOA, GPIO_Pin_5);     
  152.     OSTimeDlyHMSM(0, 0,0,100,OS_OPT_TIME_HMSM_STRICT,&err);
  153.   }
  154. }

  155. /*
  156. * 函数名:Task_LED2
  157. * 描述  :         LED任务2,
  158. *                            优先级为5,
  159. *                      以200ms的间隔点亮、关闭LED2
  160. * 输入  :无
  161. * 输出  : 无
  162. */
  163. void Task_LED2(void *p_arg)
  164. {
  165.   OS_ERR err;
  166.   (void)p_arg;                       

  167.   while (1)
  168.   {
  169.     GPIO_SetBits(GPIOA, GPIO_Pin_6);
  170.     OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);         //延时阻塞200ms
  171.     GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  172.     OSTimeDlyHMSM(0, 0,0,200,OS_OPT_TIME_HMSM_STRICT,&err);
  173.   }
  174. }

  175. /*
  176. * 函数名:Task_LED3
  177. * 描述  : LED任务3,
  178. *                           优先级为6,
  179. *                     以300ms的间隔点亮、关闭LED3
  180. * 输入  :无
  181. * 输出  : 无
  182. */
  183. void Task_LED3(void *p_arg)
  184. {
  185.   OS_ERR err;
  186.   (void)p_arg;      

  187.   while (1)
  188.   {
  189.     GPIO_SetBits(GPIOA, GPIO_Pin_7);
  190.     OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);         //延时阻塞300ms
  191.     GPIO_ResetBits(GPIOA, GPIO_Pin_7);
  192.     OSTimeDlyHMSM(0, 0,0,300,OS_OPT_TIME_HMSM_STRICT,&err);
  193.   }
  194. }

实验现象:

PA5接的LED1以100ms的间隔点亮、关闭LED1
PA6接的LED2以200ms的间隔点亮、关闭LED2
PA7接的LED3以300ms的间隔点亮、关闭LED3
完整程序:(多任务)
uCos-III Template(多任务).rar (1.34 MB, 下载次数: 23)
yinhaix 发表于 2015-5-8 15:56 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:相由心生,境随心转,一切法从心想生。

46

主题

524

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部