原型机实现基本功能;


录音代码:

void adc_half(void)
{if(page_index<page_length){for(x=0;x<DMA_size/2-1;x++){wave_buffer_a[wavIndex]=adc_val[x]*255/4096;wavIndex+=1;}}else{record_flag=3;printf("record to end\r\n");}}
void adc_all(void)
{
//  uint16_t temp;if(page_index<page_length){for(x=DMA_size/2-1;x<DMA_size-1;x++){wave_buffer_a[wavIndex]=adc_val[x]*255/4096;wavIndex+=1;}
//          EncodeB();wavIndex=0;Audio_write();}else{record_flag=3;printf("record to end\r\n");}}void record_pdm(void)
{if(record_flag==1){if(buff_flag==3){   page_index=0;      page_length=40;            HAL_TIM_Base_Start(&htim3);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
//              __HAL_DMA_ENABLE_IT(hdma_adc1, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));HAL_ADC_Start_DMA(&hadc1, (uint32_t *)(&adc_val), DMA_size);HAL_ADCEx_Calibration_Start(&hadc1);wavIndex=0;buff_flag=0;}}if(record_flag==3){    record_flag =0;
//          HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);HAL_TIM_Base_Stop_IT(&htim3);    HAL_ADC_Stop_DMA(&hadc1);printf("record to end\r\n");page_length=page_index;lora_send_init();}}
void Audio_write(void)
{U8_U64();writeFlash(page_index);page_index++;}void U8_U64(void){int i;for(i=0;i<wave_buffer_size/4;i++){WriteBuffer[i]=wave_buffer_a[i*4+3];WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4+2]<<8;WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4+1]<<16;WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4]<<24;}
}

播音代码

void audio_PCM(void)
{   if(play_flag ==1){if(buff_flag==3){ page_index=0;write_flag=0;Audio_read();page_index++;    write_flag=1;Audio_read();page_index++;  buff_flag=0;start_addr=0x0800F000;HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);HAL_TIM_Base_Start_IT(&htim1);    }if(buff_flag==1){ buff_flag=0;Audio_read(); page_index++;if(page_index>page_length){play_flag=3;}}}if(play_flag==3){play_flag =0;cont=0;TIM4->CCR1=0;HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);  HAL_TIM_Base_Stop_IT(&htim1);
//          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);   printf("play to end \r\n");}}void Audio_read(void){int i=0;for(i=0;i<wave_buffer_size/4;i++){WriteBuffer[i]=readFlash(start_addr)<<16|readFlash(start_addr+2);start_addr+=4;}U64_U8();
}void U64_U8(void){int i=0;if(write_flag==1){for(i=0;i<wave_buffer_size/4;i++){ wave_buffer_b[i*4]=WriteBuffer[i]>>16;wave_buffer_b[i*4+1]=WriteBuffer[i]>>24;wave_buffer_b[i*4+2]=WriteBuffer[i];wave_buffer_b[i*4+3]=WriteBuffer[i]>>8;}}else{for(i=0;i<wave_buffer_size/4;i++){wave_buffer_a[i*4]=WriteBuffer[i]>>16;wave_buffer_a[i*4+1]=WriteBuffer[i]>>24;wave_buffer_a[i*4+2]=WriteBuffer[i];wave_buffer_a[i*4+3]=WriteBuffer[i]>>8;}}}

lora处理函数

void Ebyte_Port_ReceiveCallback( uint16e_t state, uint8e_t* buffer, uint8e_t length )
{if( state &= 0x0001 ){int i;if(buffer[0]=='r'){start_flag=1;end_flag=1;for(i=0;i<13;i++){if(buffer[i]!=head_start[i])start_flag=0;}for(i=0;i<13;i++){if(buffer[i]!=head_stop[i])end_flag=0;}}if(start_flag==1){start_flag=0;printf("start to recieve\r\n");page_index=0;  }if(end_flag==1){page_length=page_index;end_flag=0;play_flag=1;    record_flag=0;buff_flag=3;printf("start to play\r\n");}for(i=0;i<length;i++,buffer++){wave_buffer_a[write_cont]=*buffer;if(write_cont>wave_buffer_size){write_cont=0;if(page_index<40){Audio_write();}}else{write_cont++;}}E32x_GoReceive();SPI_select=1;}}

样机测试发现如下缺陷,待优化提升:

提升lora传输速率(扩频,频宽调制)时,通话距离下降严重;

使用的STM32F103C8T6内存不足,运行SPEEX后内存经常溢出;

使用8KHz采样率,音质差强人意。

源代码下载链接:

https://download.csdn.net/download/qiang129/85163421

Lora sx1278+stm32(ADC录音)+SPPEX音频压缩 数字对讲机相关推荐

  1. [语音录制与播放]stm32+adc+dac

    2020-12-13更新: 最近总有人私信我要原理图和代码,贴一下我的公众号吧,有问题可以到这里联系我:[Golang梦工厂],下方点击联系人即可添加我的个人vx(建了一个语音录制交流群,加我VX拉你 ...

  2. LoRa SX1278通信代码开发学习

    前言 最近在学习和摸索LoRa SX1278无线发射模块,其中学到了很多新知识和对SX1278也有了深一点的认识,现在将学习开发中遇到的问题.解决方法.调试完成和低功耗等内容分享出来,也是一种学习记录 ...

  3. 音频压缩的方法有哪些?三个方法介绍给你

    不知道大家有没有跟我一样的烦恼,手机内存总是不够用,反复清理了又再清理,到最后还是留下了一些重要的文件不能删除,但是换手机一来觉得贵二来文件传输来传输去也怕损坏.目前我的手机里存放的最多的就是开会时候 ...

  4. Java实现音频格式转换 WAV---mp3,可使音频压缩

    最近做的一个小项目中,师兄安排的任务,要实现录音然后保存文件,实现网络传输,然后我用初学的java实现了一个录音机的功能(见前面的博客),但是windows录音默认保存的格式是WAVE,后缀是WAV, ...

  5. STM32——ADC模数转换器

    文章目录 一.ADC模数转化器 ADC简介 逐次逼近型ADC ADC框图 二.ADC基本结构 三.触发转换控制 四.输入通道 五.规则组的四种转换模式 单次转换,非扫描模式 连续转换,非扫描模式 单次 ...

  6. STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA

    STM32 ADC 支持同步规则模式 ,其官方解释为: 大致意思就是通道组的 ADC1 的多路开关(由 ADC1_CTLR2寄存器的 ETSRC[2:0]决定), ADC2 被同步触发.在 ADC1 ...

  7. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  8. STM32 ADC转换实验

    摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...

  9. STM32——ADC

    STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...

  10. STM32 ADC模数转换

    STM32 ADC模数转换 独立模式/双重DMA/三重DMA //使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //APB2 ...

最新文章

  1. RDKit | 基于多片段的分子生成(骨架A+骨架B+骨架C)
  2. 前端基础知识 - 收藏集 - 掘金
  3. spring 调用python_Spring http服务远程调用实现过程解析
  4. java如何用键盘输入_java中如何从键盘输入(附代码)
  5. 01_13_JSP编译指令
  6. 【Kafka】Kafka如何开启SSL 控制台消费与生产 代码消费与生产
  7. [转载] 【Python】Python3 List copy()方法
  8. java毕业设计开题报告javaweb户籍管理系统|户口
  9. XWPFTemplate生成根据模板文件填充内容生成word文件
  10. 单件模式(Singleton Pattern
  11. java modifier access_Java Modifier.getAccessSpecifier方法代码示例
  12. 美术基础——角色设计
  13. Refseq : accession id to taxonomy lineage.
  14. 联想小新 Air 13 (Pro) 6,7代笔记本安装Win7系统
  15. Anaconda各个版本清华镜像站下载
  16. java中的toArray()
  17. 从0了解矩阵——矩阵的本质
  18. 【DEVOPS】基于禅道 - 重构研发协作流程
  19. c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第9章 文件程序设计.pdf...
  20. js-高德地图规划路线

热门文章

  1. android CTS GTS 环境搭建
  2. IDEA乱码解决合集
  3. 提醒专注:既往不恋,未来不迎,当下不杂
  4. 向 webview 添加 userScript
  5. 自动排单功能的一些思考
  6. koa 设置cache_nodejs cache 缓存机制的简单实现
  7. 关于使用 Connect-Busboy 实现文件上传 优化说明
  8. 去掉 新版GeForce Experience 桌面录制视频时的 右上角图标
  9. ubuntu或者Ubuntu Kylin下安装Visual Studio Code
  10. 计算机技术对艺术设计的影响,计算机对艺术设计有何影响