NXP S32K1 DMA模块Driver使用

本文详细介绍了NXP S32K1微控制器的DMA模块使用,包括虚拟通道概念、运行时状态管理、配置信息、初始化过程、回调函数和中断处理。此外,还展示了UART和SPI如何结合DMA进行数据传输,并提供了如何在S32SDK中方便地使用DMA驱动的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

本文通过分析NXP S32K1的官方S32SDK,剖析其DMA代码,以便后续更好的使用DMA。

虚拟通道

在MCU中,可能由1-多个DMA实例,每个实例又有若干不同数目的DMA通道,为此,在S32SDK的DRV中引入virtualChannel的概念,隔绝底层的差异,用户只需要关心一个(虚拟)通道完成什么样的事情。

/* Get DMA instance from virtual channel */
uint8_t dmaInstance = (uint8_t)FEATURE_DMA_VCH_TO_INSTANCE(virtualChannel);

/* Get DMA channel from virtual channel*/
uint8_t dmaChannel = (uint8_t)FEATURE_DMA_VCH_TO_CH(virtualChannel);

在DRV接口中,操作的便是不同的virtualChannel。

运行时状态

由于是使用C语言实现,没有类似C++中类这样的封装技术,但NXP也巧妙的使用了这样的概念,在初始化时引入一个edma_state_t *edmaState。

typedef struct {
   
    edma_chn_state_t * volatile virtChnState[(uint32_t)FEATURE_DMA_VIRTUAL_CHANNELS];   /*!< Pointer array storing channel state. */
} edma_state_t;
typedef struct {
   
    uint8_t virtChn;                     /*!< Virtual channel number. */
    edma_callback_t callback;            /*!< Callback function pointer for the eDMA channel. It will
                                              be called at the eDMA channel complete and eDMA channel
                                              error. */
    void *parameter;                     /*!< Parameter for the callback function pointer. */
    volatile edma_chn_status_t status;   /*!< eDMA channel status. */
} edma_chn_state_t;

edmaState通过数组指针的方式保存有所有通道的运行时信息,供外设驱动使用。
而edma_chn_state_t便是每个通道的信息,有通道号,供用户使用的回调函数,以及通道状态(正常or错误)。

配置信息

同S32SDK中其他模块一样,使用xxx_config_t的方式,提供模块的配置信息,在初始化时,将config赋给state,这样的好处就是可以使用图形化的配置工具生成特定模块的c语言结构体的config。

typedef struct {
   
    edma_channel_priority_t channelPriority; /*!< eDMA channel priority - only used when channel                                                  arbitration mode is 'Fixed priority'. */
    uint8_t virtChnConfig;                   /*!< eDMA virtual channel number */ 
    dma_request_source_t source;             /*!< Selects the source of the DMA request for this channel */
    edma_callback_t callback;                /*!< Callback that will be registered for this channel */
    void * callbackParam;                    /*!< Parameter passed to the channel callback */
    bool enableTrigger;                      /*!< Enables the periodic trigger capability for the DMA channel. */			
} edma_channel_config_t;

对于一个通道的配置,有通道号、优先级、触发源、回调函数、是否周期触发等。

初始化

status_t EDMA_DRV_Init(edma_state_t *edmaState,
                       const edma_user_config_t *userConfig,
                       edma_chn_state_t * const chnStateArray[]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值