您的位置:首页 > 其它

STM32学习笔记-ADC采集-串口2发送至上位机

2018-03-25 13:42 453 查看
首先感谢河北科技大学航模协会-能给我这样的学习机会-感谢那些带我们教我们的学长学姐们.
串口2的配置(一根杜邦线不行纠结了半天)void USART2_Initialise( u32 bound )
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

/* Enable the USART2 Pins Software Remapping */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

/* Configure USART2 Rx (PA.03) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART2 Tx (PA.02) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_Cmd(USART2, ENABLE);
}原理与串口一相同,只是io口不同,所在总线不同
ADC1的配置void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_DeInit(ADC1);

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

      ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

} io口配置与点亮第一个led灯类似,模拟输入模式即可
与配置其他功能类似,ADC的配置也是一个结构体变量传入参数
ADC_InitTypeDef结构体变量名
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );

使能ADC1通道时钟

RCC_ADCCLKConfig(RCC_PCLK2_Div6); 设置ADC分频因子 72/6=12M

ADC_DeInit(ADC1);复位ADC

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC工作模式ADC1和ADC2工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE;模数转换在单通道模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;模式转换工作在单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;软件触发

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC数据对齐方式

ADC_InitStructure.ADC_NbrOfChannel = 1;顺序进行转换的ADC通道数

ADC_Init(ADC1, &ADC_InitStructure);传入结构体地址,初始化ADC

 ADC_Cmd(ADC1, ENABLE);使能ADC

ADC_ResetCalibration(ADC1);使能复位校准

while(ADC_GetResetCalibrationStatus(ADC1));等待复位校准结束

ADC_StartCalibration(ADC1);开启AD校准

while(ADC_GetCalibrationStatus(ADC1));等待校准结束

获取ADC函数传入参数adc通道号u16 Get_Adc(u8 ch)
{

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

return ADC_GetConversionValue(ADC1);
}ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );ADC1,通道1,采样时间为239.5个周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE);使能指定ADC1软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));等待转换结束

return ADC_GetConversionValue(ADC1);返回最后一次ADC的转换结果

ADC通道对应io口如图


         p=adcx;
p=(3.3/4096)*p;
         p=p*10000;

v=(int)p;

USART_SendData(USART2,0x76);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,0x3D);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(48+v/10000));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,0x2E);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(48+v%10000/1000));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(48+v%10000%1000/100));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(48+v%10000%1000%100/10));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(48+v%10000%1000%100%10));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,0x0A);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET); 采集adc以ASCII方式发送给上位机
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);等待发送完成



声明:转载请注明出处,本人入门级菜鸟,内容大多学习于网络,存在问题太多不一一列举,大佬多多指教.本人QQ941131649
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 单片机 嵌入式