首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

EDK中C语言编写的问题,欢迎指导新手!!1

EDK中C语言编写的问题,欢迎指导新手!!1

#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xbasic_types.h"
#include "xstatus.h"
#include "xgpio.h"
//===========================
#define LED_DELAY 2000000    //LED延时
#define LED_CHANNEL 1    //LED通道
#define LED_MAX_BLINK 0x3    //LED闪烁次数
//===========================
XStatus GpioOutputExample(Xuint16 DeviceId, Xuint32 GpioWidth)   //流水灯子函数
{
    volatile int Delay;    //延时参数
    Xuint32 LedBit,LedLoop;    //LED位置参数和LED循环参数
    XStatus Status;
    XGpio  GpioOutput;
    Status = XGpio_Initialize(&GpioOutput, DeviceId);    //初始化GPIO,DeviceId通过参数传递
    if (Status != XST_SUCCESS)    //如果初始化不成功
    {
        return XST_FAILURE;    //返回失败标志
    }
    XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0);    //设置GPIO方向,0为输出,1为输入
    XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);    //向GPIO写0,让灯全亮
    for (LedBit = 0x0; LedBit < GpioWidth; LedBit++)    //循环8次,GpioWidth通过参数传递,位置参数随之改变
    {
        for (LedLoop = 0; LedLoop < LED_MAX_BLINK; LedLoop++)    //每一个位置闪烁3次
        {
            XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 1 << LedBit);    //写1,让该位置的灯灭
            for (Delay = 0; Delay < LED_DELAY; Delay++);    //延时
            XGpio_DiscreteClear(&GpioOutput, LED_CHANNEL, 1 << LedBit);    //写1清0,写0不变,清0让该位置灯再亮起来
            for (Delay = 0; Delay < LED_DELAY; Delay++);    //延时
        }
    }
    return XST_SUCCESS;    //返回成功标志
}
int main (void)
{
    XStatus status;
    print("\r\nRunning GpioOutputExample() for LEDs_8Bit...\r\n");
    status = GpioOutputExample(XPAR_LEDS_8BIT_DEVICE_ID,8);    //参数传递DeviceId和GpioWidth
    if (status == 0)    //XST_SUCCESS=0
    {
        print("GpioOutputExample PASSED.\r\n");    //完成
    }
    else
    {
        print("GpioOutputExample FAILED.\r\n");    //失败
    }
    return 0;
}
请问一下这个程序,XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0x0);    //向GPIO写0,让灯全亮,为什么我更改了0x0,验证的结果怎么还是灯全亮呢?
Xuint32 LedBit,LedLoop;    //LED位置参数和LED循环参数    XStatus Status;    XGpio  GpioOutput;这里的声明是什么意思呢?有没有什么规范?
XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 1 << LedBit);    //写1,让该位置的灯灭,这里是如何实现让某一个位置亮的呢?因为写的数据是1<<LEDbit,不是很明白
&GpioOutput这个寄存器是怎么与LED的物理端口联系起来的,一直不明白这个?
我是新手啊,谢谢指导!!!
大虾们,怎么没人回啊,其他的基本上看英文资料都看懂了,就是那个1<<ledbit,这个是先赋值,还是先左移呢?这里的流水灯是怎么实现的啊?
持之以恒,方能懂电子!!
void XGpio_DiscreteClear  (  XGpio *  InstancePtr,  
  unsigned  Channel,  
  u32  Mask
)   

   Set output discrete(s) to logic 0 for the specified GPIO channel.


Parameters:
InstancePtr  is a pointer to an XGpio instance to be worked on.  
Channel  contains the channel of the GPIO (1 or 2) to operate on.  
Mask  is the set of bits that will be set to 0 in the discrete data register. All other bits in the data register are unaffected.

Returns:
None.
Note:
The hardware must be built for dual channels if this function is used with any channel other than 1. If it is not, this function will assert.  
关于这个函数我不太懂,什么叫discrete data register啊,也就是离散数据寄存器,这个函数有什么用啊?
持之以恒,方能懂电子!!
既然大家都不回,这个程序我懂了,在这里解说一下里面调用的子函数,希望不懂得看看,网上很少有,懂英文的可以在microblaze结构那里点击右键,查看API函数,赛灵思解说的很详细,
int XGpio_CfgInitialize (

XGpio         *InstancePtr    ,

                   XGpio_Config   *Config        ,

                   u32            EffectiveAddr

                    )   

//成功:返回值:XST_SUCCESS

实用调用函数给出的配置数据对XGpio进行初始化

InstancePtr:

是指向XGpio实例的指针。指针的内存空间必须有调用函数给分配好。通过XGpio API对其进行操作的函数可以通过这个指针来实现。

Config:

包含了指定GPIO设备的结构信息。通过Config文件的内容可以对InstancePtr进行初始化。通过在每次调用时给予不同的配置文件,这个函数可以初始化多个设备实例

EffectiveAddr:

是虚拟内存空间的设备基址。一旦这个函数被使用,调用函数要对从EffectiveAddr地址到设备物理基址的无变化地址映射负责。如果地址变化了,将会发生未知错误。如果不使用地址映射,直接将Config->BaseAddress(设备的物理地址) 传送给这个参数就可以了。


00000000000000000000000000000000000000000000000000000000000000000000000


u32 XGpio_DiscreteRead (

XGpio    * InstancePtr , //通过GPIO操作的寄存器

                      unsigned Channel      //GPIO核有两个通道,这里就是通道的选择0_1

                       )

无返回值

00000000000000000000000000000000000000000000000000000000000000000000000


void XGpio_DiscreteClear (

XGpio * InstancePtr , //通过GPIO操作的寄存器

                      unsigned Channel   , //GPIO核有两个通道,这里就是通道的选择0_1

                      u32      Mask        //32位 0x00000000

                       )


返回值:Current copy of the discretes register

对特定GPIO通道的离散寄存器清零

InstancePtr:

是XGpio进行操作的指针。
Channel:

包含了要进行操作的通道(1或者2)
Mask:

是一个位数据的集合,这个集合将被写入离散的数据寄存器。其他数据寄存器不会受影响。


void XGpio_DiscreteSet (

XGpio   * InstancePtr ,   //通过GPIO操作的寄存器

                    unsigned Channel     ,   //GPIO核有两个通道,这里就是通道的选择0_1

                    u32      Mask             //32位 0x00000000

                     )

无返回值

这两个函数只对Mask中对应位为1的位有影响,比如,XGpio_DiscreteSet(&lcd240128,1,Ox00000001)将LCl3240128_pin<O>置1,而不影响其他位;同理,XGpio_DiscteteClear(&1cd240128,1,0x00000001)将LCD240128_pin<0>置0,而不影响其他位。


0000000000000000000000000000000000000000000000000000000000000000000000000000


void XGpio_DiscreteWrite (

XGpio   * InstancePtr, //通过GPIO操作的寄存器

                       unsigned Channel,   //GPIO核有两个通道,这里就是通道的选择0_1

                       u32     Data        //写入的数据,可以自己定义,可以通过其他变量获取

                        )

无返回值

0000000000000000000000000000000000000000000000000000000000000000000000000000


u32 XGpio_GetDataDirection (

XGpio    * InstancePtr ,

                         unsigned Channel

                          )

这个函数不太清楚,不过有个实例可以看看

返回值:Bits set to 0 are output and bits set to 1 are input.



void XGpio_SetDataDirection (

XGpio * InstancePtr   ,

                          unsigned   Channel     ,   

                          u32       DirectionMask //0x0:output-------0xffffffff:input

                           )

无返回值

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


int XGpio_Initialize (

XGpio *InstancePtr , //所定义的变量XXX:XGpio XXX;

                 u16     DeviceId    //实际应写成:XPAR_XXX_DEVICE_ID

                  )

成功返回值:XST_SUCCESS 失败返回值:XST_DEVICE_NOT_FOUND 000000000000000000000000000000000000000000000000000000000000000000000

几个关于中断的函数总结

void XGpio_InterruptClear (

XGpio *InstancePtr ,

                       u32     Mask

                        )

无返回值

void XGpio_InterruptDisable (

XGpio * InstancePtr ,

                        u32     Mask

                         )

无返回值

void XGpio_InterruptEnable (

XGpio   * InstancePtr ,

                       u32      Mask

                        )   

无返回值

u32 XGpio_InterruptGetEnabled ( XGpio * InstancePtr )   

无返回值

u32 XGpio_InterruptGetStatus ( XGpio * InstancePtr )   


void XGpio_InterruptGlobalDisable ( XGpio * InstancePtr )   

无返回值

void XGpio_InterruptGlobalEnable ( XGpio * InstancePtr )   

无返回值


00000000000000000000000000000000000000000000000000000000000000000000000000000


XGpio_Config* XGpio_LookupConfig ( u16 DeviceId ) //实际应写成:XPAR_XXX_DEVICE_ID

查找设备ID的设备配置

0000000000000000000000000000000000000000000000000000000000000000000000000000000


int XGpio_SelfTest ( XGpio * InstancePtr   )

关于GPIO的几个源代码文件

xgpio.h

xgpio_extra.c

xgpio_g.c

xgpio_i.h

xgpio_intr.c

xgpio_l.h

xgpio_selftest.c

xgpio_sinit.c


0000000000000000000000000000000000000000000000000000000

#define XGPIO_DATA2_OFFSET //Data register for 2nd channel

   

#define XGPIO_DATA_OFFSET //Data register for 1st channel


#define XGPIO_GIE_OFFSET    //Glogal interrupt enable register


#define XGPIO_IER_OFFSET     //Interrupt enable register


#define XGPIO_IR_CH1_MASK //Mask for the 1st channel

   

#define XGPIO_IR_CH2_MASK //Mask for the 2nd channel

   

#define XGPIO_IR_MASK     //Mask of all bits

   

#define XGPIO_ISR_OFFSET //Interrupt status register


#define XGpio_mGetDataReg (BaseAddress, Channel ) //Get the data register of the specified GPIO channel.

BaseAddress contains the base address of the GPIO device.

Channel     contains the channel (1 or 2) to operate on.


#define XGpio_mReadReg (BaseAddress, RegOffset)   

//Read a value from a GPIO register. A 32 bit read is performed. If the GPIO component is implemented in a smaller width, only the least significant data is read from the register. The most significant data will be read as 0.BaseAddress is the base address of the GPIO device.

Register is the register offset from the base to read from.

Data    is the data from the register.




#define XGpio_mSetDataReg (BaseAddress, Channel, Data)

//Set the data register of the specified GPIO channel.


BaseAddress contains the base address of the GPIO device.

Channel     contains the channel (1 or 2) to operate on.

Data         is the value to be written to the data register.


#define XGpio_mWriteReg (BaseAddress, RegOffset, Data)   

                       

Write a value to a GPIO register. A 32 bit write is performed. If the GPIO component is implemented in a smaller width, only the least significant data is written.


BaseAddress is the base address of the GPIO device.

RegOffset    is the register offset from the base to write to.

Data        is the data written to the register.


#define XGPIO_TRI2_OFFSET    //I/O direction reg for 2nd channel

#define XGPIO_TRI_OFFSET    //I/O direction reg for 1st channel


五个GPIO的例子研究

NO1:

#include "xparameters.h"

#include "xgpio.h"

#include "xgpio_l.h"

#include "xutil.h"

int main (void)

{

   XGpio dip, push;

       int i, psb_check, dip_check;

       XGpio LEDs8_Bit;

printf("-- Start of the Program --\r\n");

XGpio_Initialize(&dip, XPAR_DIP_DEVICE_ID); // device ID号的定义规则

       XGpio_SetDataDirection(&dip, 1, 0xffffffff);          // 必须注明通道号,否则出错

       XGpio_Initialize(&push, XPAR_PUSH_DEVICE_ID);   

       XGpio_SetDataDirection(&push, 1, 0xffffffff);

       XGpio_Initialize(&LEDs8_Bit, XPAR_LEDS_8BIT_DEVICE_ID);

       XGpio_SetDataDirection(&LEDs8_Bit, 1, 0x0);


       while (1)

       {

       psb_check = XGpio_DiscreteRead(&push, 1);

       xil_printf("Push Buttons Status %x\r\n", psb_check);   //: /n会使超级终端斜着显示

       dip_check = XGpio_DiscreteRead(&dip, 1);

       xil_printf("DIP Switch Status %x\r\n", dip_check);     //: /r/n 会使正常往下显示

       XGpio_DiscreteWrite(&LEDs8_Bit, 1, dip_check);   

       for (i=0; i<999999; i++);

       }

}

NO2:

#define GPIO_INPUT_SWITCH1     0xffffffff       /* Input discrete comes from a switch */

#define GPIO_OUTPUT_LED_FAULT 0x00010000   /* LED. Illuminated if discrete set to 1 */

#define GPIO_OUTPUT_LED_POWER 0x00020000 /* LED. Illuminated if discrete set to 1 */

#include "xbasic_types.h"

#include "xstatus.h"

#include "xparameters.h"

#include "xgpio.h"   

#include "xgpio_l.h"

#include "xutil.h"

int main (void)

{

   Xuint32 Data;

   XStatus Status;

XGpio dip, push;

int i, psb_check, dip_check;

       XGpio LEDs8_Bit;

printf("-- Start of the Program --\r\n");

       XGpio_Initialize(&push, XPAR_PUSH_DEVICE_ID);

       XGpio_SetDataDirection(&push, 1, 0xffffffff);

       XGpio_Initialize(&LEDs8_Bit, XPAR_LEDS_8BIT_DEVICE_ID);

       XGpio_SetDataDirection(&LEDs8_Bit, 1, 0x0);


       Status = XGpio_Initialize(&dip, XPAR_DIP_DEVICE_ID);

    if (Status != XST_SUCCESS)    //    XStatus Status为嵌入式中状态的定义关键字

    {

        printf("000\n");

    }

    else

       {

        printf("111\n");

    }

XGpio_SetDataDirection(&dip,1,GPIO_INPUT_SWITCH1);

XGpio_DiscreteSet     (&dip,1,GPIO_OUTPUT_LED_POWER);

XGpio_DiscreteClear   (&dip,1,GPIO_OUTPUT_LED_FAULT);


while (1)

{

      Data = XGpio_DiscreteRead(&dip,1);   //检测按键是否被按下

      xil_printf("Data=%x\r\n",Data);

      if (Data & GPIO_INPUT_SWITCH1) { xil_printf("111\r\n"); } //有按下

        

      else { xil_printf("222\r\n");} // /r/n                         //没按下

       for (i=0; i<9999999; i++);

}
持之以恒,方能懂电子!!
很好啊,学习了
痛斥“马山县古零镇知情群众”
造谣生事!唯恐天下不乱!

“马山县古零镇知情群众” 在百度网站“百度贴吧”上发布“露广西大化都阳“和尚”的真面目,还灵阳寺的一片净土”一文,通过互联网借机对广西乾登山灵阳寺造谣生事,败坏了寺院法师的声誉,破坏了宗教民族的安定团结。为此,笔者再次强烈鄙视和谴责无中生有,心口开河、唯恐天下不乱的造谣生事“知情群众!!!笔者要求相关部门介入调查此事!还广西乾登山灵阳寺一个清白和公道!
(一)
谣生事:“他们巧立名目,开了四个银行户头,所捐得的善款,由他们指定分别存入各个户头,只有功德箱的善款、户头、存折交由财务人员掌管。他们管理三个对外户头、存折从不公布于众。有很多次功德箱开发的钱,不经当众点数,私藏起来……。”僧众出家人始终坚持独立自主自办的原则,为护持道场,弘法利生始终不受外界势力的支配,“知情群众”为了利益驱动,也不惜丑化对手,唯恐天下不乱,惯用「私藏」造句,歪曲事实,无中生有。
(二)
谣生事:“自2011417日起接管功德箱,将十方捐得的善款一分不留如数存入马山县佛教协会的银行对公账号(账号:20044901040002989,接受社会各界人士监督)。由县佛教协会统一管理。此种改革激怒了都阳众‘和尚’们的各层保护伞”。获悉马山县佛教协会均无依法成立,广西乾登山灵阳寺也未参与县佛教协会,岂能接受“统一管理”?使用非法的账号?所谓知情群众,无权干预“和尚”工作和正常活动。以此造谣生事,纯属于违法行为

(三)

谣生事:“所谓的‘4.21’真相描述:……”。“知情群众”不敢正视“4.21”持刀拦路砍车恶劣事件,谎称广西乾登山灵阳寺的两次报警是他们所为,把受害人的报案歪曲为他人“自首”,公然制造“现金被有关部门查封”的谣言,以至掩盖古零镇“黑社会”猖獗的事实真相!古零镇一股黑恶势力竟敢顶风施暴,目无法纪,直接威胁了寺院法师的人身安全、财产安全。

(四)

谣生事:“灵阳寺‘4.21’事件的关键人是灵阳寺的所谓‘圣旭法师’,……主持寺务大权后,撤换原来的会计,财务人员,换上其都阳人,行踪神秘,从不跟众居士开过见过面会。谈过话,视古零灵阳寺为其家之资产,成为子孙庙。……”寺院的主持、“和尚”都属合法的宗教教职人员,是受法律保护的。“知情群众”不好好在家种田,发家致富。竟然以居士的身份来管“和尚”,且不是多事之秋!向壁虚造!无视法律,无视宗教民族政策,故意挑起“寺院为个人所有”事端,真是唯恐天下不乱!
在此,告诫“知情群众”造谣是对人的侵犯、对新闻侵犯、对法律的践踏。尽快悬崖勒马,立地成佛最后,衷心希望“知情群众”和以往不慎谤法的佛友,及早悔悟,早日清净罪业,往生极乐世界!!

                                 广西乾登山灵阳寺常住居士

返回列表