注册 登录
查看: 231|回复: 2

求助:DMA,初始化,注释错误?

[复制链接]
发表于 2017-8-3 10:38:28 | 显示全部楼层 |阅读模式
   static void dma_gpio_input_init(void *SADDR,uint8 BYTEs)
{
uint8 n, tmp;
    uint8 ptxn;

    //SADDR 实际上就是 GPIO的 输入寄存器 PDIR 的地址     //?????
    //GPIOA、GPIOB、GPIOC、GPIOD、GPIOE 的地址 分别是 0x400FF000u 、0x400FF040u 、0x400FF080u、 0x400FF0C0u、0x400FF100u
    //sizeof(GPIO_MemMap) = 0x18
    //每个GPIO地址 &0x1C0 后,得到 0x000 , 0x040 , 0x080 ,0x0C0 ,0x100
    //再 /0x40 后得到 0 、 1 、 2、 3、4 ,刚好就是 PTA、PTB、PTC 、PTD 、PTE
    //再 *32 就等于 PTA0、PTB0、PTC0 、PTD0 、PTE0
    uint8 ptx0 = ((((uint32)SADDR) & 0x1C0) / 0x40 ) * 32;

    //每个GPIO 对应的寄存器地址, &0x 3F 后得到的值都是相同的。
    //PTA_B0_IN 即 GPIOA 的 输入寄存器 PDIR 的 地址
    // (SADDR & 0x3f - PTA_B0_IN & 0x3f) 等效于 (SADDR - PTA_B0_IN) & 0x3f
    //假设需要采集的位 为 0~7、8~15、16~23、24~31 ,则 上面式子对应的值 为 0、1、2、3
    //刚好是  0~7、8~15、16~23、24~31 位的地址偏移,再 * 8 就变成 0、8、16、24
**********    略过部分程序
}

该部分是在MK60.dma.c中的函数,目的应该是为摄像头采集数据,初始化输入端口
问题如下:
1、SADDR 实际上就是 GPIO的 输入寄存器 PDIR 的地址     //移植到别的平台,若没有GPIO寄存器,是不是就是  PxIN寄存器的地址呢?
2、数据手册中 Base Address: 0x4000_4C00,是不是 基地址为0x4000 4c00 的意思呢?“_”只是连接作用?
3、能否直接利用数据手册中的地址,而不用这么复杂的计算呢?
4、    n = (uint8)(((uint32)SADDR - ((uint32)(&PTA_B0_IN))) & 0x3f) * 8;       //最小的引脚号

    ptxn = ptx0 + n;
    tmp = ptxn + (BYTEs * 8 ) - 1;                                          //最大的引脚号
略过的程序部分,有以上代码。若确定了DMA每次传输一个字节的数据, 且用的是PTA0~PTA7(比如说)是否就不用像上述代码这么确定,直接初始相关引脚就好了呢?
问题有点多,若能解答其中一二,也感激不尽。 我先在此谢过各位。


   

回复

使用道具 举报

发表于 2017-8-3 12:07:32 | 显示全部楼层
不同的单片机,配置的方法不同,如果你考虑别的单片机,就没必要看这部分的代码啦。

无非就是寄存器配置数据口为输入,然后配置点触发IO
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-3 14:18:21 | 显示全部楼层
易珠佩 发表于 2017-8-3 12:07
不同的单片机,配置的方法不同,如果你考虑别的单片机,就没必要看这部分的代码啦。

无非就是寄存器配置 ...

奈何本人水平不够,希望以此移植过去。其实我还有一点不懂的是,鹰眼摄像头的DMA传输是硬件触发还是软件触发?

回复 支持 反对

使用道具 举报

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

本版积分规则

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