[牛人杂谈] M051_Series_BSP学习(01)

[复制链接]
3499|27
 楼主| 598330983 发表于 2016-2-5 10:25 | 显示全部楼层 |阅读模式
001.png
这是最新版本。
我们先看文本是什么,最后一个好奇怪,看不懂耶。

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

002.png

003.png
果然是繁体的说明文档。
 楼主| 598330983 发表于 2016-2-5 10:37 | 显示全部楼层
Document      --    放置本開發包提供的驅動說明文件與版本修訂紀錄文件
Library       --    放置所有驅動的源代碼,包括CMSIS, 標準驅動與 M051 學習板的相關驅動
SampleCode          --    原廠提供的範例程序源碼,包括了標準驅動的使用範例與 M051 學習板的範例程序
 楼主| 598330983 发表于 2016-2-5 11:10 | 显示全部楼层
我们看到CHM文件是关于如何使用该BSP开发包的说明。
我们发现好多功能都是用的 字母缩写,如何找到该缩写的意义呢?
接下来我以PMD这个关键词为例子说明一下。
 楼主| 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。看看能否找到那三个单词。
004.png

 楼主| 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 模式控制定义的意思。




 楼主| 598330983 发表于 2016-2-5 19:47 | 显示全部楼层
我们从库函数找到相关的GPIO应用。

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

  15.     for(i = 0; i < GPIO_PIN_MAX; i++)
  16.     {
  17.         if(u32PinMask & (1 << i))
  18.         {
  19.             port->PMD = (port->PMD & ~(0x3 << (i << 1))) | (u32Mode << (i << 1));
  20.         }
  21.     }
  22. }


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


 楼主| 598330983 发表于 2016-2-5 19:48 | 显示全部楼层
开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。
开漏输出跟集电极开路十分相似,工作原理也是一样的。不同的是,开漏输出使用的场效应管,使用时要加上拉电阻而已。
参考:集电极开路输出(OC)、漏极开路输出(OD)、推挽输出
 楼主| 598330983 发表于 2016-2-5 19:52 | 显示全部楼层
在51单片机上有两种IO,P0是特殊的。因为P1、2、3有固定的内部上拉电阻,所以有时称它们为准双向口。当用做输入时被拉高,低则要靠外部电路拉低。而P0则是真双向口,因为作为输入时它是悬浮的。
“准”就是“基本上的意思”,也就是“准双向口”不是真正的双向口。
 楼主| 598330983 发表于 2016-2-5 19:58 | 显示全部楼层
  1. /**************************************************************************//**
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V3.00
  4. * $Revision: 3 $
  5. * $Date: 14/01/28 11:44a $
  6. * @brief    M051 Series GPIO Driver Sample Code
  7. *
  8. * @note
  9. * Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
  10. ******************************************************************************/
  11. #include <stdio.h>
  12. #include "M051Series.h"


  13. #define PLL_CLOCK           50000000


  14. void SYS_Init(void)
  15. {
  16.     /*---------------------------------------------------------------------------------------------------------*/
  17.     /* Init System Clock                                                                                       */
  18.     /*---------------------------------------------------------------------------------------------------------*/
  19.     /* Enable Internal RC 22.1184MHz clock */
  20.     CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

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

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

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

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

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

  31.     /* Enable UART module clock */
  32.     CLK_EnableModuleClock(UART0_MODULE);

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

  35.     /*---------------------------------------------------------------------------------------------------------*/
  36.     /* Init I/O Multi-function                                                                                 */
  37.     /*---------------------------------------------------------------------------------------------------------*/

  38.     /* Set P3 multi-function pins for UART0 RXD and TXD */
  39.     SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk);
  40.     SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0);

  41. }

  42. void UART0_Init(void)
  43. {
  44.     /*---------------------------------------------------------------------------------------------------------*/
  45.     /* Init UART                                                                                               */
  46.     /*---------------------------------------------------------------------------------------------------------*/
  47.     /* Reset UART */
  48.     SYS_ResetModule(UART0_RST);

  49.     /* Configure UART0 and set UART0 Baudrate */
  50.     UART_Open(UART0, 115200);
  51. }

  52. /*---------------------------------------------------------------------------------------------------------*/
  53. /* MAIN function                                                                                           */
  54. /*---------------------------------------------------------------------------------------------------------*/
  55. int main(void)
  56. {
  57.     int32_t i32Err;

  58.     /* Unlock protected registers */
  59.     SYS_UnlockReg();

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

  62.     /* Lock protected registers */
  63.     SYS_LockReg();

  64.     /* Init UART0 for printf */
  65.     UART0_Init();

  66.     printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
  67.     printf("+-------------------------------------------------+\n");
  68.     printf("|    P1.2(Output) and P4.1(Input) Sample Code     |\n");
  69.     printf("+-------------------------------------------------+\n\n");

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

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

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

  81.     P12 = 1;
  82.     if(P41 != 1)
  83.     {
  84.         i32Err = 1;
  85.     }

  86.     if(i32Err)
  87.     {
  88.         printf("  [FAIL].\n");
  89.     }
  90.     else
  91.     {
  92.         printf("  [OK].\n");
  93.     }

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

  97.     while(1);
  98. }

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

huangcunxiake 发表于 2016-2-7 20:26 | 显示全部楼层
原来如此。以前只会照着用,不明白其中含义。
quray1985 发表于 2016-2-8 16:27 | 显示全部楼层
最后的这个是不是和谐文件啊
lovecat2015 发表于 2016-2-10 13:59 | 显示全部楼层
598330983 发表于 2016-2-5 19:58
这个例程就应用到了,PMD的三种应用,输入,输出,和准双向模式。

这个IO的功能竟然有多种,能够分时复用吗
天灵灵地灵灵 发表于 2016-2-10 17:01 | 显示全部楼层
太多了,不知道有没有命名的简表啊。
yiyigirl2014 发表于 2016-2-10 18:50 | 显示全部楼层
Library       --    放置所有驅動的源代碼,包括CMSIS, 標準驅動與 M051 學習板的相關驅動
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。
 楼主| 598330983 发表于 2016-2-13 10:43 | 显示全部楼层
PMD就是Pin Mode Control  Determine            PIN 模式控制定义的意思。
奥德赛 发表于 2016-2-16 21:04 | 显示全部楼层
bsp的概念是什么啊,外设吗
huangcunxiake 发表于 2016-2-17 08:19 | 显示全部楼层
奥德赛 发表于 2016-2-16 21:04
bsp的概念是什么啊,外设吗

板级支持包(BSP)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。在嵌入式系统软件的组成中,就有BSP。
huangcunxiake 发表于 2016-2-17 08:20 | 显示全部楼层
BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层OS。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

267

主题

5575

帖子

22

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