打印
[DemoCode下载]

M051跑小系统

[复制链接]
648|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gejigeji521|  楼主 | 2017-6-10 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ck, TE, se, UART

#include <stdio.h>
#include "M051Series.h"
//AIOS
#include "AIOS.h"

#define PLLCON_SETTING  CLK_PLLCON_50MHz_HXT
#define PLL_CLOCK       50000000

OSTimerHandle_t                        Timer500msHandle        = NULL;
OSTaskHandle_t                         CtrlTaskHandle                = NULL;
OSTaskHandle_t                         LedTaskHandle                = NULL;
OSSemHandle_t                         LedSemHandle                = NULL;

void CtrlTask( void *pvParameters );
void LedTask( void *pvParameters );
void Timer500ms( void *pvParameters );


void SYS_Init(void)
{
        /*---------------------------------------------------------------------------------------------------------*/
        /* Init System Clock                                                                                       */
        /*---------------------------------------------------------------------------------------------------------*/

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

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

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

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

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

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

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

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

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

        /*---------------------------------------------------------------------------------------------------------*/
        /* Init I/O Multi-function                                                                                 */
        /*---------------------------------------------------------------------------------------------------------*/

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

void UART0_Init()
{
        /*---------------------------------------------------------------------------------------------------------*/
        /* Init UART                                                                                               */
        /*---------------------------------------------------------------------------------------------------------*/
        /* Reset UART0 */
        SYS->IPRSTC2 |=  SYS_IPRSTC2_UART0_RST_Msk;
        SYS->IPRSTC2 &= ~SYS_IPRSTC2_UART0_RST_Msk;

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

static void SetupHardware(void)
{
        /* Unlock protected registers */
        SYS_UnlockReg();

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

        /* Lock protected registers */
        SYS_LockReg();

        /* Init UART0 for printf */
        UART0_Init();

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

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

        printf("+---------------------------------------+\n");
        printf("|    NuTiny EVB LED Sample Code         |\n");
        printf("+---------------------------------------+\n");

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

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{
        SetupHardware();

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

        OSTimerStart(Timer500msHandle);

        // Start the scheduler.
        OSStart();
               
        //if everything is ok, can't reach here
        for( ;; );  
}

void CtrlTask( void *pvParameters )
{
        for( ;; )
        {
                OSSemPost(LedSemHandle);       

                OSTaskSleep( OSM2T(500) );        
        }
}

void LedTask( void *pvParameters )
{
        for( ;; )
        {
                OSSemPend(LedSemHandle, OSPEND_FOREVER_VALUE);       
                /* Toggle P2.3 */
                P23 ^= 1;

                /* Toggle P3.6 */
                P36 ^= 1;               
        }
}

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


沙发
gejigeji521|  楼主 | 2017-6-10 18:13 | 只看该作者
认真读了一遍这个代码,其实用RTOS不难的。

使用特权

评论回复
板凳
zhuomuniao110| | 2017-6-10 21:46 | 只看该作者
原来是这么玩的。

使用特权

评论回复
地板
643757107| | 2017-6-10 23:07 | 只看该作者
看起来非常容易学习

使用特权

评论回复
5
捉虫天师| | 2017-6-11 19:53 | 只看该作者
小系统很好用,很好学,我刚开始学习。

使用特权

评论回复
6
wahahaheihei| | 2017-6-11 22:48 | 只看该作者
系统有着自己 方便。

使用特权

评论回复
7
zhuomuniao110| | 2017-6-12 15:44 | 只看该作者
等于一个程序,控制着若干子函数的创建开启关闭

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

163

主题

2132

帖子

8

粉丝