任务由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
此帖出自
小平头技术问答
一周热门 更多>