欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

模拟U盘和FATFS冲突问题——方法二

程序员文章站 2022-03-07 18:21:37
使用软件:stm32cubemx开发板:野火指南者stm32f103vet6HAL库;STM32Cube FW_F1 V1.8.0方法:(一个笨办法,如果有哪位大佬有好的方法希望能提点提点我)1.按键中断,按键切换模式,用U盘时切换U盘模式。(方法1在这篇博客,写在一篇里太累赘了)2.创建一个数组检测引脚电平,判断此时USB是否连接3.这是我在网上查到的方法,我没有去实现:https://www.cnblogs.com/cage666/p/9219458.html近期使用模拟U盘和向U盘写...

使用软件:stm32cubemx
开发板:野火指南者stm32f103vet6
HAL库;STM32Cube FW_F1 V1.8.0

方法:
(一个笨办法,如果有哪位大佬有好的方法希望能提点提点我)
1.按键中断,按键切换模式,用U盘时切换U盘模式
(方法1在这篇博客,写在一篇里太累赘了)
2.创建一个数组检测引脚电平,判断此时USB是否连接

3.这是我在网上查到的方法,我没有去实现:https://www.cnblogs.com/cage666/p/9219458.html

近期使用模拟U盘和向U盘写数据时发现我想用U盘功能时老是出现错误,发现是因为在插入USB时可能正在往U盘里存储数据,发生了冲突。
模拟U盘和FATFS冲突问题——方法二

方法2

方法一用到了按键,但我要用的情况有没有按键

原本我想这用usb中断来实现的,结果我发现usb中断只能在插上USB时的时候感应到拔掉后就不能感应了,而usb的引脚又不能用外设gpio中断。我想要实现插上usb的时候停止向sd卡写数据,拔掉usb的时候继续写数据是没有办法的。而且我还不想在main函数轮询里加一个太长的延时。(如果靠判断引脚的话,插上usb有4.5秒左右的波动)

先在main函数while循环里,检测一下usb两个引脚的电平变换


int PA12_D=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12);
int PA11_D=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
printf("PA12;%d\t PA11;%d\r\n",PA12_D,PA11_D);
HAL_Delay(100);

这是插上USB模拟U盘和FATFS冲突问题——方法二
这是拔掉usb
模拟U盘和FATFS冲突问题——方法二
从插上USB到拔掉是没有数据波动的
这是从拔掉到插上USB
模拟U盘和FATFS冲突问题——方法二
有较长的数据波动而且10,11,01,00这四种数据都有。

然后我试了一下usb中断,在usb中断里把每种情况里加了一个输出
模拟U盘和FATFS冲突问题——方法二

模拟U盘和FATFS冲突问题——方法二
把usb拔下后
模拟U盘和FATFS冲突问题——方法二
插上USB
模拟U盘和FATFS冲突问题——方法二
模拟U盘和FATFS冲突问题——方法二
好嘛,这种情况想用USB中断就复杂了

然后我就想了一个笨办法

/* USER CODE BEGIN 0 */

int array_PA11[5]={0,0,0,0,0};
int n=0;
/* USER CODE END 0 */
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
//USB_GPIO_Reset();
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SDIO_SD_Init();
  MX_USART1_UART_Init();
  MX_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
		int PA12_D=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12);
		int PA11_D=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_11);
		printf("PA12;%d\t PA11;%d\r\n",PA12_D,PA11_D);
		HAL_Delay(100);
		
		array_PA11[n]=PA11_D;
		if(4==n)
		{
			n=-1;
		}
		n=n+1;
		printf("%d\t%d\t%d\t%d\t%d\r\n",array_PA11[0],array_PA11[1],array_PA11[2],array_PA11[3],array_PA11[4]);
		
		if(array_PA11[0]==1&array_PA11[1]==1&array_PA11[2]==1&array_PA11[3]==1&array_PA11[4]==1)
		{
			printf("写数据模式\r\n");
		}
		else printf("U盘模式");
		
		
		

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

当接入USB时PA11一直为1,未接入时一直为0,记录一个组数据来判断usb是否接入


本文地址:https://blog.csdn.net/borli/article/details/108174005