八路ADC采集数据用串口输出的程序
时间: 2024-03-23 08:37:39 浏览: 17
以下是一个基于STM32的八路ADC采集数据并通过串口输出的程序示例:
```c
#include "stm32f4xx.h"
#include <stdio.h>
#include <stdlib.h>
#define ADC1_DR_ADDRESS ((uint32_t)0x4001204C)
void USART_Config(void);
void ADC_Config(void);
void NVIC_Config(void);
int main(void)
{
uint16_t ADC_ConvertedValue[8];
uint8_t i;
char buffer[10];
USART_Config(); //配置串口
ADC_Config(); //配置ADC
NVIC_Config(); //配置中断
while (1)
{
for (i = 0; i < 8; i++)
{
ADC_SoftwareStartConv(ADC1); //开启ADC转换
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); //等待转换完成
ADC_ConvertedValue[i] = ADC_GetConversionValue(ADC1); //获取转换结果
}
for (i = 0; i < 8; i++)
{
sprintf(buffer, "%d ", ADC_ConvertedValue[i]); //转换为字符串
USART_SendString(buffer); //通过串口发送数据
}
USART_SendString("\r\n"); //换行
}
}
void USART_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能USART2时钟
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); //GPIOA2复用为USART2
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); //GPIOA3复用为USART2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2和GPIOA3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA2、GPIOA3
USART_InitStructure.USART_BaudRate = 115200; //波特率为115200
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART2, &USART_InitStructure); //初始化USART2
USART_Cmd(USART2, ENABLE); //使能USART2
}
void ADC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //GPIOC0~7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不带上下拉
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC0~7
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //分辨率为12位
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //软件触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfConversion = 8; //转换8个通道
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_144Cycles); //ADC1通道10,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_144Cycles); //ADC1通道11,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_144Cycles); //ADC1通道12,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_144Cycles); //ADC1通道13,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_144Cycles); //ADC1通道14,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_144Cycles); //ADC1通道15,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 7, ADC_SampleTime_144Cycles); //ADC1通道16,采样时间144个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 8, ADC_SampleTime_144Cycles); //ADC1通道17,采样时间144个周期
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); //开启DMA请求
ADC_DMACmd(ADC1, ENABLE); //开启ADC DMA
ADC_Cmd(ADC1, ENABLE); //使能ADC1
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; //DMA2通道0中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能DMA2通道0中断
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
void DMA2_Stream0_IRQHandler(void)
{
if (DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0)) //传输完成中断
{
DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0); //清除中断标志位
}
}
void USART_SendString(char* s)
{
while (*s)
{
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); //等待发送完成
USART_SendData(USART2, *s++); //发送数据
}
}
```
该程序使用了STM32的DMA功能,将ADC转换结果存储到内存中,并通过DMA传输到串口输出缓存区,实现了高速连续输出。该程序默认将ADC1通道10~17采样,波特率为115200。您可以根据需要进行修改。