刚接触啊,各种不会,求喷。。。

2019-03-23 19:33发布

任务由stm32 ADC2采集数据后存入sd卡里面(不用DMA),我修改了下两个程序,第一:3ADCs_DMA删除部分程序只用ADC2,第二:Ex013-SDIO+FatFS删除部分程序。然后合并两程序。。。可是不对。好像ADC转换的数据存入的变量要申明成全局变量,不懂怎么设置,求高手指教。谢谢!下面是我乱整的程序。。。
                  /****************************************************************************

#include <stdio.h>
#include "stm32f10x.h"
#include "systick.h"
#include "usart_printf.h"
#include "sdcard.h"
#include "ff.h"

#define EXAMPLE_NAME        "SDIO FatFS Demo"
#define EXAMPLE_DATE        "2011-04-06"
#define ADC1_DR_Address    ((uint32_t)0x4001244C)
#define ADC3_DR_Address    ((uint32_t)0x40013C4C)

ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
__IO uint16_t ADC1ConvertedValue = 0, ADC3ConvertedValue = 0;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);

static void InitBoard(void);
static void DispLogo(void);

void ViewRootDir(void);
void CreateNewFile(void);
void ReadFileData(void);
void CreateDir(void);
void DispMenu(void);

/*******************************************************************************
*        函数名:main
*        功  能:用户程序入口
*        输  入: 无
*        输  出: 无
*/
int main(void)
{
        /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* NVIC configuration ------------------------------------------------------*/
  NVIC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();


       
  /* ADC2 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC2, &ADC_InitStructure);
  /* ADC2 regular channels configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_28Cycles5);
  /* Enable ADC2 EOC interupt */
  ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);

  
  
  
  
  /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);

  /* Enable ADC2 reset calibaration register */   
  ADC_ResetCalibration(ADC2);
  /* Check the end of ADC2 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC2));

  /* Start ADC2 calibaration */
  ADC_StartCalibration(ADC2);
  /* Check the end of ADC2 calibration */
  while(ADC_GetCalibrationStatus(ADC2));


  /* Start ADC2 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC2, ENABLE);
  

        InitBoard();        /* 为了是main函数看起来更简洁些,我们将初始化的代码封装到这个函数 */
        DispLogo();                /* 显示例程Logo */
       
        /* 打印命令列表,用户可以通过串口操作指令 */
        DispMenu();
        while(1)
        {
               
       
                                    CreateNewFile();                /* 创建一个新文件,写入一个字符串 */
                         break;
       
       
        }
       
}

/*******************************************************************************
*        函数名:ViewRootDir
*        功  能:显示SD卡根目录下的文件名
*        输  入: 无
*        输  出: 无
*/

/*******************************************************************************
*        函数名:ViewRootDir
*        功  能:显示SD卡根目录下的文件名
*        输  入: 无
*        输  出: 无
*/
void ViewRootDir(void)
{
        /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
        FRESULT result;
        FATFS fs;
        DIR DirInf;  
        FILINFO FileInf;
       
        uint8_t tmpStr[20];
        uint32_t cnt = 0;
       
        /* 挂载文件系统 */
        result = f_mount(0, &fs);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("FileSystem Mounted Failed (%d) ", result);
        }

        /* 打开根文件夹 */
        result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("Open Root Directory Error (%d) ", result);
                return;
        }

        /* 读取当前文件夹下的文件和目录 */
        printf("Name Tyepe Size ");
        for (cnt = 0; ;cnt++)
        {
                result = f_readdir(&DirInf,&FileInf);                 /* 读取目录项,索引会自动下移 */
                if (result != FR_OK || FileInf.fname[0] == 0)
                {
                        break;
                }
               
                if (FileInf.fname[0] == '.')
                {
                        continue;
                }
                printf("%s ", FileInf.fname);
                if (FileInf.fattrib == AM_DIR)
                {
                        printf("Directory ");
                }
                else
                {
                        printf("File ");
                }
                printf("%d ", FileInf.fsize);
                sprintf((char *)tmpStr, "%d", FileInf.fsize);
        }

        /* 卸载文件系统 */
        f_mount(0, NULL);       
}

/*******************************************************************************
*        函数名:CreateNewFile
*        功  能:在SD卡创建一个新文件,文件内容填写“www.armfly.com
*        输  入: 无
*        输  出: 无
*/
void CreateNewFile(void)
{
        /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
        FRESULT result;
        FATFS fs;
        FIL file;
        DIR DirInf;  
        uint32_t bw;
       
        /* 挂载文件系统 */
        result = f_mount(0, &fs);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("FileSystem Mounted Failed (%d) ", result);
        }

        /* 打开根文件夹 */
        result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("Open Root Directory Error (%d) ", result);
                return;
        }

        /* 打开文件 */
        result = f_open(&file, "armfly.txt", FA_CREATE_ALWAYS | FA_WRITE);
       
        /* 写一串数据 */
        result = f_write(&file, "这里换成转换的数据", 34, &bw);       
        if (result == FR_OK)
       
       
        /* 关闭文件*/
        f_close(&file);
       
        /* 卸载文件系统 */
        f_mount(0, NULL);       
}

/*******************************************************************************
*        函数名:ReadFileData
*        功  能:读取指定文件前128个字符,并打印到串口。
*        输  入: 无
*        输  出: 无
*/
void ReadFileData(void)
{
        /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
        FRESULT result;
        FATFS fs;
        FIL file;
        DIR DirInf;  
        uint32_t bw;
        char buf[128];
       
        /* 挂载文件系统 */
        result = f_mount(0, &fs);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("FileSystem Mounted Failed (%d) ", result);
        }

        /* 打开根文件夹 */
        result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("Open Root Directory Error (%d) ", result);
                return;
        }

        /* 打开文件 */
        result = f_open(&file, "armfly.txt", FA_OPEN_EXISTING | FA_READ);
        if (result !=  FR_OK)
        {
                printf("Don't Find File : armfly.txt ");
                return;               
        }

        /* 读取文件 */
        result = f_read(&file, &buf, sizeof(buf) - 1, &bw);
        if (bw > 0)
        {
                buf[bw] = 0;
                printf(" armfly.txt content : %s ", buf);
        }
        else
        {
                printf(" armfly.txt content : ");               
        }
       
        /* 关闭文件*/
        f_close(&file);
       
        /* 卸载文件系统 */
        f_mount(0, NULL);
}

/*******************************************************************************
*        函数名:CreateDir
*        功  能:在SD卡根目录创建Dir1和Dir2目录,在Dir1目录下创建子目录Dir1_1
*        输  入: 无
*        输  出: 无
*/
void CreateDir(void)
{
        /* 本函数使用的局部变量占用较多,请修改启动文件,保证堆栈空间够用 */
        FRESULT result;
        FATFS fs;
       
        /* 挂载文件系统 */
        result = f_mount(0, &fs);                        /* Mount a logical drive */
        if (result != FR_OK)
        {
                printf("FileSystem Mounted Failed (%d) ", result);
        }

        /* 创建目录/Dir1 */
        result = f_mkdir("/Dir1");
        if (result == FR_OK)
        {
                printf("f_mkdir Dir1 Ok ");
        }
        else if (result == FR_EXIST)
        {
                printf("Dir1 Already exists(%d) ", result);
        }
        else
        {
                printf("f_mkdir Dir1 Error (%d) ", result);
                return;
        }

        /* 创建目录/Dir2 */
        result = f_mkdir("/Dir2");
        if (result == FR_OK)
        {
                printf("f_mkdir Dir2 Ok ");
        }
        else if (result == FR_EXIST)
        {
                printf("Dir2 Already exists(%d) ", result);
        }
        else
        {
                printf("f_mkdir Dir2 Error (%d) ", result);
                return;
        }                       

        /* 创建子目录 /Dir1/Dir1_1           注意:创建子目录Dir1_1时,必须先创建好Dir1 */
        result = f_mkdir("/Dir1/Dir1_1"); /* */
        if (result == FR_OK)
        {
                printf("f_mkdir Dir1_1 Ok ");
        }
        else if (result == FR_EXIST)
        {
                printf("Dir1_1 Already exists(%d) ", result);
        }
        else
        {
                printf("f_mkdir Dir1_1 Error (%d) ", result);
                return;
        }
       
        /* 卸载文件系统 */
        f_mount(0, NULL);       
}

/*******************************************************************************
        函数名:NVIC_Configuration
        输  入:
        输  出:
        功能说明:配置SDIO中断
*/
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
       
        NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

/*******************************************************************************
        函数名:GPIO_Configuration
        输  入:
        输  出:
        功能说明:配置4个LED为输出口线

        LED口线分配:
        LED1 : PF6  (输出0点亮)
        LED2 : PF7  (输出0点亮)
        LED3 : PF8  (输出0点亮)
        LED4 : PF9  (输出0点亮)

*/
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 第1步:打开GPIOA GPIOC GPIOD GPIOF GPIOG的时钟
           注意:这个地方可以一次性全打开
        */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC
                        | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG,
                                ENABLE);

        /* 第2步:配置所有的按键GPIO为浮动输入模式(实际上CPUf复位后就是输入状态) */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);        /* PA0 */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_Init(GPIOC, &GPIO_InitStructure);        /* PC13 */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_Init(GPIOD, &GPIO_InitStructure);        /* PD3 */

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_13
                                          | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOG, &GPIO_InitStructure);        /* PG7,8,13,14,15 */

        /* 第3步:配置所有的LED指示灯GPIO为推挽输出模式 */
        /* 由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮
                这是我不希望的,因此在改变GPIO为输出前,先修改输出寄存器的值为1 */
        GPIO_SetBits(GPIOF,  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOF, &GPIO_InitStructure);
}

/*******************************************************************************
        函数名:InitBoard
        输  入:
        输  出:
        功能说明:初始化硬件设备
*/
static void InitBoard(void)
{
        /*
                这个函数是ST库中的函数,函数实体在
                LibrariesCMSISCoreCM3system_stm32f10x.c

                配置内部Flash接口,初始化PLL,配置系统频率
                系统时钟缺省配置为72MHz,你如果需要更改,则需要去修改相关的头文件中的宏定义
         */
        SystemInit();

        /* 配置按键GPIO和LED GPIO */
        GPIO_Configuration();

        /* 配置串口 */
        USART_Configuration();

        /* 配置systic作为1ms中断,这个函数在
        LibrariesCMSISCoreCM3core_cm3.h */
        SysTick_Config(SystemFrequency / 1000);
       
        /* 配置中断系统 */
        NVIC_Configuration();
}

/*******************************************************************************
        函数名: DispLogo
        输  入:
        输  出:
        功能说明:显示例程Logo (通过串口打印到PC机的超级终端显示)
*/
static void DispLogo(void)
{
        /* 通过串口输出例程名和更新日期 */
        PrintfLogo(EXAMPLE_NAME, EXAMPLE_DATE);
}



















        void RCC_Configuration(void)
{
  /* ADCCLK = PCLK2/4 */
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
   
  /* Enable peripheral clocks ------------------------------------------------*/
  

  /* Enable ADC1, ADC2, ADC3 and GPIOC clocks */
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE);
}

/**
  * @brief  Configures the different GPIO ports.
  * @param  None
  * @retval None
  */



























#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d ", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。