标题:
STM32+AD7606芯片源代码
[打印本页]
作者:
1369067587
时间:
2020-7-10 14:35
标题:
STM32+AD7606芯片源代码
基于STN32F407的AD7606芯片ADC采样例程,使用FSMC接口
单片机源程序如下:
#include "bsp.h" /* 如果要用ST的固件库,必须包含这个文件 */
/* 定义例程名和例程发布日期 */
#define EXAMPLE_NAME "F4-029_AD7606模块例程"
#define EXAMPLE_DATE "02-01"
#define DEMO_VER "1.0"
/* 仅允许本文件内调用的函数声明 */
static void PrintfLogo(void);
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参:无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
uint8_t ucKeyCode;
uint8_t ucRefresh = 0;
uint8_t ucFifoMode;
/*
由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
系统时钟缺省配置为72MHz,如果需要更改,可以修改:
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
中配置系统时钟的宏。
*/
bsp_Init();
PrintfLogo(); /* 打印例程Logo到串口1 */
ucFifoMode = 0; /* AD7606进入普通工作模式 */
bsp_InitAD7606(); /* 配置AD7606所用的GPIO */
AD7606_SetOS(AD_OS_NO); /* 无过采样 */
AD7606_SetInputRange(0); /* 0表示输入量程为正负5V, 1表示正负10V */
bsp_StartAutoTimer(0, 500); /* 启动1个200ms的自动重装的定时器 */
AD7606_StartConvst(); /* 启动1次转换 */
ucRefresh = 0;
while (1)
{
CPU_IDLE(); /* 这个宏在bsp_timer.h 中定义,目前定义为空。用户可以修改这个宏实现CPU休眠和喂狗 */
if (ucRefresh == 1)
{
ucRefresh = 0;
/* 打印ADC采样结果 */
printf("Range = %d, OS = %d, ", g_tAD7606.ucRange, g_tAD7606.ucOS);
printf("CH1 = %6d, CH2 = %6d, CH3 = %6d, CH4 = %6d, ",
g_tAD7606.sNowAdc[0], g_tAD7606.sNowAdc[1], g_tAD7606.sNowAdc[2], g_tAD7606.sNowAdc[3]);
printf("CH5 = %6d, CH6 = %6d, CH7 = %6d, CH8 = %6d\r",
g_tAD7606.sNowAdc[4], g_tAD7606.sNowAdc[5], g_tAD7606.sNowAdc[6], g_tAD7606.sNowAdc[7]);
}
if (ucFifoMode == 0) /* AD7606 普通工作模式 */
{
if (bsp_CheckTimer(0))
{
/* 每隔500ms 进来一次. 由软件启动转换 */
AD7606_ReadNowAdc(); /* 读取采样结果 */
AD7606_StartConvst(); /* 启动下次转换 */
ucRefresh = 1; /* 刷新显示 */
}
}
else
{
/*
在FIFO工作模式,bsp_AD7606自动进行采集,数据存储在FIFO缓冲区。
结果可以通过下面的函数读取:
uint8_t AD7606_ReadFifo(uint16_t *_usReadAdc)
你可以将数据保存到SD卡,或者保存到外部SRAM。
本例未对FIFO中的数据进行处理,进行打印当前最新的样本值。
如果主程序不能及时读取FIFO数据,那么 AD7606_FifoFull() 将返回真。
8通道200K采样时,数据传输率 = 200 000 * 2 * 8 = 3.2MB/S
*/
if (bsp_CheckTimer(0))
{
ucRefresh = 1; /* 刷新显示 */
}
}
/* 按键检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。这个函数不会
等待按键按下,这样我们可以在while循环内做其他的事情 */
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
/*
对于按键弹起事件,缺省的bsp_button.c 仅检测了TAMPER、WAKEUP、USER键、摇杆OK键的弹起事件
如果您的应用程序需要其它键(比如方向键)的弹起事件,您需要简单修改一下bsp_button.c文件
*/
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* K1键按下 切换量程 */
if (g_tAD7606.ucRange == 0)
{
AD7606_SetInputRange(1);
}
else
{
AD7606_SetInputRange(0);
}
ucRefresh = 1;
break;
case KEY_DOWN_K2: /* K2键按下 */
ucFifoMode = 1; /* AD7606进入FIFO工作模式 */
printf("\r\nAD7606进入FIFO工作模式 (200KHz 8通道同步采集)...\r\n");
AD7606_StartRecord(200000); /* 启动200kHz采样速率 */
break;
case KEY_DOWN_K3: /* K3键按下 */
AD7606_StopRecord(); /* 停止记录 */
ucFifoMode = 0; /* AD7606进入普通工作模式 */
printf("\r\nAD7606进入普通工作模式(0.5秒定时采集)...\r\n");
break;
case JOY_DOWN_U: /* 摇杆UP键按下 */
if (g_tAD7606.ucOS < 6)
{
g_tAD7606.ucOS++;
}
ucRefresh = 1;
break;
case JOY_DOWN_D: /* 摇杆DOWN键按下 */
if (g_tAD7606.ucOS > 0)
{
g_tAD7606.ucOS--;
}
ucRefresh = 1;
break;
case JOY_DOWN_L: /* 摇杆LEFT键按下 */
break;
case JOY_DOWN_R: /* 摇杆RIGHT键按下 */
break;
case JOY_DOWN_OK: /* 摇杆OK键按下 */
break;
default:
/* 其他的键值不处理 */
break;
}
}
}
}
/*
*********************************************************************************************************
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
AD7606_FSMC FSMC例程(STM32F407).7z
(1.91 MB, 下载次数: 62)
2020-7-10 15:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1