大神们好,我是单片机才开始学习个把月的小白一名,现在要实现一个工程,利用STM32F103通过ADC进行传感器的值获取,把获取的结果进行压力值计算,计算后的压力值写入SD卡中的TXT文件里,现在碰到的问题是单独运行ADC和OLED都没有任何问题,OLED能正常显示压力值的变化;单独运行SD卡的文件系统进行文件创建和写入都没问题,我的SD是通过SPI进行连接;但两个系统合并在一起后就出现卡死问题,请教大神帮忙解决下,我是哪里漏了,是否是需要进行ADC的中断,我对C不是很熟悉,值熟悉HTML和PHP与MYSQL,现在接触C就从单片机进行接触,所以里面的赋值可能很不规范!- #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); //计算PRESS_AO压力值
- void Writer_Press_AO(long press_ao,u8 ad_number) //写入SD卡
- {
- 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) //从ADC获取4个端口的值
- {
- 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); //每个端口进行获取ADC值
- sprintf(adc_temp,"AD%d:",i+1); //打印OLED显示字符串
- OLED_ShowString(0,i*16,adc_temp,16); //OLED显示
- OLED_ShowNum(40,i*16,result,4,16);
- OLED_ShowString(80,i*16,"g",16);
- if(result == 8000) //就是这个if调用后就不正常了,注释后OLED正常显示获取的AD值,我想要的是当换算出来的AD值达到8000后,把这个记录写入到SD卡的TXT中
- {
- Writer_Press_AO(result,i); //调用获取的ADC值及端口号传入写入SD卡TXT文件
- }
- OLED_Refresh();
- delay_ms(1000);
- }
-
- }
- }
- long map(long x, long in_min, long in_max, long out_min, long out_max) { //ADC获取电压进行压力值计算
- return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
- }
复制代码 while(1)里面的if语句只要一运行就卡死,OLED也不显示,注释后又正常,请教大神指点一二!!!!
|