[DemoCode下载] M051跑小系统

[复制链接]
845|6
 楼主| gejigeji521 发表于 2017-6-10 17:31 | 显示全部楼层 |阅读模式
ck, TE, se, UART

  1. #include <stdio.h>
  2. #include "M051Series.h"
  3. //AIOS
  4. #include "AIOS.h"

  5. #define PLLCON_SETTING  CLK_PLLCON_50MHz_HXT
  6. #define PLL_CLOCK       50000000

  7. OSTimerHandle_t                        Timer500msHandle        = NULL;
  8. OSTaskHandle_t                         CtrlTaskHandle                = NULL;
  9. OSTaskHandle_t                         LedTaskHandle                = NULL;
  10. OSSemHandle_t                         LedSemHandle                = NULL;

  11. void CtrlTask( void *pvParameters );
  12. void LedTask( void *pvParameters );
  13. void Timer500ms( void *pvParameters );


  14. void SYS_Init(void)
  15. {
  16.         /*---------------------------------------------------------------------------------------------------------*/
  17.         /* Init System Clock                                                                                       */
  18.         /*---------------------------------------------------------------------------------------------------------*/

  19.         /* Enable Internal RC 22.1184MHz clock */
  20.         CLK->PWRCON |= CLK_PWRCON_OSC22M_EN_Msk;

  21.         /* Waiting for Internal RC clock ready */
  22.         while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_OSC22M_STB_Msk));

  23.         /* Switch HCLK clock source to Internal RC and and HCLK source divide 1 */
  24.         CLK->CLKSEL0 &= ~CLK_CLKSEL0_HCLK_S_Msk;
  25.         CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_HIRC;
  26.         CLK->CLKDIV &= ~CLK_CLKDIV_HCLK_N_Msk;
  27.         CLK->CLKDIV |= CLK_CLKDIV_HCLK(1);

  28.         /* Enable external XTAL 12MHz clock */
  29.         CLK->PWRCON |= CLK_PWRCON_XTL12M_EN_Msk;

  30.         /* Waiting for external XTAL clock ready */
  31.         while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_XTL12M_STB_Msk));

  32.         /* Set core clock as PLL_CLOCK from PLL */
  33.         CLK->PLLCON = PLLCON_SETTING;
  34.         while(!(CLK->CLKSTATUS & CLK_CLKSTATUS_PLL_STB_Msk));
  35.         CLK->CLKSEL0 &= (~CLK_CLKSEL0_HCLK_S_Msk);
  36.         CLK->CLKSEL0 |= CLK_CLKSEL0_HCLK_S_PLL;

  37.         /* Update System Core Clock */
  38.         /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
  39.         //SystemCoreClockUpdate();
  40.         PllClock        = PLL_CLOCK;            // PLL
  41.         SystemCoreClock = PLL_CLOCK / 1;        // HCLK
  42.         CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

  43.         /* Enable UART module clock */
  44.         CLK->APBCLK |= CLK_APBCLK_UART0_EN_Msk;

  45.         /* Select UART module clock source */
  46.         CLK->CLKSEL1 &= ~CLK_CLKSEL1_UART_S_Msk;
  47.         CLK->CLKSEL1 |= CLK_CLKSEL1_UART_S_HXT;

  48.         /*---------------------------------------------------------------------------------------------------------*/
  49.         /* Init I/O Multi-function                                                                                 */
  50.         /*---------------------------------------------------------------------------------------------------------*/

  51.         /* Set P3 multi-function pins for UART0 RXD , TXD and CKO */
  52.         SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  53.         SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);
  54. }

  55. void UART0_Init()
  56. {
  57.         /*---------------------------------------------------------------------------------------------------------*/
  58.         /* Init UART                                                                                               */
  59.         /*---------------------------------------------------------------------------------------------------------*/
  60.         /* Reset UART0 */
  61.         SYS->IPRSTC2 |=  SYS_IPRSTC2_UART0_RST_Msk;
  62.         SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;

  63.         /* Configure UART0 and set UART0 Baudrate */
  64.         UART0->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HXT, 115200);
  65.         UART0->LCR = UART_WORD_LEN_8 | UART_PARITY_NONE | UART_STOP_BIT_1;
  66. }

  67. static void SetupHardware(void)
  68. {
  69.         /* Unlock protected registers */
  70.         SYS_UnlockReg();

  71.         /* Init System, peripheral clock and multi-function I/O */
  72.         SYS_Init();

  73.         /* Lock protected registers */
  74.         SYS_LockReg();

  75.         /* Init UART0 for printf */
  76.         UART0_Init();

  77.         printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %dHz\n", SystemCoreClock);

  78.         /*
  79.                 This sample code will blinking LED on NuTiny EVB board of M058SSAN.
  80.                 The I/O for LED is P2.3 or P3.6
  81.         */

  82.         printf("+---------------------------------------+\n");
  83.         printf("|    NuTiny EVB LED Sample Code         |\n");
  84.         printf("+---------------------------------------+\n");

  85.         /* Init P2.3 and P3.6 to be output mode */
  86.         P2->PMD = (P2->PMD & ~(0x3 << 2*3)) | (1 << 2*3);
  87.         P3->PMD = (P3->PMD & ~(0x3 << 2*6)) | (1 << 2*6);  
  88. }

  89. /*---------------------------------------------------------------------------------------------------------*/
  90. /*  Main Function                                                                                          */
  91. /*---------------------------------------------------------------------------------------------------------*/
  92. int32_t main(void)
  93. {
  94.         SetupHardware();

  95.         //创建500ms的定时器,分配定时器服务函数为Timer500ms
  96.         Timer500msHandle = OSTimerCreate(OSM2T(500), OS_TRUE, Timer500ms, NULL, "T500ms");
  97.         //创建信号量
  98.         LedSemHandle        = OSSemCreate(0);
  99.         //创建任务,控制LED灯
  100.         CtrlTaskHandle        = OSTaskCreate(CtrlTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Ctrl" );
  101.         LedTaskHandle        = OSTaskCreate(LedTask, NULL, OSMINIMAL_STACK_SIZE, OSLOWEAST_PRIORITY+1, "Led" );

  102.         OSTimerStart(Timer500msHandle);

  103.         // Start the scheduler.
  104.         OSStart();
  105.                
  106.         //if everything is ok, can't reach here
  107.         for( ;; );  
  108. }

  109. void CtrlTask( void *pvParameters )
  110. {
  111.         for( ;; )
  112.         {
  113.                 OSSemPost(LedSemHandle);       

  114.                 OSTaskSleep( OSM2T(500) );        
  115.         }
  116. }

  117. void LedTask( void *pvParameters )
  118. {
  119.         for( ;; )
  120.         {
  121.                 OSSemPend(LedSemHandle, OSPEND_FOREVER_VALUE);       
  122.                 /* Toggle P2.3 */
  123.                 P23 ^= 1;

  124.                 /* Toggle P3.6 */
  125.                 P36 ^= 1;               
  126.         }
  127. }

  128. void Timer500ms( void *pvParameters )
  129. {
  130.         // 500ms软件定时器.
  131. }


 楼主| gejigeji521 发表于 2017-6-10 18:13 | 显示全部楼层
认真读了一遍这个代码,其实用RTOS不难的。
zhuomuniao110 发表于 2017-6-10 21:46 | 显示全部楼层
原来是这么玩的。
643757107 发表于 2017-6-10 23:07 | 显示全部楼层
看起来非常容易学习
捉虫天师 发表于 2017-6-11 19:53 | 显示全部楼层
小系统很好用,很好学,我刚开始学习。
wahahaheihei 发表于 2017-6-11 22:48 | 显示全部楼层
系统有着自己 方便。
zhuomuniao110 发表于 2017-6-12 15:44 | 显示全部楼层
等于一个程序,控制着若干子函数的创建开启关闭
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2465

帖子

8

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