打印
[STM32F2]

stm32f207用stm32cube生成usb mass storage class无法识别

[复制链接]
4186|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
240011814|  楼主 | 2015-12-24 15:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
如题,我电路DP接了个上拉电阻,pc识别到未知设备,去掉后pc完全没反应
我用stm32cube生成的usb下载到另一块stm32f072板子可以正常识别,那块板子未接上拉电阻,晶振是内部晶振
我的stm32f207是外部25m晶振,晶振并了个100k电阻和10pf电容
沙发
s_f_tan| | 2015-12-24 16:23 | 只看该作者
时钟配置对了没有?USB的要配成48M吧,你用外部时钟25M,如何配出来?

使用特权

评论回复
板凳
240011814|  楼主 | 2015-12-24 17:15 | 只看该作者
我用这函数 HAL_RCC_GetSysClockFreq();读出来 sysclock 120m

捕获.PNG (115.01 KB )

捕获.PNG

使用特权

评论回复
地板
mintspring| | 2015-12-24 21:06 | 只看该作者
Pinout界面中修改:
开启USB_OTG_FS模式下的Device_Only,其他不选
middleWare里面的USB_DEVICE中的Class For FS IP选择Communication Device Class (Virtual Port Com)
时钟配置界面:8M外部晶振,设置系统168M,Apb1分频4,APB2分频2
Configuration界面中:
GPIO设置PD12,13,14,15输出上拉,中速


usb的GPIO的DM和DP均为AF,DM无上啦,DP上拉,高速模式(High)

开启中断优先组GRoup4
NVIC中断开启usb on the Go FS Global interrupt 中断1,0
USB_FS configuration 设置 speed为Full , ENDpoint 0 max packet size为64bytes
低功耗不使能, vbus不使能.....
usb_device configuration中的Parameter setting设置



ok,生成代码



使用特权

评论回复
5
mintspring| | 2015-12-24 21:07 | 只看该作者
PIO方面的配置图



使用特权

评论回复
6
mintspring| | 2015-12-24 21:08 | 只看该作者
生成之后,我用的事keil 编译的, 要去修改启动文件里面一个代码
打开工程的启动文件 startup_stm32f407xx.s
将里面的 Heap_Size EQU 0x00000200
改成 Heap_Size EQU 0x00001000
或者改成Heap_Size EQU 0x00001500
其中1500是官方那个演示程序的设置.

再次打开main.c文件
添加头文件
include "usbd_cdc.h"算了直接上main.c里面的全部代码,其他的文件都不用修改
/* Includes ------------------------------------------------------------------*/
include "stm32f4xx_hal.h"

include "usb_device.h"

include "gpio.h"

/* USER CODE BEGIN Includes */
include "usbd_cdc.h"

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
uint16_t mmss;

/* USER CODE END 0 */

int main(void)
{

/* USER CODE BEGIN 1 */
uint8_t UserTxBuffer55 = 0x55;
/* USER CODE END 1 */

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

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

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

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();

/* USER CODE BEGIN 2 */

/* USER CODE END 2 */

/* USER CODE BEGIN 3 */
/* Infinite loop */
while (1)
{
    if(mmss>=500)
    {
    HAL_GPIO_TogglePin (GPIOD,GPIO_PIN_12);

    USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t*)&UserTxBuffer55, 1);

USBD_CDC_TransmitPacket(&hUsbDeviceFS);

    mmss = 0;

    }

}
/* USER CODE END 3 */

}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

__PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
                          |RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

}

/* USER CODE BEGIN 4 */
void HAL_SYSTICK_Callback(void)
{
/* NOTE : This function Should not be modified, when the callback is needed,
        the HAL_SYSTICK_Callback could be implemented in the user file
*/
mmss++;
}
/* USER CODE END 4 */
ifdef USE_FULL_ASSERT

/**
* [url=home.php?mod=space&uid=247401]@brief[/url] Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */

}
endif

好了,编译烧录,打开串口调试助手
额,先上图







注意啊,串口调试助手里面,只需要选择相应的串口就可以了......其他的什么波特率啊,位数啊,都没用的.......... 咱是usb虚拟的,没定义这个....不信你可以自己试试

使用特权

评论回复
7
mintspring| | 2015-12-24 21:09 | 只看该作者
下面测试接收数据.要添加个东西...
打开usbd_cdc_if.c文件里面的倒数第二个函数
改为
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len){/* USER CODE BEGIN 7 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, (uint8_t *)&UserRxBufferFS);USBD_CDC_ReceivePacket(&hUsbDeviceFS);    return (USBD_OK);/* USER CODE END 7 */ }
不改的话,接收一次数据可以,第二次串口调试助手就会死机..............
我main函数中这样写
while (1){    if(addtime >=500)    {        addtime = 0;        HAL_GPIO_TogglePin (GPIOD,GPIO_PIN_12);//          UsbSendData (&datausb ,1);        CDC_Transmit_FS(UserRxBufferFS ,7);    }}
每次500ms发送一次接收到的数据回去....
我每次发送接收到的头7个数据...



图中,我发送16进制数 55 44 两个字节......
返回的是16进制数 55 44 C1 2C 60 18 7C 七个字节.....
这是我随便发送后,再次发送55 44两个字节的结果...
数据没清零.......说明程序还是有问题.........


使用特权

评论回复
8
mintspring| | 2015-12-24 21:09 | 只看该作者
说明程序还是有问题.........那个楼主也是个半罐子。

使用特权

评论回复
9
240011814|  楼主 | 2015-12-25 18:27 | 只看该作者
是堆栈分配少了,另一块板子可以。。。。。

使用特权

评论回复
10
Thor9| | 2015-12-26 19:32 | 只看该作者
晶振并了个100k电阻和10pf电容

晶振并电阻干啥,不是两个电容吗

使用特权

评论回复
11
豆腐块| | 2015-12-27 21:55 | 只看该作者
是怎么查出来堆栈分配少的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

70

帖子

3

粉丝