垃圾片子真不能用啊,好的片子一个就行了
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
*/
系统在进入Main函数之前,已经配置好了系统时钟。即在启动文件startup_stm32f10x_hd_vl.s里边,已经调用SystemInit()设置了系统时钟。 找到SystemInit函数,定义如下(代码过长,根据预定义(STM32F10X_HD_VL)删除了不必要的): void SystemInit (void) {/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit 开启内部8MHz振荡器 */
RCC->CR |= (uint32_t)0x00000001;/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
RCC->CFGR &= (uint32_t)0xF0FF0000;//0xF0FF0000;/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset HSEBYP bit */
//位(16)0:HSEON,关闭外部高速时钟HSE
//位(19)0:CSSON,关闭时钟安全系统CSS
//位(24)0:PLLON,关闭PLL
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF; //位(26:24)000:MCO, 没有时钟输出
//位(15:14)00:ADCPRE,PCLK2 2分频后作为ADC时钟频率 ADCCLK=PCLK2/2
//位(13:11)000:PPRE2, HCLK不分频给APB2, PCLK2=HCLK
//位(10:8)000:PPRE1, HCLK不分频给APB1, PCLK1=HCLK
//位(7:4)0000:HPRE, SYSCLK不分频给AHB,HCK=SYSCLK=8Mhz
//位(3:2)00,SWS, HSI作为系统时钟(由硬件置1或清0)
//位(1:0)00,SW, HSI作为系统时钟SYSCLK=8Mhz
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;//禁止所有时钟中断,清中断标志位
//位(23)1:CSSC,清除时钟安全系统中断
//位(20)1:PLLRDYC,清除PLL就绪中断
//位(19)1:HSERDYC,清除HSE就绪中断
//位(18)1:HSIRDYC,清除HSI就绪中断
//位(17)1:LSERDYC,清除LSE就绪中断
//位(16)1:LSIRDYC,清除LSI就绪中断
//位(12)0:PLLRDYIE,PLL就绪中断关闭
//位(11)0:HSERDYIE,HSE...
//位(10)0:HSIRDYIE,
//位( 9)0:LSERDYIE,
//位( 8)0:LSIRDYIE,
//位7-0,写0操作无意义
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;/* 配置系统时钟频率。Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* 配置Flash响应周期,并使能预取指缓存Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock(); #ifdef VECT_TAB_SRAM //向量表在SRAM中定义SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else //向量表在FLASH中定义SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH.*/
#endif }//SystemInit()函数主要流程如下
//1. RCC_CR时钟控制寄存器,第0位置1,开启内部8Mhz高速时钟HSI
//2. 设置SYSCLK=HSI=8Mhz
// HCK=SYSCLK=8Mhz
// PCLK1=HCLK=8Mhz
// PCLK2=HCLK=8Mhz
// ADCCLK=PCLK2/2=4Mhz
// MCO, 没有时钟输出
//3. 关闭HSE外部高速时钟
// 关闭CSS时钟安全系统
// 关闭PLL锁相环
//4. 设置HSE没有被旁路,意思为HSE使用外部晶体,而不是外部时钟源
//5. 复位PLLSRC,PLLXTPRE,PLLMUL,USBPRE,为下一步重新设置新的值做准备
复位后:
PLLSRC=HSI/2, PLL关闭时才可写入
PLLXTPRE=HSE, PLL关闭时才可写入
PLLMUL=2, PLL关闭时才可写入,PLL开启后,PLLMUL的值才有意义,PLL=PLLSRC*PLLMUL
USBPRE=0, USBCLK=PLLCLK/1.5,(PLL被关闭,USBCLK同时失效,外部晶振开启成功后变为72/1.5)
//6. 禁止所有时钟中断,清中断标志位
//然后调用SetSysClockTo72()函数继续执行以下功能
//1. HSE外部高速时钟使能
//2. 使能flash预取缓冲区
// 设置SYSCLK与闪存访问时间的比例
//3. 重新设置HCLK,PCLK2,PCLK1
HCLK = SYSCLK
PCLK2 = HCLK
PCLK1 = HCLK /2
//4. 又一次复位PLLSRC,PLLXTPRE,PLLMUL,
PLLSRC=HSI/2
PLLXTPRE=HSE不分频
PLLMUL=2倍频输出
//5. 重设PLLSRC,PLLMUL
PLLSRC=HSE
PLLMUL=9倍频
//6. 使能PLL(PLLCLK=PLLSRC*PLLMUL,PLLSRC=HSE=8Mhz,PLLMUL=9)
//7. 设置SYSCLK=PLLCLK=72Mhz
/* If none of the define above is enabled, the HSI is used as System clock
source (default after reset) */
} 最后一句的意思是:如果这些参数都没有定义,系统将使用HSI作为系统时钟。这些参数我都没定义,到现在都搞不懂为啥用的内部8MHz时钟还是乱码
//这里定义了一个存储系统时钟频率的变量,利用宏定义给他赋予不同的值
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz; /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
uint32_t SystemCoreClock = HSI_Value; /*!< System Clock Frequency (Core Clock) */
#endif
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else//#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
将 #define HSE_VALUE ((uint32_t)8000000)修改为 #define HSE_VALUE ((uint32_t)12000000)
即设置了外部时钟为12MHz。 修改后,使用串口发送数据,电脑端接受正常。回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |