基于CH32V307的录音喊话器

录音喊话器

CH32V305/7系列是基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块 。  

 

.系统框图

      . 功能实现流程

          

 

ADC功能模块

 

ADC输入通道

 

3.代码实现

(1)多通道采集

void adc init (void)

ADC通道1引脚初始化

GPIO_InitTypeDef GPIO_Initstructure = {0 };

RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOA,&GPIO_Initstructure);

ADC1模块初始化

I

ADC_InitTypeDef ADC_Initstructure = {0};

RCC_APB2PeriphclockCmd(RCC_APB2Periph_ADC1,ENABLE);RCC_ADCCLKConfig (RCC_PCLK2_Div6);

ADC_DeInit (ADC1);

ADc_Initstructure.ADC_Mode = ADC_Mode_Independent;

ADC_Initstructure.ADC_ScanConvMode = ENABLE;

ADC_Initstructure.ADC ContinuousConvMode = ENABLE;

ADC_Initstructure.ADC_ExternalTr1gconv = ADC_ExternalTr1gConv_None;

ADC_Initstructure.ADC_DataAlign = ADC_DataAlign_Right;

ADC_Initstructure.ADC_Nbrofchannel = ADC_CHANNEL_NUM;

ADC_init (ADC1,&ADC_Initstructure) ;

ADC_Cmd (ADC1,ENABLE);

使能ADC Buffer

ADC_BufferCmd (ADC1,ENABLE);

使能内部ADC通道

ADC_Tempsensorvrefintcmd (ENABLE);

ADC DMA初始化

adc_dma_init () ;

ADC_DMACmd(ADC1,ENABLE);

adc init( ) ;

配置ADC1规则组转换顺序和通道采样时间

ADC_Regularchannelconfig(ADc1,ADC_channel_立refint,1,ADC_SampleTime_239cycles5 );

ADC_RegularChannelconfig(ADc1,ADC_channel_1,2,ADC_Samplerime_71cycles5 );

软件触发转换

ADC_softwarestartconvCmd(ADC1,ENABLE);

ADC DMA中断服务函数

attribute _( (interrupt ("WCH-Interrupt-fast" ) ))void DMA1_channel1_IRQHandler (void)

DMAClearITPendingBit (DMA1_IT_Tc1) ;

printf ( "adc dma transfer complete\r\n" );

for (uint16_t i=0; i

printf ( "adc_data_buffer [ &d][0] = %d,adc_data_buffer [ %d] [1]=%d \r\n" ,i,adc_data_buffer[i] [0] ,i,adc_

OPA初始化

void opa_init (void){

GPIO_InitTypeDef GPIO_Initstructure={0};OPA_InitTypeDef OPA_Initstructure={0};

OPA4初始化

RCC_APB2PeriphclockCmd (RCC_APB2Periph_GPIOC,ENABLE ) ;

GPIo_Initstructure.GPIo_Pin = GPIo_Pin_4 |GPIO_Pin_3;

GPIO_Initstructure.GPIO_Mode = GPIo_Mode_IN_FLOATING;

GPIO_Initstructure.GPIO_Speed = GPIO_speed_50MHz;

GPIO_Init(GPIOC,&GPIO_Initstructure) ;

OPA Initstructure.OPA_NUM=OPA4;

OPA Initstructure.PSEL=CHP1;oPA Initstructure.NSEL=CHN1;

OPA1初始化

RCC APB2PeriphclockCmd (RCC_APB2Periph_GPIOB,ENABLE );

GPIO_Initstructure.GPIO_Pin = GPIo_Pin_11|GPIO_Pin_15;

GPI0 Initstructure.GPIO_Mode = GPIo_Mode_IN_FLOATING;

GPIO_Initstructure.GPIO_Speed = GPIo_Speed_50MHz;

GPIO_ Init (GPIOB,&GPIO_ Initstructure) ;

OPA_Initstructure.oPA_NUM=OPA1;

OPA Initstructure.PSEL=CHPO;oPA Initstructure.NSEL=CHNO;

OPA Initstructure.Mode=OUT_IO_OUT0;OPA Init ( &OPA_Initstructure);

oPA_Cmd ( oPA1,ENABLE);

OPA_Initstructure.Mode=oUT_Io_OUTO;

OPA_Init ( &OPA_Initstructure) ;

OPA_Cmd ( oPA4,ENABLE);

DAC功能框图

 

输出通道

 

定时器8的初始化

void timer8_init (uint16_t arr, uint16_t psc)

TIM TimeBaseInitTypeDef TIM_ TimeBaseInitstructure={0};

RCC_APB2Periphclockcmd ( RCC_APB2Periph_TIM8,ENABLE );

TIM TimeBaseinitstructure.TIM_Period = arr;

TIM TimeBaseInitstructure.TIM_Prescaler = psc;

TIM TimeBaseInitstructure.TIM ClockDivision = TIM_CKD_DIV1;

TIMTimeBaseInitstructure.TIM_CounterMode=TIM_CounterMode_up;

TIM_TimeBaseInitstructure.TIM_Repetitioncounter = 0x00;

TIM_TimeBaseInit( TIM8,&TIM_TimeBaseInitstructure);

TIM selectoutputTrigger(TIM8,TIM_TRGOSource_Update) ;

TIM Cmd (TIM8,ENABLE);

DAC初始化

void dac init(void)

GPIO_InitTypeDef GPIO_Initstructure = {0 };

DAC_InitTypeDef DAC_InitType = {0 } ;

RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB1PeriphclockCmd(RCC_APB1Periph_DAC,ENABLE);

GPIO_Initstructure.GPIO_Pin = GPIO_Pin_4;

GPIO_Initstructure.GPIO_Mode=GPIO_Mode_AIN;

GPIO_Initstructure.GPIO_speed = GPIo_speed_50MHz;

GPIO_Init(GPIOA,&GPIO_Initstructure) ;

GPIO_setBits (GPIOA,GPIO_Pin_4) ;

timer8 触发

DAC_InitType. DAC_Trigger = DAc_Trigger_T8_TRGO;

不使用三角波或伪噪声

DAC InitType.DAC_waveGeneration = DAC_waveGeneration_None;

使能输出Buffer,减少输出阻抗

DAc_InitType.DAc_outputBuffer = DAC_outputBuffer_Enable;

DAC_Init (DAc_Channel_1,&DAc_InitType) ;

DAC_Cmd (DAC_Channel_1,ENABLE);

使能DAC DMA

dac dma init( ) ;

DAC DMACmd (DAC Channel 1,ENABLE);

定时器8初始化

timer8_init (10,720-1);

}

ADC DMA中断服务函数

attribute _( (interrupt ( "WCH-Interrupt-fast")))

void DMA1_Channel1_IRQHandler (void)

DMA_ClearITPendingBit (DMA1_IT_TC1) ;

DMA1 channel1->CFGR &= (uint16 t)(~DMA_CFGR1_EN);

DMA2_Channel3->CFGR &=(uint16_t) (~DMA_CFGR1_EN);

if (adc_buffer_flag == o )

{

adc buffer_flag = 1;

DMAl channel1->MADDR = (uint32 t)adc_data buffer_2;

DMA2_Channel3->MADDR = (uint32_t) adc_data buffer_1;//dac输出

}

Else{

adc buffer_flag = 0;

DMA1_Channel1->MADDR = (uint32_t)adc_data buffer_l;

DMA2Channel3->MADDR = (uint32_t)adc_ data buffer_ 2; }

DMA2Channel3->CNTR = ADC_DATA_LENGTH;

DMA2 Channel3->CFGR|= DMA CFGR1 EN;//启动DAC DMA

DMA1Channel1->CNTR = ADC_DATA_LENGTH;

DMA1 Channel1->CFGR|= DMA CFGR1 EN;//启动DAC DMA

  • 心得体会

经过4个星期的学习,让我对单片机有了更深的了解。同时此次实验过程也让我明白了理论知识只有和实践结合才能取得更好的效果。希望今后能够经常开展实验,加强自己的动手能力,感谢老师们的教导。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部