STM32学习:ADC/DMA/USART
学习STM32的ADC转换,在开发板上写程序调试。
四个任务:
1.AD以中断方式(单次)采集一路
2.AD以中断方式连续采集四路
3.AD以DMA方式采集一路,DMA深度为一级
4.AD以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理。
总结:
第一个任务:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),
ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。
ADC_ContinuousConvMode,定转换是连续还是单次,ADC_ContinuousConvMode=DISABLE
为单次,ADC_NbrOfChangnel规定ADC规则转换的通道数。ADC_NbrOfChannel=1;//开启1个通道数。
ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_55Cycles5);设置指定规则组的通道的采样顺序和转换时间。这里以为只有一路通道,采用的是PC3引脚,对应的通道数是13通道,采样顺序也就是1,。
ADC_Cmd(ADC1,ENABLE);使能ADC
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);开启ADC转换结束中断。
ADC_ResetCalibration(ADC1);//重置校验寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置校验成功
ADC_StartCalibration(ADC1);//开始ADC校验
while(ADC_GetCalibrationStatus(ADC1));//等待ADC校验好
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发开始转换
因为ADC有一个16位的规则组数据寄存器(ADC_DR),采用一路转换时可以不用通过DMA传输。这里就没有配置DMA。
void ADC_IRQHandler(void)
{
ADCConvertedValue=ADC_GetConversionValue(ADC1);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}
当一次转换结束,DAC产生中断,在中断函数里,读取ADC_DR寄存器中的值,一定清除中断标志位。
采集出来的数据是16进制数,要经过处理,变成10进制数,具体如下:
(value*100/4096)*33,value是从寄存器读出来的十六进制的数据,经过此变换后就变成10进制数,是个整数,我们通过串口显示的时候要把小树部分也要显示出来则有:((value*100/4096)*33)/1000,整数部分。
((value*100/4096)*33)%1000/100,((value*100/4096)*33)%100/10),小数部分,
串口配置,我是通过STM32上的串口1与PC机通讯的,具体配置如下:
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;波特率9600
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据位
USART_InitStructure.USART_StopBits=USART_StopBits_1;1个停止位
USART_InitStructure.USART_Parity=USART_Parity_No;无奇偶校验
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStructure);初始化串口配置
USART_Cmd(USART1,ENABLE);使能串口
}
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, (u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)//检查发送是否完成
{
}
return ch;
}此函数,是把printf输出函数定向到USART。
第一个任务大概就是这个过程,在后面的任务有相同之处,就不重复叙述了。
第二个任务:ADC以中断方式连续采集四路。
首先配置4路模拟输入,我配置的是PC0、PC1、PC2、PC3四个IO口,输入方式为模拟输入,速度采用2M,它们对应的ADC通道分别是10、11、12、13通道。
在第一个任务说了,ADC规则转换多路采样时,ADC的数据寄存器只有一个16位寄存器,所以必须采用DMA来传输数据,DMA配置如下:
DMA_InitStructure.DMA_PeripheralBaseAddr=DR_ADDRESS; //DMA对应的外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&Buf; //内存存储基地址,定义的一个数组
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //DMA转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize=4; // DMA缓存大小,4个(设置DMA在传输时缓冲区的长度)
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移(设置DMA的外设递增模式)
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //关闭接收一次数据后,目标内存地址后移(设置DMA的内存递增模式)
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定义外设数据长度
DM
- STM32的曼彻斯特编译码系统设计(02-04)
- 采用ARM Cortex-M3单片机和DSP的逆变电源设计(06-24)
- STM32 ADC的采样周期确定(02-22)
- 基于STM32F103RB和CC1101的无线数传模块设计(07-23)
- 详解GPIO在STM32中的几种工作模式(09-24)
- 三极管做开关扩流的常用电路及使用误区(01-26)