原创 hc32l073 的 i2s DMA功能代码

2023-12-5 09:43 334 1 2 分类: 物联网 文集: 学习分享
以下是一个简单的HC32L073 I2S DMA功能代码示例,用于单通道(左通道)16位数据宽度和48KHz采样率:

```c
#include "hc32_i2s.h"

void I2S_DMA_Init(void)
{
    I2S_InitTypeDef I2S_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;

    // 使能I2S外设时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_I2Sx, ENABLE);

    // 配置I2S参数
    I2S_InitStructure.I2S_Mode = I2S_Mode_MasterTx; // 主发送模式
    I2S_InitStructure.I2S_AudioFreq = 48000; // 采样率为48KHz
    I2S_InitStructure.I2S_BitsPerSample = I2S_BitsPerSample_16BIT; // 16位数据宽度
    I2S_InitStructure.I2S_ChannelSize = I2S_ChannelSize_1; // 单通道
    I2S_InitStructure.I2S_CommMode = I2S_CommMode_NoInterrupt; // 无中断模式
    I2S_InitStructure.I2S_CPOL = I2S_CPOL_Low; // 低电平有效
    I2S_InitStructure.I2S_CPHA = I2S_CPHA_Left; // 左对齐
    I2S_InitStructure.I2S_DataFormat = I2S_DataFormat_NonInterleaved; // 非交错格式
    I2S_InitStructure.I2S_Prescaler = 256; // 预分频器值为256
    I2S_Init(I2Sx, &I2S_InitStructure);

    // 使能DMA外设时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

    // 配置DMA参数
    DMA_DeInit(DMAx);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&I2S_DATA; // I2S数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&buffer; // 缓冲区地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 外设目标模式
    DMA_InitStructure.DMA_BufferSize = sizeof(buffer); // 缓冲区大小
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度为半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据宽度为半字
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 正常模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA到内存不使用内存到内存传输模式
    DMA_Init(DMAx, &DMA_InitStructure);

    // 使能DMA外设
    DMA_Cmd(DMAx, ENABLE);
}
```

请注意,您需要根据您的硬件连接和需求修改此代码。例如,您可能需要更改I2S引脚、DMA通道等。此外,您还需要定义一个缓冲区`buffer`来存储音频数据。

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

给作者打赏,鼓励TA抓紧创作!

赞赏支持
点赞 1
赞赏0

文章评论1条评论)

登录后参与讨论

Santa 2023-12-28 11:30

代码看起来是STM32的, 请问真是HC32LL073? 我没有看过小华有这个驱动库。
相关推荐阅读
丙丁先生 2024-03-01 11:51
Rufus制作可启动的U盘
Rufus是一个可以帮助格式化和创建可引导USB闪存盘的工具,如USB随身碟、记忆棒等。使用Rufus制作可启动的U盘,可以参考以下步骤:下载并安装Rufus软件。打开浏览器,搜索Rufus官方网站,...
丙丁先生 2024-03-01 11:48
Windows 系统下的 WSL2 搭建与使用
WSL2(Windows Subsystem for Linux 2)是Windows系统下的一个功能,允许你在Windows环境下运行Linux子系统。下面是在Windows系统下搭建和使用WSL2...
丙丁先生 2024-03-01 11:46
两轮自平衡PID小车 32-bit Arm 2个I2C
两轮自平衡PID小车是一种利用PID(比例-积分-微分)控制算法来实现自动平衡和移动的机器人。这种小车通常包含电机驱动、传感器、电源、微控制器等部分。其中,微控制器是小车的核心,负责处理传感器数据、执...
丙丁先生 2024-02-29 12:08
电池监测和矿石能耗监测在实现上的异同点
电池监测和矿石能耗监测在实现上的异同点主要表现在以下几个方面:相同点:数据采集:两者都需要对目标对象(电池或矿石能耗设备)进行数据采集,包括电压、电流、温度、功率等关键参数。数据处理与分析:采集到的数...
丙丁先生 2024-02-27 13:03
深入理解Linux网络 以 CPU、内存、以及I/O 比较 谈网络、Linux系统最核心的功能
当我们谈论Linux系统的核心功能时,网络、CPU、内存和I/O是几个关键的方面。下面我将用口语化的方式,来比较和讨论它们在Linux系统中的作用和重要性。CPU(中央处理器):CPU是计算机的大脑,...
EE直播间
更多
我要评论
1
1
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /5 下一条