智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3994|回复: 5
打印 上一主题 下一主题

[咨询] 用过火哥底层的老大们来帮忙看看。

[复制链接]

200

主题

2621

帖子

1

精华

杰出人士

蜗牛

Rank: 12Rank: 12Rank: 12

积分
12488

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章资源大师奖章

QQ
威望
5973
贡献
3101
兑换币
1999
注册时间
2011-10-21
在线时间
1707 小时
跳转到指定楼层
1#
发表于 2013-1-1 21:38:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我看完GPIO的驱动程序后发现火哥对GPIO配置了以下功能,但是我在.c文件中并没有找到对于不同配置输入进行不同处理的地方,但是通过实验的确输入不同配置参数比如上拉下拉单片机都做出了不同的反应。火哥到底在哪里对他们进行了处理呢?求解释!
//定义管脚方向
typedef enum GPIO_CFG
{
    //这里的值不能改!!!
    GPI         = 0,                          //定义管脚输入方向      GPIOx_PDDRn里,0表示输入,1表示输出
    GPO         = 1,                          //定义管脚输出方向
    GPI_DOWN    = 0x02,                       //输入下拉              PORTx_PCRn需要PE=1,PS=0
    GPI_UP      = 0x03,                       //输入上拉              PORTx_PCRn需要PE=1,PS=1
    GPI_PF      = 0x10,                       //输入,带无源滤波器,滤波范围:10 MHz ~ 30 MHz 。不支持高速接口(>=2MHz)  0b10000           Passive Filter Enable
    GPI_DOWN_PF = GPI_DOWN | GPI_PF ,         //输入下拉,带无源滤波器
    GPI_UP_PF   = GPI_UP   | GPI_PF ,         //输入上拉,带无源滤波器
    GPO_HDS     = 0x41,                        //输出高驱动能力   0b100 0001    High drive strength
    GPO_SSR     = 0x05,                        //输出慢变化率          0b101     Slow slew rate
    GPO_HDS_SSR = GPO_HDS | GPO_SSR,           //输出高驱动能力、慢变化率
} GPIO_CFG;  //最低位为0,肯定是输入;GPI_UP 和 GPI_UP_PF的最低位为1,其他为输出
以下是gpio.c中的内容:
/******************** (C) COPYRIGHT 2011 野火嵌入式开发工作室 ********************
* 文件名       :gpio.c
* 描述         :gpio驱动函数
*
* 实验平台     :野火kinetis开发板
* 库版本       :
* 嵌入系统     :
*
* 作者         :野火嵌入式开发工作室
* 淘宝店       :http://firestm32.taobao.com
* 技术支持论坛 :http://www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=1008
**********************************************************************************/
#include "common.h"
#include "gpio.h"

volatile struct GPIO_MemMap *GPIOx[5] = {PTA_BASE_PTR, PTB_BASE_PTR, PTC_BASE_PTR, PTD_BASE_PTR, PTE_BASE_PTR}; //定义五个指针数组保存 GPIOx 的地址
volatile struct PORT_MemMap *PORTX[5] = {PORTA_BASE_PTR, PORTB_BASE_PTR, PORTC_BASE_PTR, PORTD_BASE_PTR, PORTE_BASE_PTR};
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:gpio_init
*  功能说明:初始化gpio
*  参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
*            n           端口引脚
*            IO          引脚方向,0=输入,1=输出
*            data        输出初始状态,0=低电平,1=高电平 (对输入无效)
*  函数返回:无
*  修改时间:2012-1-15   已测试
*  备    注:
*************************************************************************/
void gpio_init (PORTx portx, u8 n, GPIO_CFG cfg, u8 data)
{
    ASSERT( (n < 32u)  && (data < 2u) );           //使用断言检查输入、电平 是否为1bit
    //选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx
    PORT_PCR_REG(PORTX[portx], n) = (0 | PORT_PCR_MUX(1) | cfg);
    //端口方向控制输入还是输出
    if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) ||     (cfg == GPI_UP_PF)      )
        //   最低位为0则输入   ||   输入上拉模式  ||   输入上拉,带无源滤波器
    {
        GPIO_PDDR_REG(GPIOx[portx]) &= ~(1 << n);  //设置端口方向为输入
    }
    else
    {
        GPIO_PDDR_REG(GPIOx[portx]) |= (1 << n);    //设置端口方向为输出
        if(data == 1)//output
        {
            GPIO_SET(portx, n, 1);                  //对端口输出控制,输出为1
        }
        else
        {
            GPIO_SET(portx, n, 0);                  //对端口输出控制,输出为0
        }
    }
}
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:gpio_set
*  功能说明:设置引脚状态
*  参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
*            n           端口引脚
*            data        输出初始状态,0=低电平,1=高电平
*  函数返回:无
*  修改时间:2012-1-16   已测试
*  备    注:
*************************************************************************/
void gpio_set (PORTx portx, u8 n, u8 data)
{
    ASSERT( (n < 32u)  && (data < 2u) );           //使用断言检查输入、电平 是否为1bit
    if(data == 1)               //输出
        GPIO_SET(portx, n, 1);  //GPIO_PDOR_REG(PORTx) |= (1<<n);
    else
        GPIO_SET(portx, n, 0);  //GPIO_PDOR_REG(PORTx) &= ~(1<<n);
}
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:gpio_turn
*  功能说明:反转引脚状态
*  参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
*            n           端口引脚
*  函数返回:无
*  修改时间:2012-1-15   已测试
*  备    注:
*************************************************************************/
void gpio_turn (PORTx portx, u8 n)
{
    ASSERT( n < 32u );           //使用断言检查引脚号
    GPIO_TURN(portx, n);
}
/*************************************************************************
*                             野火嵌入式开发工作室
*
*  函数名称:gpio_get
*  功能说明:读取引脚输入状态
*  参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)
*            n           端口引脚
*  函数返回:无
*  修改时间:2012-1-15   已测试
*  备    注:
*************************************************************************/
u8 gpio_get(PORTx portx, u8 n)          //读取引脚状态
{
    ASSERT( n < 32u );                  //使用断言检查引脚号
    return GPIO_Get(portx, n);
}

15

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
824
威望
448
贡献
216
兑换币
283
注册时间
2012-11-3
在线时间
80 小时
6#
发表于 2013-1-5 12:39:10 | 只看该作者
qinlu123 发表于 2013-1-5 11:17
你百度野火开源代码就有。

谢啦
回复 支持 反对

使用道具 举报

200

主题

2621

帖子

1

精华

杰出人士

蜗牛

Rank: 12Rank: 12Rank: 12

积分
12488

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章资源大师奖章

QQ
威望
5973
贡献
3101
兑换币
1999
注册时间
2011-10-21
在线时间
1707 小时
5#
 楼主| 发表于 2013-1-5 11:17:15 | 只看该作者
zhyk411912464 发表于 2013-1-5 10:58
能不能给俺传一份野火底层啊~~  谢谢~

你百度野火开源代码就有。
回复 支持 反对

使用道具 举报

15

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
824
威望
448
贡献
216
兑换币
283
注册时间
2012-11-3
在线时间
80 小时
4#
发表于 2013-1-5 10:58:25 | 只看该作者
能不能给俺传一份野火底层啊~~  谢谢~   411912464@qq.com
回复 支持 反对

使用道具 举报

200

主题

2621

帖子

1

精华

杰出人士

蜗牛

Rank: 12Rank: 12Rank: 12

积分
12488

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章资源大师奖章

QQ
威望
5973
贡献
3101
兑换币
1999
注册时间
2011-10-21
在线时间
1707 小时
3#
 楼主| 发表于 2013-1-2 10:24:29 | 只看该作者
agogos 发表于 2013-1-2 09:19
是这句么?
if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) ||     (cfg == GPI_UP_PF)      )
         ...

GPIO_PDDR_REG(GPIOx[portx]) &= ~(1 << n);  //设置端口方向为输入
没想到这一句话能包含那么多东西。
回复 支持 反对

使用道具 举报

26

主题

457

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5381

论坛元老奖章在线王奖章

威望
2166
贡献
1705
兑换币
576
注册时间
2011-9-19
在线时间
755 小时
2#
发表于 2013-1-2 09:19:29 | 只看该作者
是这句么?
if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) ||     (cfg == GPI_UP_PF)      )
         //   最低位为0则输入   ||   输入上拉模式  ||   输入上拉,带无源滤波器
     {
就在gpio_init()里面。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-29 01:19 , Processed in 0.043537 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表