你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM3基于正点原子开发板(战舰)的DAC音频输出软硬件配置记录

[复制链接]
STMCU小助手 发布时间:2022-11-18 22:00
硬件部分:
跳线帽将AIN和DAC连起来即可,如下图所示:
20201124222834361.jpg

具体看原理图:
下图中,PWM AUDIO就是上图开发板上的AIN引脚。

20201124223248821.jpg


下图中,PWM AUDIO通过TDA1308T芯片对应到PHONE(3.5mm音频输出口)。

20201124223412652.jpg

其他信息:
1)图1 DAC对应STM32芯片的PA4引脚;
2)本次使用TIM3定时器,其他定时器也可用。

软件部分:
通过硬件连接方式,不难理解开发思路:
1)DAC输出信号至音频输出端;
2)利用TIM定时器产生中断给DAC喂数据;

具体代码如下:
1)dac.h头文件

  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: dac.h
  4. * @作者名称: Aaron
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年11月23日
  8. * @摘要简述: dac头文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. #ifndef __DAC_H
  15. #define __DAC_H         
  16. /* 包含头文件 -----------------------------------------------------------------*/
  17. #include "stm32f10x.h"        
  18. /* 函数申明 -------------------------------------------------------------------*/                                                            
  19. void Dac1_Init(void);                            // DAC1 初始化
  20. void Dac1_Set_Vol(u16 vol);        // 设置DAC1 电压值
  21. #endif /* __DAC_H */
  22. /****** Copyright (C)2020 Aaron. All Rights Reserved ****** END OF FILE *******/
复制代码

2)dac.c源文件

  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: dac.c
  4. * @作者名称: Aaron
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年11月23日
  8. * @摘要简述: dac源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* 包含头文件 -----------------------------------------------------------------*/
  15. #include "dac.h"
  16. /************************************************
  17. 函数名称:void Dac1_Init()
  18. 函数功能:Dac1初始化函数
  19. 入口参数:无
  20. 返回参数:无
  21. 开发作者:Aaron
  22. *************************************************/
  23. void Dac1_Init(void)
  24. {
  25.         GPIO_InitTypeDef GPIO_InitStructure;
  26.         DAC_InitTypeDef  DAC_InitType;
  27.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );                     // 使能GPIOA通道时钟
  28.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );                     // 使能DAC通道时钟
  29.     // 设置PA4,模拟输入,因为一旦使能DACx通道后,相应的GPIO引脚会自动与DAC模拟输出相连,设置为输入,可避免额外的干扰
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                             // 选择引脚4
  31.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                                  // 模拟输入
  32.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.          GPIO_Init(GPIOA, &GPIO_InitStructure);
  34.         GPIO_SetBits(GPIOA,GPIO_Pin_4)        ;                                    // 令PA4输出高
  35.         DAC_InitType.DAC_Trigger=DAC_Trigger_None;                                 // 不使用触发功能
  36.         DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;             // 不使用波形发生
  37.         DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;   // 屏蔽、幅值设置
  38.         DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;                 // DAC1输出缓存关闭 BOFF1=1
  39.         DAC_Init(DAC_Channel_1,&DAC_InitType);         
  40.         DAC_Cmd(DAC_Channel_1, ENABLE);                                      // 使能DAC1转换通道
  41.     DAC_SetChannel1Data(DAC_Align_12b_R, 0);                             // 12位右对齐数据格式设置DAC值
  42.     }

  43. /************************************************
  44. 函数名称:Dac1_Set_Vol(u16 vol)
  45. 函数功能:设置通道1输出电压函数
  46. 入口参数:u16 vol:输入值范围0~3300,表示0~3.3V
  47. 返回参数:无
  48. 开发作者:Aaron
  49. *************************************************/
  50. void Dac1_Set_Vol(u16 vol)
  51. {
  52.         float temp=vol;
  53.         temp/=1000;                                    // 即temp=temp/1000
  54.         temp=temp*4096/3.3;                            // 因为DAC是12位,所以2^12=4096
  55.         DAC_SetChannel1Data(DAC_Align_12b_R,temp);     // 12位右对齐数据格式设置DAC值
  56. }
复制代码

3)timer.h头文件

  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: timer.h
  4. * @作者名称: Aaron
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年11月23日
  8. * @摘要简述: timer源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. #ifndef __TIMER_H
  15. #define __TIMER_H
  16. /* 包含头文件 -----------------------------------------------------------------*/
  17. #include "stm32f10x.h"
  18. /* 函数申明 -------------------------------------------------------------------*/
  19. void TIMER3_Interrput_Init(u16 arr, u16 psc);    // 定时器3中断初始化函数
  20. #endif /* __TIMER_H */
  21. /****** Copyright (C)2020 Aaron. All Rights Reserved ****** END OF FILE *******/
复制代码

4)timer.c源文件

  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: timer.c
  4. * @作者名称: Aaron
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年11月23日
  8. * @摘要简述: timer源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* 包含头文件 -----------------------------------------------------------------*/
  15. #include "timer.h"
  16. /************************************************
  17. 函数名称:TIMER3_Interrput_Init(u16 arr, u16 psc)
  18. 函数功能:定时器3 中断初始化函数
  19. 入口参数:u16 arr:自动重装载值, u16 psc:时钟预分频数
  20.          举例:令arr=4999,psc=7199,
  21.                                  则计数周期为(7199+1)/72000000=0.00001s,对应频率10KHz;
  22.                                  计数(4999+1)=5000值,需0.5s
  23. 返回参数:无
  24. 开发作者:Aaron
  25. *************************************************/
  26. void TIMER3_Interrput_Init(u16 arr, u16 psc)
  27. {
  28.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
  29.   NVIC_InitTypeDef        NVIC_InitTypeDef_TIM3Struct;
  30.   TIM_DeInit(TIM3);
  31.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                 // 使能TIM3时钟
  32.   // 定时器7 参数初始化配置
  33.   TIM_TimeBaseInitTypeStruct.TIM_Period=arr;
  34.   TIM_TimeBaseInitTypeStruct.TIM_Prescaler=psc;
  35.   TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Down;    // 向上计数模式
  36.   TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_DIV1;
  37.   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitTypeStruct);
  38.   TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                            // 使能定时器3更新中断
  39.   // 定时器3 中断优先级配置
  40.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannel=TIM3_IRQn;
  41.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelCmd=ENABLE;
  42.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelPreemptionPriority=1;
  43.   NVIC_InitTypeDef_TIM3Struct.NVIC_IRQChannelSubPriority=3;
  44.   NVIC_Init(&NVIC_InitTypeDef_TIM3Struct);
  45.   // 使能定时器3
  46.   TIM_Cmd(TIM3,ENABLE);
  47. }
  48. /************************************************
  49. 函数名称:TIM3_IRQHandler()
  50. 函数功能:定时器3 中断服务函数
  51. 入口参数:无
  52. 返回参数:无
  53. 开发作者:Aaron
  54. *************************************************/
  55. extern u16 Data;
  56. void TIM3_IRQHandler(void)
  57. {   
  58.         // 获取定时器3 状态
  59.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)  // 判断定时器3 状态是否为更新中断
  60.         {
  61.                 GetData();
  62.                 Dac1_Set_Vol(Data);
  63.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  // 清除更新中断标识
  64.         }
  65. }
复制代码

5)main.c主函数

  1. /**
  2. ********************************  STM32F10x  *********************************
  3. * @文件名称: main.c
  4. * @作者名称: Aaron
  5. * @库版本号: V3.5.0
  6. * @工程版本: V1.0.0
  7. * @开发日期: 2020年11月23日
  8. * @摘要简述: 主函数
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. * @更新日志:
  12. * @无
  13. * ---------------------------------------------------------------------------*/
  14. /* 包含头文件 -----------------------------------------------------------------*/
  15. #include "led.h"
  16. #include "dac.h"
  17. #include "timer.h"
  18. #include "delay.h"
  19. int main(void)
  20. {        
  21.     LED_Init();                                      // LED端口初始化//
  22.         LED0=1;
  23.         delay_init();                              // 延时函数初始化//
  24.     TIMER3_Interrput_Init(3599, 1);        
  25.         Dac1_Init();                                      // DAC初始化//
  26.         while(1)
  27.         {
  28.          delay_ms(200);
  29.          LED0=!LED0;
  30.         }
  31. }
复制代码

备注:getdata相关代码主要用来计算要喂给dac的值,我建了一个3000个数值的正弦波信号来调试程序,后期更具需要改声音数据吧。

实验结果:
将耳机插在Phone口上(即3.5mm音频接口),耳机左声道可听到所设的声音。

20201124230416324.jpg

————————————————
版权声明:天亮继续睡


收藏 评论0 发布时间:2022-11-18 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版