根据STM32103F实战指南写的程序,结果不能在12864屏上显示,求各位大神帮我看看,是哪个环节写错了呢?
#include "stm32f10x.h" // Device header
#define ADC_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADCx ADC1
#define ADC_CLK RCC_APB2Periph_ADC1
#define ADC_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADC_GPIO_CLK RCC_APB2Periph_GPIOA
#define ADC_PORT GPIOA
#define ADC_PIN GPIO_Pin_1
#define ADC_CHANNEL ADC_Channel_1
#define ADC_IRQ ADC1_2_IRQn
#define ADC_IRQHandler ADC1_2_IRQHandler
float ADC_ConvertedValue;
static void ADCx_GPIO_Config(void) //ADC GPIO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_GPIO_APBxClock_FUN (ADC_GPIO_CLK ,ENABLE ); //打开ADC IO 端口
GPIO_InitStructure.GPIO_Pin =ADC_PIN; //配置ADC IO引脚模式,必须为模拟输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN ;
GPIO_Init (ADC_PORT ,&GPIO_InitStructure); //初始化ADC IO
}
static void ADCx_Mode_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_APBxClock_FUN(ADC_CLK,ENABLE ); //打开ADC时钟
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ; //ADC模式配置,只使用一个ADC,属于独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //禁止扫描模式,多通道需要,单通道不需要
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换模式
ADC_InitStructure.ADC_DataAlign = ADC_ExternalTrigConv_None; //不用外部触发,软件开启即可
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //转换结果右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //转换同道1个
ADC_Init(ADCx,&ADC_InitStructure); //初始化ADC
RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC时钟为CLK2的8分频,即9MHz
ADC_RegularChannelConfig (ADCx,ADC_CHANNEL,1,ADC_SampleTime_55Cycles5 );
//配置ADC通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期
ADC_ITConfig(ADCx,ADC_IT_EOC,ENABLE);
//ADC转换结束产生中断,在中断服务程序中读取转换值
ADC_Cmd(ADCx,ENABLE); // 开启ADC,并开始转换
ADC_ResetCalibration(ADCx); //校准寄存器初始换
while(ADC_GetResetCalibrationStatus (ADCx)); //等待寄存器初始化完成
ADC_StartCalibration(ADCx); //ADC开始校准
while(ADC_GetCalibrationStatus(ADCx)); //等待校准完成
ADC_SoftwareStartConvCmd(ADCx,ENABLE); //由于没有采用外部触发,所以使用软件触发ADC转换
}
static void ADC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
float ConvertedValue_Get(void)
{
return
ADC_ConvertedValue;
}
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus(ADCx,ADC_IT_EOC) == SET)
{
ADC_ConvertedValue = ADC_GetConversionValue(ADCx);
}
ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}
void ADCx_Init(void)
{
ADCx_GPIO_Config();
ADCx_Mode_Config();
ADC_NVIC_Config();
}
然后我在主程序调用ConvertedValue_Get变量,显示屏一点反应也没,请教各位大神,是什么问题?
#include "stm32f10x.h"
#include "12864.h"
#include "Delay.h"
#include "Value.h"
extern void PutString(char *str,u8 line); //在第line行输出字符串
extern void PutIntNum(int value,u8 num,u8 choose); //在第line行输出整数
extern void PutFloatNum(float value,u8 num1,u8 num2); //在第line行输出小数
float DisNum=0,DisNum1=0;
uint32_t CountSenser_Get(void);
float ConvertedValue_Get(void);
uint8_t FLAG = 0;
int main(void)
{
ADCx_Init();
ChipHalInit(); //片内硬件初始化
LCD_Init (); //LCD初始化
while(1)
{
DisNum1 = ConvertedValue_Get()/4096*3.3;
PutString("电压: ",3);
PutFloatNum(DisNum1,5,5);
PutChar("V");
|