2900|1

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

刚接触啊,各种不会,求喷。。。 [复制链接]

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

#include
#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)\r\n", result);
        }

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

        /* 读取当前文件夹下的文件和目录 */
        printf("Name\t\t\tTyepe\t\t\tSize\r\n");
        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\t\t", FileInf.fname);
                if (FileInf.fattrib == AM_DIR)
                {
                        printf("Directory\t");
                }
                else
                {
                        printf("File\t\t");
                }
                printf("%d\r\n", 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)\r\n", result);
        }

        /* 打开根文件夹 */
        result = f_opendir(&DirInf, "/"); /* 如果不带参数,则从当前目录开始 */
        if (result != FR_OK)
        {
                printf("Open Root Directory Error (%d)\r\n", 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)\r\n", result);
        }

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

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

        /* 读取文件 */
        result = f_read(&file, &buf, sizeof(buf) - 1, &bw);
        if (bw > 0)
        {
                buf[bw] = 0;
                printf("\r\narmfly.txt content : \r\n%s\r\n", buf);
        }
        else
        {
                printf("\r\narmfly.txt content : \r\n");               
        }
       
        /* 关闭文件*/
        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)\r\n", result);
        }

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

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

        /* 创建子目录 /Dir1/Dir1_1           注意:创建子目录Dir1_1时,必须先创建好Dir1 */
        result = f_mkdir("/Dir1/Dir1_1"); /* */
        if (result == FR_OK)
        {
                printf("f_mkdir Dir1_1 Ok\r\n");
        }
        else if (result == FR_EXIST)
        {
                printf("Dir1_1 Already exists(%d)\r\n", result);
        }
        else
        {
                printf("f_mkdir Dir1_1 Error (%d)\r\n", 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库中的函数,函数实体在
                Libraries\CMSIS\Core\CM3\system_stm32f10x.c

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

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

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

        /* 配置systic作为1ms中断,这个函数在
        \Libraries\CMSIS\Core\CM3\core_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\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
此帖出自stm32/stm8论坛

最新回复

俺也在搞这个,和你的差不多  详情 回复 发表于 2012-9-18 09:52
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
俺也在搞这个,和你的差不多
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表