本帖最后由 woshiaokeman 于 2013-6-19 19:24 编辑
- *#include "stm32f10x.h"
- #include "SysTick.h"
- #include "key.h"
- #include "uart.h"
- #include "led.h"
- #include "dma.h"
- #include "adc1_mulitchannel.h"
- extern u16 rebuf[20];
- extern u8 flag;
- void NVIC_Configuration(void);
- int main(void)
- {
- u8 count = 0;
- SysTick_Init();
- NVIC_Configuration();
- UART_INIT_Config();
- // LED_GPIO_Config();
- // KEY_GPIO_Config();
- DMA_INIT_Config();
- ADC_Configuration();
- while(1)
- {
- if (flag)
- {
- flag = 0;
- for (count=0 ;count<20 ;count++)
- {
- printf("%d",rebuf[count]);
- printf("\x00D\x00A");
- }
- }
- }
- }
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Set the Vector Table base location at 0x08000000 */
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
- /* Configure the NVIC Preemption Priority Bits */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- #include "adc1_mulitchannel.h"
- void ADC_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
- ADC_InitStructure.ADC_ScanConvMode = ENABLE; //模数转换工作在单通道模式
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在连续转换模式
- 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_InitStruct中指定的参数初始化外设ADCx的寄存器
- // ADC_TempSensorVrefintCmd(ENABLE);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_239Cycles5 );
- ADC_DMACmd(ADC1, ENABLE);
- ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
- ADC_ResetCalibration(ADC1); //使能复位校准
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
- ADC_StartCalibration(ADC1); //开启AD校准
- while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- }
- #include "dma.h"
- #include "led.h"
- u16 rebuf[20];
- u8 flag;
- void DMA_INIT_Config(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
- /* DMA channel1 configuration */
- DMA_DeInit(DMA1_Channel1);
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)rebuf;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
- DMA_InitStructure.DMA_BufferSize = 20;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(DMA1_Channel1, &DMA_InitStructure);
- DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
- /* Enable DMA channel1 */
- DMA_Cmd(DMA1_Channel1, ENABLE);
- }
- void DMA1_Channel1_IRQHandler(void)
- {
- if(DMA_GetITStatus(DMA1_IT_TC1))
- {
- ADC_Cmd(ADC1, DISABLE);
- DMA_Cmd(DMA1_Channel1, DISABLE);
- flag = !flag;
- DMA_ClearFlag(DMA1_FLAG_TC1);
- DMA_ClearITPendingBit(DMA1_IT_TC1);
- }
- }
滴答定时和串口函数都是正确的,所以大家可以不用看!
其他设置都很常规,但是结果就是不对!
PC4连接的是一个可调电阻!
串口输出到电脑是随机数,不是随着可调电阻改变而改变的数值!可调电阻调到最小竟然输出65536,调到最大输出0!
|