历史上的今天
今天是:2025年03月18日(星期二)
2019年03月18日 | STM32F4时钟配置
2019-03-18 来源:eefocus
看了下时钟树按照http://blog.csdn.net/louyangyang91/article/details/51374924这个博文配置了,结果发现UART波特率不对,但是MOC1\2都是正常输出(168M/5分频输出),蒙了很久才发现 USART_Init(USART1, &USART_InitStructure); 这个函数内部会调用RCC_GetClocksFreq(&RCC_ClocksStatus);这个函数来得到PCLK1\PCLK2等系统时钟,进入这个函数看其内部发现它调用了一个HSE_VALUE的宏定义,继续定位发现居然是
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
8M的频率。果断改成我使用的外部晶振12M,然后配置PLL系统时钟168M,再看UART波特率对了。问题解决、、、、
的void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
/* Get SYSCLK source -------------------------------------------------------*/
tmp = RCC->CFGR & RCC_CFGR_SWS;
switch (tmp)
{
case 0x00: /* HSI used as system clock source */
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
case 0x04: /* HSE used as system clock source */
RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
break;
case 0x08: /* PLL used as system clock source */
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
SYSCLK = PLL_VCO / PLLP
*/
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
if (pllsource != 0)
{
/* HSE used as PLL clock source */
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
else
{
/* HSI used as PLL clock source */
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
}
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
break;
default:
RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
break;
}
/* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/
/* Get HCLK prescaler */
tmp = RCC->CFGR & RCC_CFGR_HPRE;
tmp = tmp >> 4;
presc = APBAHBPrescTable[tmp];
/* HCLK clock frequency */
RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;
/* Get PCLK1 prescaler */
tmp = RCC->CFGR & RCC_CFGR_PPRE1;
tmp = tmp >> 10;
presc = APBAHBPrescTable[tmp];
/* PCLK1 clock frequency */
RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
/* Get PCLK2 prescaler */
tmp = RCC->CFGR & RCC_CFGR_PPRE2;
tmp = tmp >> 13;
presc = APBAHBPrescTable[tmp];
/* PCLK2 clock frequency */
RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
}
下面贴出时钟配置代码:
void SetSysClockProc(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div4);
RCC_PCLK2Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_5);
FLASH_PrefetchBufferCmd(ENABLE);
//RCC_ADCCLKConfig(RCC_PCLK2_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE,12,336,2,7);//168M
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
// while(RCC_GetSYSCLKSource()!=0x08)
// {
// }
}
}
史海拾趣
|
我们最近要做一个计算机系统结构的实验箱,我不知从何入手。 实验箱主要是这样的, 核心FPGA板 留给用户设计各种cpu , 比如 流水cpu 超标量cpu 等,也就是用来给学生自己开发cpu。 我要做的就是做一个控制部分的电路设计。可以 控制 ...… 查看全部问答> |
|
我在工程的Header Files里添加了miracl.h和mirdef.h两个头文件,还添加了ms32.lib文件,但在编程中使用otnum()等等miracl库中的函数时仍提示错误。 Repw.obj : error LNK2019: unresolved external symbol \"int __cdecl otnum(struct bigtype *,v ...… 查看全部问答> |
|
小弟由于想转入到嵌入式开发的领域中来,所以需要一些最基本的了解,以便有一个更清晰的学习开端,请多多指教: 问题1:在网上查了下嵌入式开发的理解,但越看越晕,一会儿是嵌入式开发,一会儿是linux嵌入 ...… 查看全部问答> |
|
蓝牙新手,想请教下 void DunInit(Task theAppTask, dun_device_type type_of_device, uint16 RI, uint16 DTR, uint16 DCD, uint16 DSR, uint16 priority); 这个DUN初始化函数的参数该如何设定 附上dun.h中的函数说明: /*! &n ...… 查看全部问答> |
|
(1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT。(2)当进入中断程序时,只要不在中断中再次开中断,刚总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行。(3)若在中断A中开了总中断,刚可以响应 ...… 查看全部问答> |
|
module moto_test(clock,key,duty_cycle,pwm_en,pwm_in,motoa,motob,led); input clock; //系统时钟(48MHz) input[2:0] ...… 查看全部问答> |




