打印
[牛人杂谈]

M051_Series_BSP学习(01)

[复制链接]
2962|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

这是最新版本。
我们先看文本是什么,最后一个好奇怪,看不懂耶。

沙发
598330983|  楼主 | 2016-2-5 10:29 | 只看该作者
先打开看看吧。如下图,原来和readme内容应该一样,可能是编码问题,这个时候用Notepad++打开看看




果然是繁体的说明文档。

使用特权

评论回复
板凳
598330983|  楼主 | 2016-2-5 10:37 | 只看该作者
Document      --    放置本開發包提供的驅動說明文件與版本修訂紀錄文件
Library       --    放置所有驅動的源代碼,包括CMSIS, 標準驅動與 M051 學習板的相關驅動
SampleCode          --    原廠提供的範例程序源碼,包括了標準驅動的使用範例與 M051 學習板的範例程序

使用特权

评论回复
地板
598330983|  楼主 | 2016-2-5 11:10 | 只看该作者
我们看到CHM文件是关于如何使用该BSP开发包的说明。
我们发现好多功能都是用的 字母缩写,如何找到该缩写的意义呢?
接下来我以PMD这个关键词为例子说明一下。

使用特权

评论回复
5
598330983|  楼主 | 2016-2-5 11:22 | 只看该作者
    /* Configure P1.2 as Output mode and P4.1 as Input mode */
    GPIO_SetMode(P1, BIT2, GPIO_PMD_OUTPUT);
    GPIO_SetMode(P4, BIT1, GPIO_PMD_INPUT);
比如这个设置模式的第三个参数。
我们在CHM里搜索关键词PMD。看看能否找到那三个单词。


使用特权

评论回复
6
598330983|  楼主 | 2016-2-5 11:27 | 只看该作者
/*---------------------------------------------------------------------------------------------------------*/
   35 /*  PMD Constant Definitions                                                                               */
   36 /*---------------------------------------------------------------------------------------------------------*/
37 #define GPIO_PMD_INPUT          0x0UL
38 #define GPIO_PMD_OUTPUT         0x1UL
39 #define GPIO_PMD_OPEN_DRAIN     0x2UL
40 #define GPIO_PMD_QUASI          0x3UL
在GPIO.h头文件里只有这几个含有PMD.
我们发现都是设置功能的。可能啊
P0 I/O Pin[0] Mode Control  Determine each I/O type of P0 pins
P0 I/O Pin[1] Mode Control  Determine each I/O type of P0 pins
。。。。
00 = P0[0] pin is in INPUT mode.
01 = P0[0] pin is in OUTPUT mode.
10 = P0[0] pin is in Open-Drain mode.
11 = P0[0] pin is in Quasi-bidirectional mode
因此我们知道,PMD就是Pin Mode Control  Determine
PIN 模式控制定义的意思。




使用特权

评论回复
7
598330983|  楼主 | 2016-2-5 19:47 | 只看该作者
我们从库函数找到相关的GPIO应用。

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]       Set GPIO operation mode
*
* @param[in]   port        GPIO port. It could be P0, P1, P2, P3 or P4.
* @param[in]   u32PinMask  The single or multiple pins of specified GPIO port. It could be BIT0 ~ BIT7.
* @param[in]   u32Mode     Operation mode. GPIO_PMD_INPUT, GPIO_PMD_OUTPUT, GPIO_PMD_OPEN_DRAIN, GPIO_PMD_QUASI
*
* [url=home.php?mod=space&uid=266161]@return[/url]      None
*
* [url=home.php?mod=space&uid=1543424]@Details[/url]     This function is used to set specified GPIO operation mode.
*/
void GPIO_SetMode(GPIO_T *port, uint32_t u32PinMask, uint32_t u32Mode)
{
    uint32_t i;

    for(i = 0; i < GPIO_PIN_MAX; i++)
    {
        if(u32PinMask & (1 << i))
        {
            port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1));
        }
    }
}


也就是GPIO模式设置函数。可设置的模式有:输入、输出。开漏,准双向。


使用特权

评论回复
8
598330983|  楼主 | 2016-2-5 19:48 | 只看该作者
开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。
开漏输出跟集电极开路十分相似,工作原理也是一样的。不同的是,开漏输出使用的场效应管,使用时要加上拉电阻而已。
参考:集电极开路输出(OC)、漏极开路输出(OD)、推挽输出

使用特权

评论回复
9
598330983|  楼主 | 2016-2-5 19:52 | 只看该作者
在51单片机上有两种IO,P0是特殊的。因为P1、2、3有固定的内部上拉电阻,所以有时称它们为准双向口。当用做输入时被拉高,低则要靠外部电路拉低。而P0则是真双向口,因为作为输入时它是悬浮的。
“准”就是“基本上的意思”,也就是“准双向口”不是真正的双向口。

使用特权

评论回复
10
598330983|  楼主 | 2016-2-5 19:58 | 只看该作者
/**************************************************************************//**
* [url=home.php?mod=space&uid=288409]@file[/url]     main.c
* [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
* $Revision: 3 $
* $Date: 14/01/28 11:44a $
* @brief    M051 Series GPIO Driver Sample Code
*
* @note
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
******************************************************************************/
#include <stdio.h>
#include "M051Series.h"


#define PLL_CLOCK           50000000


void SYS_Init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Enable Internal RC 22.1184MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

    /* Waiting for Internal RC clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);

    /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));

    /* Enable external XTAL 12MHz clock */
    CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);

    /* Waiting for external XTAL clock ready */
    CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);

    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART module clock source */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1));

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

    /* Set P3 multi-function pins for UART0 RXD and TXD */
    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(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init UART                                                                                               */
    /*---------------------------------------------------------------------------------------------------------*/
    /* Reset UART */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 Baudrate */
    UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                           */
/*---------------------------------------------------------------------------------------------------------*/
int main(void)
{
    int32_t i32Err;

    /* 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] %d Hz\n", SystemCoreClock);
    printf("+-------------------------------------------------+\n");
    printf("|    P1.2(Output) and P4.1(Input) Sample Code     |\n");
    printf("+-------------------------------------------------+\n\n");

    /* Configure P1.2 as Output mode and P4.1 as Input mode */
    GPIO_SetMode(P1, BIT2, GPIO_PMD_OUTPUT);
    GPIO_SetMode(P4, BIT1, GPIO_PMD_INPUT);

    i32Err = 0;
    printf("GPIO P1.2(output mode) connect to P4.1(input mode) ......");

    /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
    P12 = 0;
    if(P41 != 0)
    {
        i32Err = 1;
    }

    P12 = 1;
    if(P41 != 1)
    {
        i32Err = 1;
    }

    if(i32Err)
    {
        printf("  [FAIL].\n");
    }
    else
    {
        printf("  [OK].\n");
    }

    /* Configure P1.2 and P4.1 to default Quasi-bidirectional mode */
    GPIO_SetMode(P1, BIT2, GPIO_PMD_QUASI);
    GPIO_SetMode(P4, BIT1, GPIO_PMD_QUASI);

    while(1);
}

/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/
这个例程就应用到了,PMD的三种应用,输入,输出,和准双向模式。

使用特权

评论回复
11
huangcunxiake| | 2016-2-7 20:26 | 只看该作者
原来如此。以前只会照着用,不明白其中含义。

使用特权

评论回复
12
quray1985| | 2016-2-8 16:27 | 只看该作者
最后的这个是不是和谐文件啊

使用特权

评论回复
13
lovecat2015| | 2016-2-10 13:59 | 只看该作者
598330983 发表于 2016-2-5 19:58
这个例程就应用到了,PMD的三种应用,输入,输出,和准双向模式。

这个IO的功能竟然有多种,能够分时复用吗

使用特权

评论回复
14
天灵灵地灵灵| | 2016-2-10 17:01 | 只看该作者
太多了,不知道有没有命名的简表啊。

使用特权

评论回复
15
yiyigirl2014| | 2016-2-10 18:50 | 只看该作者
Library       --    放置所有驅動的源代碼,包括CMSIS, 標準驅動與 M051 學習板的相關驅動

使用特权

评论回复
16
zhuotuzi| | 2016-2-11 17:53 | 只看该作者
新唐NuMicro® M451M系列是基于ARM® Cortex®-M4内核的新一代32位的微控制器,宽工作电压(2.5V ~ 5.5V),工业级温度(-40℃ ~ 105℃),内置22.1184MHz晶振(在25℃,5V时精度1%),可配置Data Flash,强抗干扰性(ESD 8KV、EFT 4KV),封装类型有LQFP48、LQFP64和LQFP100。

使用特权

评论回复
17
598330983|  楼主 | 2016-2-13 10:43 | 只看该作者
PMD就是Pin Mode Control  Determine            PIN 模式控制定义的意思。

使用特权

评论回复
18
奥德赛| | 2016-2-16 21:04 | 只看该作者
bsp的概念是什么啊,外设吗

使用特权

评论回复
19
huangcunxiake| | 2016-2-17 08:19 | 只看该作者
奥德赛 发表于 2016-2-16 21:04
bsp的概念是什么啊,外设吗

板级支持包(BSP)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。在嵌入式系统软件的组成中,就有BSP。

使用特权

评论回复
20
huangcunxiake| | 2016-2-17 08:20 | 只看该作者
BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层OS。

使用特权

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

本版积分规则

246

主题

5384

帖子

22

粉丝