用户登录
用户注册

分享至

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

  • 作者: 花样撸世界重量级冠军
  • 来源: 51数据库
  • 2021-08-26

使用软件: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是否接入


软件
前端设计
程序设计
Java相关