当前位置: 移动技术网 > IT编程>网页制作>HTML > 模拟U盘和FATFS冲突问题——方法二

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

2020年08月01日  | 移动技术网IT编程  | 我要评论
使用软件: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盘里存储数据,发生了冲突。
在这里插入图片描述

方法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在这里插入图片描述
这是拔掉usb
在这里插入图片描述
从插上USB到拔掉是没有数据波动的
这是从拔掉到插上USB
在这里插入图片描述
有较长的数据波动而且10,11,01,00这四种数据都有。

然后我试了一下usb中断,在usb中断里把每种情况里加了一个输出
在这里插入图片描述

在这里插入图片描述
把usb拔下后
在这里插入图片描述
插上USB
在这里插入图片描述
在这里插入图片描述
好嘛,这种情况想用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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网