5736|10

67

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

LPC1788初学者 [复制链接]

今天编写了一个简单的IO口中断程序,用了三个函数就可以了。
第一个GPIO_IntCmd(2, 1<<19 | 1<<10, 1);使能GPIO中断函数,参数一是第2组端口,参数二是第19个引脚我还用了一个10脚,^_^  ^_^好像有点贪心好,不过我觉得学习就是要贪心!然后参数三1为下降沿触发,0为上升沿触发,应为旺宝的这款开发板按键是接的低电平,所以是1。
第二个NVIC_SetPriority(GPIO_IRQn, 1);这个就是中断优先级设置。
第三个NVIC_EnableIRQ(GPIO_IRQn);这个就是使能GPIO中断。
好了现在就可以进中断了,爽吧!简直不敢相信!呵呵呵,有点小心奋!
进中断然后就是判断中断了GPIO_GetIntStatus(2, 19, 1)就是这个。
然后就是清中断了GPIO_ClearInt(2, 1<<19);就是这个。
在中断里我就控制LED灯亮灭。好了现在编译,不编不知道,一编吓一跳啊!- 0 Error(s), 11 Warning(s).尼玛11个警告,而且警告还是库里面的!靠,无法原谅!不好意思,我们都是文明人不能说脏话好,一下没管住自己的嘴,希望论坛的各位领导们谅解好,…^_^ ^_^。看了警告发现大部分都是同样的一个是枚举类型里混合了另一个类型,另一个是无意义的比较。
看了警告发现:
FunctionalState GPIO_GetIntStatus(uint8_t portNum, uint32_t pinNum, uint8_t edgeState)
{
        if((portNum == 0) && (edgeState == 0))//Rising Edge
                return (((LPC_GPIOINT->IO0IntStatR)>>pinNum)& 0x1);
        else if ((portNum == 2) && (edgeState == 0))
                return (((LPC_GPIOINT->IO2IntStatR)>>pinNum)& 0x1);
        else if ((portNum == 0) && (edgeState == 1))//Falling Edge
                return (((LPC_GPIOINT->IO0IntStatF)>>pinNum)& 0x1);
        else if ((portNum == 2) && (edgeState == 1))
                return (((LPC_GPIOINT->IO2IntStatF)>>pinNum)& 0x1);
        else
                //Error
                while(1);
}
函数的返回类型是__I  uint32_t的,而函数的类型是枚举类型FunctionalState。我把它强制转换了就OK了!
还有一类警告是无意义的比较!
void FIO_ByteSetDir(uint8_t portNum, uint8_t byteNum, uint8_t bitValue, uint8_t dir)
{
        GPIO_Byte_TypeDef *pFIO = FIO_ByteGetPointer(portNum);

        if(pFIO != NULL)
        {
                // Output direction
                if (dir)
                {
                        if ((byteNum >= 0) && (byteNum <= 3))
                        {
                                pFIO->FIODIR[byteNum] |= bitValue;
                        }
                }
                // Input direction
                else
                {
                        if ((byteNum >= 0) && (byteNum <= 3))
                        {
                                pFIO->FIODIR[byteNum] &= ~bitValue;
                        }
                }
        }
}
看了一下警告的地方if ((byteNum >= 0) && (byteNum <= 3))发现byteNum 变量是一个uint8_t的八位无符号整形变量去和0比较大于或等于,有点无语啊无符号整形变量最小的值就是0还比个毛啊!
不过有警告下到板子上也可以用的。我个人不太喜欢有警告,看着就不爽!
我不知道这样搞对不对希望“大婶”们指导下以后多多互相学习,天天互相向上!^_^  ^_^  ^_^!
此帖出自NXP MCU论坛

最新回复

mbed是arm公司推出的一个开发平台,可以快速的开发基于cotex-M控制器的程序。 http://developer.mbed.org/platforms/  详情 回复 发表于 2014-11-17 11:16
点赞 关注
 

回复
举报

1145

帖子

24

TA的资源

纯净的硅(高级)

沙发
 
你用寄存器来写代码,你会发现更爽,对照手册,直接操作寄存器,NXP的很方便的,
此帖出自NXP MCU论坛

点评

嗯!“大婶”说的有道理,我下了官方的例程一编译看到没有警告,结果你猜怎么着,他们把警告屏蔽了的!哎!让我大失所望!不过他们有些编程思路可以借鉴下!“大婶”也是搞NXP的高手吧!还希望以后跟你多多  详情 回复 发表于 2014-11-17 11:15
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
真得可以吗
此帖出自NXP MCU论坛

点评

我试了是可以的,不过就是不知道我这样搞对不对!  详情 回复 发表于 2014-11-17 11:18
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

4
 
MARK
此帖出自NXP MCU论坛
 
 
 

回复

1万

帖子

25

TA的资源

版主

5
 
用mbed也不错。
此帖出自NXP MCU论坛

点评

mbed?mbed是个啥啊!不管先膜拜“大婶”啊!请“大婶”指点!  详情 回复 发表于 2014-11-17 10:54
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

6
 

mbed?mbed是个啥啊!不管先膜拜“大婶”啊!请“大婶”指点
此帖出自NXP MCU论坛
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

7
 
fxyc87 发表于 2014-11-14 17:09
你用寄存器来写代码,你会发现更爽,对照手册,直接操作寄存器,NXP的很方便的,

嗯!“大婶”说的有道理,我下了官方的例程一编译看到没有警告,结果你猜怎么着,他们把警告屏蔽了的!哎!让我大失所望!不过他们有些编程思路可以借鉴下!“大婶”也是搞NXP的高手吧!还希望以后跟你多多学习啊,多多天天向上啊!
此帖出自NXP MCU论坛
 
 
 

回复

1万

帖子

25

TA的资源

版主

8
 
mbed是arm公司推出的一个开发平台,可以快速的开发基于cotex-M控制器的程序。


http://developer.mbed.org/platforms/
此帖出自NXP MCU论坛

点评

哦!!!我去看下先  详情 回复 发表于 2014-11-17 11:26
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

9
 

我试了是可以的,不过就是不知道我这样搞对不对!
此帖出自NXP MCU论坛
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

10
 
dcexpert 发表于 2014-11-17 11:16
mbed是arm公司推出的一个开发平台,可以快速的开发基于cotex-M控制器的程序。



哦!!!我去看下先
此帖出自NXP MCU论坛
 
 
 

回复

67

帖子

2

TA的资源

一粒金砂(中级)

11
 
各位兄弟姐妹们大哥大婶们,大家早上中午晚上好啊!由于我不知道各位看帖的时间是啥时候,所以都说了谁也不得罪。^_^  ^_^
前两天搞了下lpc1788的ADC转换用DMA方式传数据,在用串口打印。
感觉DMA是个好东西啊!自动的把数据搬来搬去!
正是因为电子技术的这种奇妙的魔幻力量,让我一见到新的技术就特别的好奇,就想知道究竟是肿么一回事儿!不由得感叹现在的聪明人的脑袋究竟是咋长的,简直让小弟佩服得五体投地!而且我前天还看到一个新闻,英国一个五岁的小孩被因特儿称为电脑专家!妈呀!!!!!真是要逆天了啊!!!,我估计他上辈子是爱因斯坦!好了废话不多说了!
下面就是DMA的程序了
uint32_t adc_value,tmp;
GPDMA_Channel_CFG_Type GPDMACfg;
debug_frmwrk_init();                                                                                //初始化串口       
_DBG(menu1);

PINSEL_ConfigPin(0, 23, 1);                                                                        //选择引脚功能
       
ADC_Init(LPC_ADC, 400000);
ADC_IntConfig(LPC_ADC, ADC_ADINTEN0, ENABLE);                //ADC中断配置
ADC_ChannelCmd(LPC_ADC, BRD_ADC_PREPARED_CHANNEL, ENABLE);//选择ADC通道
       
NVIC_DisableIRQ(DMA_IRQn);                //失能DMA中断
GPDMA_Init();                                        //初始化GPDMA其实就是把DMA的各个通道重置
GPDMACfg.ChannelNum = 0;                                                                //通道0
GPDMACfg.DstMemAddr = (uint32_t) &adc_value;                                //目的地地址
GPDMACfg.TransferSize = DMA_SIZE;                                                //传输大小
GPDMACfg.TransferType = GPDMA_TRANSFERTYPE_P2M;        //传输方式是外设到内存
GPDMACfg.SrcConn = GPDMA_CONN_ADC;                //连接到ADC,传输的大小和宽度和ADC是一样的

GPDMACfg.DMALLI = 0;                //没搞懂,说什么是,通道寄存器链表项。不知道干嘛用的,但是我把它改到5就不对了,一直没有理解想请教“大婶”们!
       
GPDMA_Setup(&GPDMACfg);                                                //把配置好的参数载入DMA寄存器
       
Channel0_TC = 0;                                                                                                //忙检查               
Channel0_Err = 0;                                                                                                //错误检查

NVIC_SetPriority(DMA_IRQn, ((0x01<<3)|0x01));                                        //中断优先级
NVIC_EnableIRQ(DMA_IRQn);                                                                        //使能DMA中断
       
       
while (1)
{
        GPDMA_ChannelCmd(0, ENABLE);                                                        //使能DMA通道0
        ADC_StartCmd(LPC_ADC, ADC_START_NOW);                                //启动ADC
        while ((Channel0_TC == 0));                                                                        //忙等待
        GPDMA_ChannelCmd(0, DISABLE);                                                        //失能DMA通道0

        /*打印到串口4*/
        _DBG("ADC value on channel "); _DBD(BRD_ADC_PREPARED_CHANNEL);
        _DBG(" is: "); _DBD32(ADC_DR_RESULT(adc_value)); _DBG_("\r\n");

        for(tmp = 0; tmp < 6000000; tmp++);
        for(tmp = 0; tmp < 6000000; tmp++);

        GPDMA_Setup(&GPDMACfg);
        Channel0_TC = 0;
        Channel0_Err = 0;
}
这个程序我没有用到外设到外设的功能,就把转换的结果用DMA的方式传到一个变量里,然后在用串口打印。感觉有点把DMA大材小用了^_^  ^_^ …不过我就是想知道LPC1788的DMA咋用的就OK了!学习嘛就是循序渐进,先搞懂在深入!这就是我的学习方式,希望那位“大婶”有好的学习方法多多分享!
小弟把程序也共享了,希望多多关照
我觉得这个电位器就是比较好,旺宝用的是一个精密电位器!真是有点准!很稳定!希望以后他们多做好的产品!

ADC_DMA.rar

3.71 MB, 下载次数: 13

此帖出自NXP MCU论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表