stm32f103c8t6例程的usb接口为什么经常烧坏

之前在stm32f107上面整过can,这次换了一个芯片,是STM32F103C8T6,48引脚封装的,把之前的107的程序移植过来的时候
不好使,无奈得重新配置,这次清楚的stm32的时钟和can的波特率学习了一遍,
先介绍板子硬件资源:
HSE时钟:8MHz;
MCU :&STM32F103C8T6
CAN:一路;(注意:没有端口映射,使用PA11(can接收),PA12(can发送));
一、时钟配置
首先看看系统初始化时的时钟配置(使用的HSE时钟,只讲解从HSE时钟源到CAN时钟线路上的配置)
先看初始化代码中部分:
1 ; Reset handler
2 Reset_Handler
Reset_Handler
SystemInit
R0, =SystemInit
R0, =__main
清楚的看到,在进入main函数之前,系统显示进入&SystemInit() 函数,进到这里看看;
1 void SystemInit (void)
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC-&CR |= (uint32_t)0x;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
8 #ifndef STM32F10X_CL
RCC-&CFGR &= (uint32_t)0xF8FF0000;
RCC-&CFGR &= (uint32_t)0xF0FF0000;
12 #endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC-&CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC-&CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC-&CFGR &= (uint32_t)0xFF80FFFF;
23 #ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC-&CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits
RCC-&CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC-&CFGR2 = 0x;
32 #elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
/* Disable all interrupts and clear pending bits
RCC-&CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC-&CFGR2 = 0x;
/* Disable all interrupts and clear pending bits
RCC-&CIR = 0x009F0000;
41 #endif /* STM32F10X_CL */
43 #if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)
#ifdef DATA_IN_ExtSRAM
SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
53 #ifdef VECT_TAB_SRAM
SCB-&VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
SCB-&VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
面前一系列的RCC寄存器的初始化,还有一些条件编译选项,那些都是无关紧要的,对寄存器的初始化,
还有就是根据mcu的型号选择不同的编译; 到最后那里调用了&SetSysClock() 函数,
我们在进入到这个函数里看看,代码:
1 static void SetSysClock(void)
3 #ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
5 #elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
7 #elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
9 #elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
11 #elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
13 #elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
又是一些条件编译,没事,因为之前之前宏定义的是&
#define SYSCLK_FREQ_72MHz
所以程序进入到&SetSysClockTo72 函数中,看看这个函数里面:
Sets System clock frequency to 72MHz and configure HCLK, PCLK2
and PCLK1 prescalers.
This function should be used only after reset.
* @retval None
8 static void SetSysClockTo72(void)
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/* Enable HSE */
RCC-&CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
HSEStatus = RCC-&CR & RCC_CR_HSERDY;
StartUpCounter++; //HSE_STARTUP_TIMEOUT重拾计数,系统便不适用PLL,而使用内部8MHz晶振
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC-&CR & RCC_CR_HSERDY) != RESET)
HSEStatus = (uint32_t)0x01;
HSEStatus = (uint32_t)0x00;
if (HSEStatus == (uint32_t)0x01)
/* Enable Prefetch Buffer */
FLASH-&ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH-&ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH-&ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/* HCLK = SYSCLK */
RCC-&CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC-&CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC-&CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
//APB1分频系数:2
51 #ifdef STM32F10X_CL
/* Configure PLLs ------------------------------------------------------*/
/* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
/* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */
RCC-&CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
RCC-&CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
/* Enable PLL2 */
RCC-&CR |= RCC_CR_PLL2ON;
/* Wait till PLL2 is ready */
while((RCC-&CR & RCC_CR_PLL2RDY) == 0)
/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
RCC-&CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
RCC_CFGR_PLLMULL9);
PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC-&CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
//PLL倍频系数:9
78 #endif /* STM32F10X_CL */
/* Enable PLL */
RCC-&CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC-&CR & RCC_CR_PLLRDY) == 0)
/* Select PLL as system clock source */
RCC-&CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC-&CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC-&CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
StartUpCounter = 0x;
HSEStatus = 0x;
又是一些条件编译,不用在乎,结合mcu手册,关键的两行代码:
/* PCLK1 = HCLK */
RCC-&CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
//APB1分频系数:2
RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
//PLL倍频系数:9
程序注释写得很明白,can使用的时钟是AHB低速APB1上的时钟,这里配置分频系数是 2 ; 时钟源是PLL提供
在往上一级时钟就是PLL时钟,PLL时钟倍频系数是 9 ;作为APB1的输入时钟源
HSE也就是外部接入的 8MHz 的晶振,作为PLL的输入时钟源,
总结一下时钟的流向:
& & & & HSE (8 MHz) -------& PLL倍频 (9 倍 = 72 MHz) ---------& APB1分频 (1/2 倍 = 36MHz) ------& can工作时钟 = 36 MHz&
二、can波特率配置
上面已经讲了,can工作的时钟是 : 36 MHz,清楚了这个以后,结合mcu手册,进行can波特率的设置,就从代码的角度讲解,看can波特率设置代码段:
CAN_InitStructure.CAN_SJW=CAN_SJW_1
CAN_InitStructure.CAN_BS1=CAN_BS1_3 CAN_InitStructure.CAN_BS2=CAN_BS2_2 CAN_InitStructure.CAN_Prescaler=60;
专用词汇名称在这里就不多讲解了,现在给出个公式: 8 (晶振) x 9 (PLL倍频) / 2 (APB1分频) / 60 / (1 + 3 + 2) = 0.1 = 100 (K)
得到can的通信波特率 100 K;
就套用这个公司,关键是得到can的时钟源,也就是第一里讲的内容,
(以上只是个人的理解,没有很详细的写出来,希望大家多多批评) & & &&
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &craigtao & &日
阅读(...) 评论()虚拟串口VCD就可以,代码,MCU端的看USB 固件库,PC端的,看Flashloader的二次开发包代码,在Flashloader的安装目录下可以找到源代码。
UID1246864&帖子7&精华0&积分50&资产50 信元&发贴收入65 信元&推广收入0 信元&附件收入0 信元&下载支出195 信元&阅读权限10&在线时间0 小时&注册时间&最后登录&
用虚拟串口类,MCU端代码参考USB固件库,例程里面有源代码。PC端的参考Flashloader,安装目录下有VC6++的源代码工程
UID1246864&帖子7&精华0&积分50&资产50 信元&发贴收入65 信元&推广收入0 信元&附件收入0 信元&下载支出195 信元&阅读权限10&在线时间0 小时&注册时间&最后登录&
用虚拟串口类,MCU端代码参考USB固件库,例程里面有源代码。PC端的参考Flashloader,安装目录下有VC6++的源代码工程
UID952&帖子146&精华0&积分3706&资产3706 信元&发贴收入815 信元&推广收入0 信元&附件收入750 信元&下载支出3240 信元&阅读权限50&在线时间259 小时&注册时间&最后登录&
请问该怎么联系你呢?我这边有具体的问题想问一下,谢谢!
UID823598&帖子553&精华0&积分372&资产372 信元&发贴收入3935 信元&推广收入0 信元&附件收入8 信元&下载支出3917 信元&阅读权限20&在线时间191 小时&注册时间&最后登录&
[通过 QQ、MSN 分享给朋友]
欢迎访问 TI SLL(信号链)专区后使用快捷导航没有帐号?
查看: 7803|回复: 13
关于stm32f103c8t6usb和can引脚复用问题!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
默认的情况下,usb和can引脚是复用的,不能同时使用,如果不采用remap引脚,
usb和can优先级别哪个高?
&&&&&&&&&&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&不明白你的问题,请说详细点。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
多谢坛主回复!
仔细看了手册,
默认的情况下,usb和can引脚是复用的.
PA11脚可以作为
CANRX/ USBDM;
PA12脚可以作为
CANTX /USBDP
看手册好象USBDM和USBDP只能固定在这两个引脚的!
而CANTX ,CANRX可以另外分配!
所以usb的优先级高!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&晕,这怎么能叫优先级?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
手册上有一句话:
USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送和接收%
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
手册上有一句话:
USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送和接收,因此不可同时使用USB和CAN(共享的SRAM被USB和CAN模块互斥地访问)。USB和CAN可以同时用于一个应用中, 但不能在同一个时间使用。
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
感谢airwill回复!
我上边说的只是硬件引脚分配问题.stm32f103c8t6只有48脚,许多引脚都是复用的!
要使用usb通信只能在PA11脚和
而使用can通信,除此之外还可以在其它四个引脚上!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
USB和CAN共用数据发送和接收存储空间大小是512字节?
这个空间也太小了!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
如果同时使用USB和CAN通信,PA11脚和
PA12脚只能优先分给USB,不知道说清楚了吗?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
看来用stm32f103c8t6做usb转can设备行不通了!
难怪会引脚和存储空间复用!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&感谢airwill回复!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
& & & & & & & & & & & & & & & &&&鱼和熊掌不能兼得.
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
st为啥不把stm32f103 系列USB,CAN通信的共用数据发送和接收存储空间分开呢?
总共才512字节, 64脚,100脚,144脚都如此!
另外再增加512字节空间对st来说很容易的!
设计有缺陷,真遗憾!
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
所以说默认情况下是用usb模式喽?所以说我不使用映射的话,不能用can了?
Powered by
逛了这许久,何不进去瞧瞧?stm32单片机ISP烧写
使用STM32常用到的问题
一般学生比较少遇到,但开始工作,进行软件开发时,会遇到各种“匪夷所思”的问题不过,慢慢积累就能对硬件、软件有一定了解,能让你很快的精通!
在使用stm32f103系列的mcu时,当时还在学校的时候用的jtag(盗版)烧写,对烧写引脚没有那么关注(反正能烧写就行)但是到了企业工作后,发现一般只使用4个引脚烧写——就是所谓的SWD模式只需要4根引脚(VCC、GND、SWCLK、SWDATA)之所以只留四个接口是因为可以将芯片做的更小,设备更小!并且有时候mcu的JTAG调试接口会被当成普通IO口来使用,因此就需要使用管脚复用功能,一旦复用,就要小心!!!当你把烧写接口复用后,能写进去,但是就不能再烧写了!
因此步入主题——ISP烧写
使用的软件——Flymcu(下载地址 )
使用前准备:Boot0与Boot1了解
参看 参考手册——Reference Manual
程序员是将代码写进flash中,因此,一般情况下是使用BOOT0 = 0(就是接地模式)
那么第二种情况是用在什么情况下?
就是我们的ISP模式了,芯片出厂时内置了一片BootLoader来使用串口1下载(用户不可擦除!)
第三种是在Sram模式下(Sram为易失性随机存储器,可用于调试,但一般不使用)
因此我们只需要关注两种模式
1、boot0 =
2、boot0 = 1
&& boot1 = 0
使用ISP烧写时用的第2种模式!
1、首先插入usb转串口(或者能与mcu连接的串口)
接线:使用stm32的串口1,也就是PA9与PA10这两个口,TX
连接 RX RX 连接TX,然后共地。
2、打开FlyMcu,如下界面:首先点击清除芯片,之后再上电!这样就能清除写入的芯片数据了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 stm32f103c8t6封装库 的文章

 

随机推荐