标题:
STM32F103用ADC获取了数值写入SD遇到问题,求教
[打印本页]
作者:
antengly010
时间:
2022-2-3 00:28
标题:
STM32F103用ADC获取了数值写入SD遇到问题,求教
大神老师好,我要弄个ADC获取传感器的数值,然后写入到SD卡里,现在郁闷,单独运行ADC可以成功获取,单独运行SD卡可以运行写入数据,但合在一起就开始卡死,直接没反应,小白一名,刚开始学习单片机,是少了步骤还是哪里问题。求教!!!
#include "system.h"
#include "SysTick.h"
#include "usart.h"
#include "adc.h"
#include "oled.h"
#include "bmp.h"
#include "ff.h"
#include "bsp_spi_sdcard.h"
#include "stdio.h"
FATFS fs; /* FatFs文件系统对象 */
FIL fnew; /* 文件对象 */
UINT fnum;
FRESULT res_flash; /* 文件操作结果 */
#define PRESS_MIN 20
#define PRESS_MAX 8000
//压力范围设定
#define VOLTAGE_MIN 100
#define VOLTAGE_MAX 3300
//电压范围设定
u8 state = 0;
u16 val = 0;
u16 value_AD = 0;
u8 buf[10];
long PRESS_AO = 0;
int VOLTAGE_AO = 0;
long map(long x, long in_min, long in_max, long out_min, long out_max);
void Writer_Press_AO(long press_ao,u8 ad_number)
{
u32 time_get_temp;
char filename[20];
char writerbuff[40];
res_flash = f_mount(&fs,"0:",1);
if(res_flash == FR_OK)
{
printf("》初始化成功。\r\n");
}
else
{
printf("》初始化失败。错误号:%d\r\n",res_flash);
}
time_get_temp = get_fattime();
printf("》时间戳:%d\r\n",time_get_temp);
sprintf(filename,"0:date%d.txt",time_get_temp);
printf("》文件名:%s\r\n",filename);
res_flash = f_open(&fnew,filename,FA_OPEN_ALWAYS | FA_WRITE );
if(res_flash == FR_OK)
{
printf("》打开文件成功。\r\n");
}
else
{
printf("》打开文件错误。错误号:%d\r\n",res_flash);
}
f_lseek(&fnew, f_size(&fnew));
sprintf(writerbuff,"time:%d ad:%d press_ao:%ld\r\n",time_get_temp,ad_number,press_ao);
printf("》记录值,时间:%d,端口%d:,压力值:%d\r\n",time_get_temp,ad_number,press_ao);
if ( res_flash == FR_OK )
{
printf("》打开/创建文件成功,向文件写入数据。\r\n");
res_flash=f_write(&fnew,writerbuff,sizeof(writerbuff),&fnum);
if(res_flash==FR_OK)
{
printf("》文件写入成功,写入字节数据:%d\n",fnum);
printf("》向文件写入的数据为:\r\n%s\r\n",writerbuff);
}
else
{
printf("》!!文件写入失败:(%d)\r\n",res_flash);
}
}
f_close(&fnew);
f_mount(NULL,"0:",1);
}
long Get_Adc_Press_Ao(u8 adc_port)
{
value_AD = Get_Adc_Average(adc_port,10); //10次平均值
VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300);
if(VOLTAGE_AO < VOLTAGE_MIN)
{
PRESS_AO = 0;
}
else if(VOLTAGE_AO > VOLTAGE_MAX)
{
PRESS_AO = PRESS_MAX;
}
else
{
PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX);
}
return PRESS_AO;
}
int main()
{
u8 i;
long result;
u32 time_get_temp;
char filename[20];
char writerbuff[40];
char* adc_temp;
SysTick_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
USART1_Init(9600);
Adc_Init();
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(1);//0正常显示 1 屏幕翻转显示
OLED_Refresh();
delay_ms(1000);
OLED_ShowChinese(9,14,0,16);
OLED_ShowChinese(27,14,1,16);
OLED_ShowChinese(45,14,2,16);
OLED_ShowChinese(63,14,3,16);
OLED_ShowChinese(81,14,4,16);
OLED_ShowChinese(99,14,5,16);
OLED_ShowChinese(9,36,6,16);
OLED_ShowChinese(27,36,7,16);
OLED_ShowChinese(45,36,8,16);
OLED_ShowChinese(63,36,9,16);
OLED_ShowChinese(81,36,10,16);
OLED_ShowChinese(99,36,11,16);
OLED_Refresh();
delay_ms(1000);
delay_ms(1000);
OLED_Clear();
while(1)
{
for(i=0;i<4;i++)
{
result = Get_Adc_Press_Ao(i);
sprintf(adc_temp,"AD%d:",i+1);
OLED_ShowString(0,i*16,adc_temp,16);
OLED_ShowNum(40,i*16,result,4,16);
OLED_ShowString(80,i*16,"g",16);
<span style="background-color: lemonchiffon;"> if(result == 8000) //就是这个if调用后就不正常了,注释后OLED正常显示获取的AD值,我想要的是当换算出来的AD值达到8000后,把这个记录写入到SD卡的TXT中
{
Writer_Press_AO(result,i);
}</span>
OLED_Refresh();
delay_ms(1000);
}
}
}
long map(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
复制代码
求教!!!标黄了这个if语句,注释后OLED就能正常显示运行,有这个就卡死,单独运行SD写入程序也是正常,求教了
作者:
antengly010
时间:
2022-2-4 02:54
谢谢各位老师,事情自己解决了,但又碰到点小问题,不知道要怎么处理,还没想好怎么形容我想要的东西,等着总结好了咨询
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1