#include "bsp.h"
/******DAC寄存器地址声明*******/
#define DAC_DHR12R1 (u32)&(DAC->DHR12R1) //DAC通道1输出地址
#define DAC_DHR12R2 (u32)&(DAC->DHR12R2) //DAC通道2输出地址
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
// 统一的波形表数组
uint16_t wave_tabs[WAVE_TYPE_COUNT][WAVE_SIZE] = {
[NO_WAVE] = { // 无波形
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
},
[SIN_WAVE] = { // 正弦波 后面用函数生成
0, 39, 156, 345, 600, 910, 1264, 1648, 2048, 2832, 3186, 3496, 3751, 3940, 4057, 4095,
4057, 3940, 3751, 3496, 3186, 2832, 2448, 2048, 1648, 1264, 910, 600, 345, 156, 39, 0
},
[EXPON_WAVE] = { // 指数波
0, 435, 850, 1229, 1564, 1855, 2105, 2317,
2499, 2655, 2789, 2906, 3007, 3096, 3175, 3245,
3307, 3363, 3413, 3459, 3500, 3538, 3573, 3605,
3634, 3662, 3687, 3710, 3732, 3753, 3772, 3790,
3807, 3823, 3838, 3852, 3865, 3878, 3890, 3901,
3912, 3923, 3933, 3942, 3951, 3960, 3968, 3976,
3984, 3991, 3998, 4005, 4011, 4017, 4023, 4029,
4035, 4040, 4045, 4050, 4055, 4060, 4064, 4069,
4095, 3660, 3245, 2866, 2531, 2240, 1990, 1778,
1596, 1440, 1306, 1189, 1088, 1000, 920, 850,
788, 732, 682, 636, 595, 557, 522, 490,
461, 433, 408, 385, 363, 342, 323, 305,
288, 272, 257, 243, 230, 217, 205, 194,
183, 172, 162, 153, 144, 135, 127, 119,
111, 104, 97, 90, 84, 78, 72, 66,
60, 55, 50, 45, 40, 35, 31, 26
},
[TRIANG_WAVE] = { // 三角波 后面用函数生成
0, 268, 536, 805, 1073, 1341, 1610, 1878, 2146, 2415, 2683, 2951, 3220, 3488, 3756, 4095,
4095, 3827, 3559, 3290, 3022, 2754, 2483, 2215, 1947, 1678, 1410, 1142, 871, 603, 335, 0
},
[SQUARE_WAVE] = { // 方波
0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,
},
[SAWTOOTH_WAVE] = { // 锯齿波 后面用函数生成
0, 136, 273, 409, 546, 682, 819, 955, 1092, 1228, 1365, 1501, 1638, 1774, 1911, 2047,
2184, 2320, 2457, 2593, 2730, 2866, 3003, 3139, 3276, 3412, 3549, 3685, 3822, 3958, 4095, 0
},
[CONTINUOUS_WAVE] = { // 等幅波
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,4095, 4095, 4095, 4095, 4095, 4095, 4095, 0,
},
[SHARP_WAVE] = { // 尖波 后面用函数生成
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 4095, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
},
[MIXED_WAVE] = { // 混合波 没有用到
0,27,190,200,290,380,460,540,600,680,800,1000,1400,2000,2890,4095,
0,0,0,0,0,0,0,0,4095,4095,4095,4095,4095,4095,4095,4095,
}
};
#define M_PI 3.14159265358979323846
#define MAX_VALUE 4095
// 生成从 0 到 4095 再到 0 的半个正弦波数据
static void generate_sine_wave(void) {
for (uint16_t i = 0; i < WAVE_SIZE; i++) {
// 计算 0 到 π 之间的角度
double angle = M_PI * i / (WAVE_SIZE - 1);
// 计算正弦值并缩放至 0 到 4095 范围
wave_tabs[SIN_WAVE][i] = (uint16_t)(MAX_VALUE * (sin(angle)));
}
}
// 生成三角波数据的函数
static void generate_triangle_wave(void) {
for (int i = 0; i < WAVE_SIZE; i++) {
if (i < WAVE_SIZE / 2) {
// 上升阶段
wave_tabs[TRIANG_WAVE][i] = (MAX_VALUE / (WAVE_SIZE / 2)) * i;
} else {
// 下降阶段
wave_tabs[TRIANG_WAVE][i] = MAX_VALUE - ((MAX_VALUE / (WAVE_SIZE / 2)) * (i - WAVE_SIZE / 2));
}
}
}
// 生成锯齿波数据的函数
static void generate_sawtooth_wave(void) {
for (int i = 0; i < WAVE_SIZE; i++) {
wave_tabs[SAWTOOTH_WAVE][i] = (MAX_VALUE / (WAVE_SIZE - 1)) * i;
}
}
// 生成尖波数据的函数
static void generate_spike_wave(void) {
// 假设尖波在中间位置达到最大值
int peak_index = WAVE_SIZE / 2;
for (int i = 0; i < WAVE_SIZE; i++) {
if (i == peak_index) {
wave_tabs[SHARP_WAVE][i] = MAX_VALUE;
} else {
wave_tabs[SHARP_WAVE][i] = 0;
}
}
}
// 初始化 波形
static void Init_Wave_Tabs(void)
{
// 遍历每一行并用 memset 填充值 0x66
for (int i = 0; i < WAVE_TYPE_COUNT; i++)
{
for(int j = 0; j < WAVE_SIZE; j++)
{
A_wave_tabs[i][j] = 0x00;
B_wave_tabs[i][j] = 0x00;
}
}
generate_sine_wave(); /*生成 正弦波*/
generate_triangle_wave();/*生成 三角波*/
generate_sawtooth_wave();/*生成 锯齿波*/
generate_spike_wave(); /*生成 尖波*/
}
static void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ;
//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速率
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 ; /*插入检测*/
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速率
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
static void DAC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/**************DAC结构初始化*******************/
DAC_StructInit(&DAC_InitStructure);
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不产生波形
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //不使能输出缓存
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;//DAC触发为定时器2触发
DAC_Init(DAC_Channel_1, &DAC_InitStructure);//初始化
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC的通道1
DAC_DMACmd(DAC_Channel_1, ENABLE); //使能DAC通道1的DMA
DAC_Init(DAC_Channel_2, &DAC_InitStructure);//初始化
DAC_Cmd(DAC_Channel_2, ENABLE); //使能DAC的通道2
DAC_DMACmd(DAC_Channel_2, ENABLE); //使能DAC通道2的DMA
}
static void DMA_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);//开启DMA2时钟
DMA_DeInit(DMA2_Channel3);
DMA_DeInit(DMA2_Channel4);
/* 配置DMA2 */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R1; //外设数据地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&wave_tabs[NO_WAVE] ; //内存数据地址 DAC_Buf 修改这个地址可以输出不同波形
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向内存至外设
DMA_InitStructure.DMA_BufferSize = WAVE_SIZE; //缓存大小为32字节
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_Me
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在嵌入式系统开发领域,STM32F103 作为一款经典且应用广泛的微控制器,其强大的外设功能为各类信号生成提供了便捷的解决方案。本文将深入探讨如何利用 STM32F103 的 DAC(数模转换器)和 DMA(直接内存访问),实现正弦波、指数波、三角波、方波、锯齿波、等幅波、尖波等多种常见波形的输出,助力开发者深入理解和掌握这一实用技术。 一、STM32F103 DAC 与 DMA 基础概述 1.1 DAC STM32F103 内置 12 位的 DAC 模块,部分型号具备两个 DAC 通道。该模块能够将数字信号精准转换为模拟信号,输出电压范围覆盖 0 到 VREF+。这一特性使其在音频合成、传感器信号模拟以及电机控制等领域得到广泛应用。 1.2 DMA DMA 允许在无需 CPU 频繁干预的情况下,实现内存与外设之间的数据传输。在波形输出过程中,使用 DMA 不仅能够显著提升数据传输效率,降低 CPU 的负担,确保系统能够在处理其他任务的同时,稳定输出波形,还能避免因 CPU 中断导致的波形失真。
资源推荐
资源详情
资源评论






























收起资源包目录



共 2 条
- 1
资源评论


梵v心
- 粉丝: 4
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 如何学好网络营销课程.doc
- 信息系统安全概述.pptx
- 基于单片机的电子密码锁的课程设计.docx
- 数据挖掘的方法有哪些?.pdf
- 汽车单片机与车载网络培训课件.pptx
- 房产项目管理实用表格工具.doc
- 卫星通信系统概述.ppt
- 模板项目管理月报.doc
- 中企动力网络营销.pptx
- 专业会计必备的应的Excel技巧【会计实务操作教程】.pptx
- 数据库原理试卷A(标准答案).doc
- 网络安全入侵检测.ppt
- 最新国家开放大学电大《营销策划案例分析》网络核心课形考网考作业及答案.pdf
- 网络营销理论培训课件.pptx
- 综合布线技术与施工模拟公司制.pptx
- 无线网络WIFI对人们生活影响的调查报告样本.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
