打印
[DemoCode下载]

M051库函数分析GPIO

[复制链接]
楼主: mintspring
手机看帖
扫描二维码
随时随地手机跟帖
21
mintspring|  楼主 | 2015-1-10 17:02 | 只看该作者 回帖奖励 |倒序浏览
bobde163 发表于 2015-1-10 16:58
位操作,这个是用到了位带映射的特性吗?

是的,用到了该特性,通过宏定义,将难以理解的硬件编码位置映射到一个可以理解的自然名称上。

使用特权

评论回复
22
mintspring|  楼主 | 2015-1-10 17:16 | 只看该作者
NuMicroM051DN DE 系列规格书.pdf (1.76 MB)

中文版的,内容介绍了外设和系统特性,值得看看。

使用特权

评论回复
23
598330983| | 2015-1-11 16:49 | 只看该作者
认真看完后发现果然很不错,原来头文件里面是些宏,坐等分析对应的c

使用特权

评论回复
24
gaoyang9992006| | 2015-1-11 22:38 | 只看该作者
那几个耐人寻味的名字在手册里应该有的

使用特权

评论回复
25
zxf0168| | 2015-1-12 08:26 | 只看该作者
mintspring 发表于 2015-1-10 17:01
大家有什么不懂的,或者我说错的,大家出来讨论,另外欢迎大家对最后一个组合的几个参量做解释 ...

看来你也是下了功夫了

使用特权

评论回复
26
zxf0168| | 2015-1-12 08:26 | 只看该作者
598330983 发表于 2015-1-11 16:49
认真看完后发现果然很不错,原来头文件里面是些宏,坐等分析对应的c

头文件里面东西很多,你不是不知道

使用特权

评论回复
27
gaoyang9992006| | 2015-1-12 12:51 | 只看该作者
zxf0168 发表于 2015-1-12 08:26
看来你也是下了功夫了

来,你给大家讲一下那几个问题

使用特权

评论回复
28
gaoyang9992006| | 2015-1-12 12:51 | 只看该作者
zxf0168 发表于 2015-1-12 08:26
头文件里面东西很多,你不是不知道

楼主说的那个什么东西,到底是什么意思,你帮我讲讲。

使用特权

评论回复
29
mintspring|  楼主 | 2015-1-12 13:14 | 只看该作者
zxf0168 发表于 2015-1-12 08:26
看来你也是下了功夫了

那是必须的,我认真研究过了,发现库函数写的老练,比自己写安全可靠。

使用特权

评论回复
30
mintspring|  楼主 | 2015-1-12 13:14 | 只看该作者
gaoyang9992006 发表于 2015-1-11 22:38
那几个耐人寻味的名字在手册里应该有的

有的,请详细看看手册里关于外设和资源的描述。

使用特权

评论回复
31
gaoyang9992006| | 2015-1-13 08:29 | 只看该作者
为了不至于出错,我觉得宏定义的内容最好都括号括起来,我看这个例子就是这么做的。

使用特权

评论回复
32
mintspring|  楼主 | 2015-1-13 11:07 | 只看该作者
gaoyang9992006 发表于 2015-1-13 08:29
为了不至于出错,我觉得宏定义的内容最好都括号括起来,我看这个例子就是这么做的。 ...

括号能避免跟外部运算组合优先级错误

使用特权

评论回复
33
gaoyang9992006| | 2015-1-13 21:40 | 只看该作者
/**
* @brief       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
*
* @return      None
*
* @details     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));
        }
    }
}

使用特权

评论回复
34
gaoyang9992006| | 2015-1-13 21:44 | 只看该作者
/**
* @brief       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

我们看这句:param[in]代表输入参数,也就是对参数进行解释说明,后面跟着的就是参数名字。port,u32PinMask,u32Mode
另外后面两个参数名字告诉我们该参数为32位的。
后面的注释内容告诉我们该参数都可以取哪些值。
第一个port,给出了IO端口可以是P0,P1,P2,P3,P4.

使用特权

评论回复
35
gaoyang9992006| | 2015-1-13 21:47 | 只看该作者
第二个参数,可以指定耽搁或多个指定的IO管脚,它可以取BIT0~BIT7.  
第三个参数,模式,操作模式,可以是输入,输出,开漏,准双向模式。

使用特权

评论回复
36
gaoyang9992006| | 2015-1-13 21:48 | 只看该作者
咱们来总结一下,IO口可以通过库函数设置哪些模式:

4种 I/O 模式:
 输入模式带高阻
 推挽输出
 开漏输出
 准双向

使用特权

评论回复
37
gaoyang9992006| | 2015-1-13 21:49 | 只看该作者
M05xxDN/DE最多有40个通用I/O引脚, 这些引脚和其它功能共享。 40个引脚分为5个端口,
分别命名为P0, P1, P2, P3 和 P4,每个端口最多有8个引脚。每个引脚都是独立的,都有相应的寄存器
来控制引脚工作模式与数据。
每个引脚的I/O类型可由软件独立地配置为输入,输出,开漏或准双向模式。 复位后, M05xxDN/DE默
认I/O引脚的模式由CONFIG0的CIOINI位决定(准双向或者输入模式),端口数据寄存器Px_DOUT[7:0]的
值为0x000_00FF。每个I/O引脚配有一个非常弱的独立的上拉电阻, VDD从5.0V 到 2.5V时,内部弱上
拉电阻阻值大约为110KΩ~300KΩ。
4种 I/O 模式:
 输入模式带高阻
 推挽输出
 开漏输出
 准双向
 准双向TTL/Schmitt 触发输入模式由Px_MFP[23:16]选择
 每个I/O 引脚都可以作为中断源,支持边沿/电平触发
 准双向模式下, I/O引脚内部上拉电阻被使能
 引脚中断功能使能后,引脚的唤醒功能也将被使能
 复位后,所有I/O引脚默认模式由CIOINI(CONFIG[10])决定
 CIOINI = 0, 复位后所有GPIO引脚为输入三态模式
 CIOINI = 1, 复位后所有GPIO引脚为准双向模式

使用特权

评论回复
38
gaoyang9992006| | 2015-1-13 22:03 | 只看该作者
/**
* @brief       Enable GPIO interrupt
*
* @param[in]   port            GPIO port. It could be P0, P1, P2, P3 or P4.
* @param[in]   u32Pin          The pin of specified GPIO port. It could be 0 ~ 7.
* @param[in]   u32IntAttribs   The interrupt attribute of specified GPIO pin. It could be \n
*                              GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW.
*
* @return      None
*
* @details     This function is used to enable specified GPIO pin interrupt.
*/
void GPIO_EnableInt(GPIO_T *port, uint32_t u32Pin, uint32_t u32IntAttribs)
{
    port->IMD |= (((u32IntAttribs >> 24) & 0xFFUL) << u32Pin);
    port->IEN |= ((u32IntAttribs & 0xFFFFFFUL) << u32Pin);
}

本函数原型提供GPIO的中断使能功能配置。

该函数也是有三个参数组成的,分别是port,u32Pin,u32IntAttribs.

使用特权

评论回复
39
gaoyang9992006| | 2015-1-13 22:17 | 只看该作者
详细讲解一下上面的函数,
第一个参数port给出了端口选项。P0,P1,P2,P3,P4.
第二个参数,给出对应端口的管脚编号,可以是0到7任何一个整数。
第三个参数,是中断属性,可以是 GPIO_INT_RISING, GPIO_INT_FALLING, GPIO_INT_BOTH_EDGE, GPIO_INT_HIGH, GPIO_INT_LOW.

使用特权

评论回复
40
gaoyang9992006| | 2015-1-13 22:20 | 只看该作者
中断类型共五种,对应上面的:
低电平触发,高电平触发,
下降沿触发,上升沿触发,上升和下降沿触发。

使用特权

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

本版积分规则