模拟U盘和FATFS冲突问题——方法二
使用软件: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