智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6762|回复: 10
打印 上一主题 下一主题

野火大哥,求解下ADC库函数的问题

[复制链接]

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
跳转到指定楼层
1#
发表于 2013-2-15 11:21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yangkuanqaz8598 于 2013-2-15 11:23 编辑

你的这个ADC_init是干嘛的呢,这些宏定义一直找不到在哪里。真正有操作寄存器的是AD转换的函数不是吗?求能给点注释,看懂下~~~   

void adc_init(ADCn adcn, ADC_Ch ch)
{
    ASSERT( ((adcn == ADC0) && (ch >= AD8 && ch <= AD18)) || ((adcn == ADC1) && (ch >= AD4a && ch <= AD17)) ) ; //使用断言检测ADCn_CHn是否正常

    switch(adcn)
    {
    case ADC0:       /*   ADC0  */
        SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK );        //开启ADC0时钟
        SIM_SOPT7 &= ~(SIM_SOPT7_ADC0ALTTRGEN_MASK  | SIM_SOPT7_ADC0PRETRGSEL_MASK);
        SIM_SOPT7 = SIM_SOPT7_ADC0TRGSEL(0);

        switch(ch)
        {
        case AD8:   //ADC0_SE8 -- PTB0
        case AD9:   //ADC0_SE9 -- PTB1
            SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
            PORT_PCR_REG(PORTB_BASE_PTR, ch - AD8 + 0) =  PORT_PCR_MUX(0);
            break;
        case AD10:  //ADC0_SE10 -- PTA7
        case AD11:  //ADC0_SE11 -- PTA8
            SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
            PORT_PCR_REG(PORTA_BASE_PTR, ch - AD10 + 7) =  PORT_PCR_MUX(0);
            break;
        case AD12:  //ADC0_SE12 -- PTB2
        case AD13:  //ADC0_SE13 -- PTB3
            SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
            PORT_PCR_REG(PORTB_BASE_PTR, ch - AD12 + 2) =  PORT_PCR_MUX(0);
            break;
        case AD14:  //ADC0_SE14 -- PTC0
        case AD15:  //ADC0_SE15 -- PTC1
            SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;
            PORT_PCR_REG(PORTC_BASE_PTR, ch - AD14 + 0) =  PORT_PCR_MUX(0);
            break;
        case AD17:   //ADC0_SE17 -- PTE24
        case AD18:   //ADC0_SE17 -- PTE25
            SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;
            PORT_PCR_REG(PORTE_BASE_PTR, ch - AD17 + 24) =  PORT_PCR_MUX(0);
            break;
        default:
            return;
        }
        return;

    case ADC1:       /*   ADC1    */
        SIM_SCGC3 |= (SIM_SCGC3_ADC1_MASK );
        SIM_SOPT7 &= ~(SIM_SOPT7_ADC1ALTTRGEN_MASK  | SIM_SOPT7_ADC1PRETRGSEL_MASK) ;
        SIM_SOPT7 = SIM_SOPT7_ADC1TRGSEL(0);

        switch(ch)
        {
        case AD4a:   //ADC1_SE4a -- PTE0
        case AD5a:   //ADC1_SE5a -- PTE1
        case AD6a:   //ADC1_SE6a -- PTE2
        case AD7a:   //ADC1_SE7a -- PTE3
            SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;
            PORT_PCR_REG(PORTE_BASE_PTR, ch - AD4a + 0) =  PORT_PCR_MUX(0);
            break;
        case AD8:  //ADC1_SE8 -- PTB0
        case AD9:  //ADC1_SE9 -- PTB1
            SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
            PORT_PCR_REG(PORTB_BASE_PTR, ch - AD8 + 0) =  PORT_PCR_MUX(0);
            break;
        case AD10:  //ADC1_SE10 -- PTB4
        case AD11:  //ADC1_SE11 -- PTB5
        case AD12:  //ADC1_SE12 -- PTB6
        case AD13:  //ADC1_SE13 -- PTB7
            SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
            PORT_PCR_REG(PORTB_BASE_PTR, ch - 6) =  PORT_PCR_MUX(0);
            break;
        case AD14:  //ADC1_SE14 -- PTB10
        case AD15:  //ADC1_SE15 -- PTB11
            SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK;
            PORT_PCR_REG(PORTB_BASE_PTR, ch - AD10 + 4) =  PORT_PCR_MUX(0);
            break;
        case AD17:  //ADC1_SE17 -- PTA17
            SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;
            PORT_PCR_REG(PORTA_BASE_PTR, ch) =  PORT_PCR_MUX(0);
            break;
        default:
            break;
        }
        break;
    default:
        break;
    }
}


32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
2#
发表于 2013-2-15 20:44:31 | 只看该作者
首先断言函数检测参数是否合法,然后根据参数使能相应时钟和配置相应IO口为模拟输入
回复 支持 反对

使用道具 举报

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
3#
 楼主| 发表于 2013-2-15 22:54:06 | 只看该作者
dapan945 发表于 2013-2-15 20:44
首先断言函数检测参数是否合法,然后根据参数使能相应时钟和配置相应IO口为模拟输入

嗯嗯,谢谢提醒,后面在MK60DZ10.H里面找到宏定义才看懂了!还能请问一下野火的DMA驱动里面的一些问题吗,一直在看数据手册的DMA部分,全是英文,看的真的不是很懂,好多纠结。

    源地址和目的地址的区别是啥啊,当数据来临时是目的地址进行相应的增加吗?如果我的目的地址和源地址设定为0X0003,通道每次传输字节数为4个字节,那DMA转换结束后,目的地址是会变成0X007吗?
    主循环和副循环是怎么区分的呢?如果的我的主循环次数为3,那就上面的例子,是不是指总共会造成12个字节的传输呢,最后的目的地址和源地址是什么啊?
    当前和起始主循环次数是什么意思啊,为什么主循环结束后要恢复源地址呢?
    DMA总共有16个通道,一个通道用来采集编码器的脉冲个数,另一个用来保存ADC对8个传感器的直接采样值(也就是说没有检波电路,>20KHz进行采样,我是电磁组的),这两个交替工作,能实现吗?


   DMA_NBYTES_MLNO(CHn) =   DMA_NBYTES_MLNO_NBYTES(BYTEs); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB */


    DMA_CITER_ELINKNO(CHn)  = DMA_CITER_ELINKNO_CITER(count); //当前主循环次数
    DMA_BITER_ELINKNO(CHn)  = DMA_BITER_ELINKYES_BITER(count);//起始主循环次数

/* 配置 DMA 传输结束后的操作 */
    DMA_SLAST(CHn)      =   0;                              //调整  源地址的附加值,主循环结束后恢复  源地址
    DMA_DLAST_SGA(CHn)  =   (u32)( (cfg & 0x20) == 0 ? (-count)  : 0 ); //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址


回复 支持 反对

使用道具 举报

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
4#
 楼主| 发表于 2013-2-15 22:55:42 | 只看该作者
dapan945 发表于 2013-2-15 20:44
首先断言函数检测参数是否合法,然后根据参数使能相应时钟和配置相应IO口为模拟输入

谢谢解答~~~
回复 支持 反对

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
5#
发表于 2013-2-15 22:58:15 | 只看该作者
野火真忙啊
回复 支持 反对

使用道具 举报

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
6#
 楼主| 发表于 2013-2-15 23:08:15 | 只看该作者
exiao 发表于 2013-2-15 22:58
野火真忙啊

都是我这种新手不懂惹的祸,哈哈
回复 支持 反对

使用道具 举报

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
7#
 楼主| 发表于 2013-2-15 23:10:31 | 只看该作者
exiao 发表于 2013-2-15 22:58
野火真忙啊

不是楼上大神能否帮忙解答下疑问呢,DMA部分只有英文的,真的看的甚是艰难
回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
8#
发表于 2013-2-18 09:21:49 | 只看该作者
yangkuanqaz8598 发表于 2013-2-15 22:54
嗯嗯,谢谢提醒,后面在MK60DZ10.H里面找到宏定义才看懂了!还能请问一下野火的DMA驱动里面的一些问题吗, ...

DMA其实就是一个不需要CPU介入的数据传输模块,很多东西也就是字面意思。比如源地址就是要传输数据来源的地址,目标地址就是要把数据传到哪里去。至于地址会不会加一是要看你配置的,如果你要传多个数据的话一般是先定义一个数组,然后把数组的首地址设为目标地址,再让它自加一。例如你要传输4路AD值,你就可以先定义一个数组设置为目标地址,把源地址设置为AD寄存器,源地址不变,目标自加一。这样一个副循环完成后AD各通道的值就存到数组里了,主循环起覆盖作用,也可以说是更新。
回复 支持 反对

使用道具 举报

10

主题

105

帖子

0

精华

高级会员

Rank: 4

积分
619
威望
289
贡献
138
兑换币
184
注册时间
2012-12-13
在线时间
96 小时
9#
 楼主| 发表于 2013-2-18 09:45:35 | 只看该作者
dapan945 发表于 2013-2-18 09:21
DMA其实就是一个不需要CPU介入的数据传输模块,很多东西也就是字面意思。比如源地址就是要传输数据来源的 ...

嗯,懂意思了~~谢了。只不过这个AD结果寄存器的地址是怎么计算的呢,数据手册上写什么 基地址 + 10h  offset 这样怎么计算AD的地址呢
回复 支持 反对

使用道具 举报

32

主题

978

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2834
QQ
威望
1620
贡献
482
兑换币
1009
注册时间
2012-11-29
在线时间
366 小时
10#
发表于 2013-2-18 09:47:26 | 只看该作者
宏定义里有
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-30 13:30 , Processed in 0.053111 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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