初中生
最后登录1970-1-1
在线时间 小时
注册时间2018-7-10
|
#include "bsp_adc.h"
__IO uint16_t ADC_ConvertedValue;
void ADC_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 打开串口GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//引脚为第一个引脚PC1
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void ADC_Mode_Config(void)
{
ADC_InitTypeDef ADC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx,ENABLE);
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_InitStruct.ADC_ScanConvMode = DISABLE;//单通道模式
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//多次转换
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStruct.ADC_NbrOfChannel =1;//一个通道
ADC_Init(ADC_x,&ADC_InitStruct);//写入ADC配置
//打开ADC外设时钟
//ADC时钟8分频APB2总线(9MHz)
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//配置规则通道转换顺序
ADC_RegularChannelConfig(ADC_x,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);
//配置ADC中断
ADC_ITConfig(ADC_x,ADC_IT_EOC,ENABLE);
//使能ADC
ADC_Cmd(ADC_x,ENABLE);
ADC_ResetCalibration(ADC_x);//重置ADC校准
while(ADC_GetResetCalibrationStatus(ADC_x));//ADC复位后跳出循环
//启用ADC软件触发模式
// ADC开始校准
ADC_StartCalibration(ADC_x);
// 等待校准完成
while(ADC_GetResetCalibrationStatus(ADC_x))
{}
ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
}
void ADC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void ADCx_Init(void)
{
ADC_GPIO_Config();
ADC_Mode_Config();
ADC_NVIC_Config();
}
/***********************************************************************/
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "bsp_adc.h"
extern __IO uint16_t ADC_ConvertedValue;
// 局部变量,用于保存转换计算后的电压值
float ADC_ConvertedValueLocal;
/**
* @brief 主函数
* @param 无
* @retval 无
*/
void Delay(__IO uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
int main(void)
{
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
USART_Config();
ADCx_Init();
/* 发送一个字符串 */
printf("STM32ADC电压采集实验\r\n");/*电脑串口显示只打印出第一个S字母出来,后面程序不执行*/
while(1)
{ ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
printf("\r\n The current AD value = 0x%04X \r\n",
ADC_ConvertedValue);
printf("\r\n The current AD value = %f V \r\n",
ADC_ConvertedValueLocal);
printf("\r\n\r\n");
Delay(0xffffee);
}
}
/**************************************************************************************/
void ADC_IRQHandler(void)
{
if (ADC_GetITStatus(ADC_x,ADC_IT_EOC)==SET)
{
// 读取ADC的转换值
ADC_ConvertedValue = ADC_GetConversionValue(ADC_x);
}
ADC_ClearITPendingBit(ADC_x,ADC_IT_EOC);
}
|
|