当前位置: 首页 > news >正文

网站资料筹备哪家网站推广好

网站资料筹备,哪家网站推广好,石家庄常规网站建设私人定做,闸北区网站建设网页制作MCU: STM32F407VET6 官方最高稳定频率#xff1a;168MHz 工具#xff1a;STM32CubeMX 本篇仅仅只是提供超频#xff08;默认指的是主频#xff09;的简单方法#xff0c;并未涉及STM32超频极限等问题。原理很简单#xff0c;通过设置锁相环的倍频系数达到不同的频率168MHz 工具STM32CubeMX 本篇仅仅只是提供超频默认指的是主频的简单方法并未涉及STM32超频极限等问题。原理很简单通过设置锁相环的倍频系数达到不同的频率从而实现超频。需要注意的是运行时切换频率不能直接修改因为此时用的HSE时钟是经由锁相环产生的直接修改锁相环会出现问题。解决办法是切换为HSI并关闭锁相环然后重新配置锁相环最后再重新切换HSE。         最后切记超频有风险 一、时钟配置         使用STM32CubeMX可以很方便地配置时钟树配置时钟树时需要先知道开发板所用的外部晶振频率。从下图可知晓使用的外部晶振为12MHz 然后经由STM32CubeMX自动配置时钟树从这里可以看到锁相环里能看到M、N、P三个参数其中N是倍频系数最高可达432。这里我们目标是配置为168MHz即官方标称频率         使用STM32CubeMX生成代码后我们可以在Core/Src目录下找到main.c中的SystemClock_Config函数。从代码中可以轻易看到PLLM、PLLN、PLLP就是前面看到的M、N、P三个参数。同时由于外部晶振频率为12MHz自动配置过程中M和P分频系数分别为6和2恰好可以把12MHz分频为1MHz使得倍频系数即为主频频率MHz。         后面超频时利用的就是下面代码。 void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct {0};RCC_ClkInitTypeDef RCC_ClkInitStruct {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/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 6;RCC_OscInitStruct.PLL.PLLN 168;RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ 4;if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|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;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_5) ! HAL_OK){Error_Handler();} }二、超频          根据前面所言运行时直接修改所用的时钟会发生错误所以需要切换时钟源后再修改。下面两个函数用于切换时钟源 void SystemClock_SwitchToHSI(void) {// 将系统时钟切换到 HSI__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_HSI);// 等待时钟切换完成while (__HAL_RCC_GET_SYSCLK_SOURCE() ! RCC_SYSCLKSOURCE_STATUS_HSI) {} }void SystemClock_SwitchToPLL(void) {// 将系统时钟切换到 PLL__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);// 等待时钟切换完成while (__HAL_RCC_GET_SYSCLK_SOURCE() ! RCC_SYSCLKSOURCE_STATUS_PLLCLK) {} }接下来在系统时钟配置函数的基础上修改代码。在配置PLL前先禁用全局中断防止时钟中断等影响配置过程然后切换时钟源为HSI并禁用锁相环 // 禁用全局中断__disable_irq();// 切换到 HSISystemClock_SwitchToHSI();// 禁用 PLL__HAL_RCC_PLL_DISABLE();         然后是配置PLL过程此时参考系统时钟初始化代码其中plln是传入的形参变量锁相环倍频系数。需要注意的是主频频率提高后Flash的等待周期要相应延长原为FLASH_LATENCY_5这里简单判断了一下如果大于168MHz就延长为FLASH_LATENCY_7 // 配置 PLLRCC_OscInitTypeDef RCC_OscInitStruct {0};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 6; // HSE 分频系数RCC_OscInitStruct.PLL.PLLN plln; // PLL 倍频系数RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2; // PLLP 分频系数RCC_OscInitStruct.PLL.PLLQ 4; // PLLQ 分频系数if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}// 配置系统时钟RCC_ClkInitTypeDef RCC_ClkInitStruct {0};RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | 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;// 设置 Flash 等待周期uint32_t flash_latency (plln 168) ? FLASH_LATENCY_5 : FLASH_LATENCY_7;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, flash_latency) ! HAL_OK){Error_Handler();} 最后是切换为PLL并重新启用全局中断 // 切换到 PLLSystemClock_SwitchToPLL();// 重新启用全局中断__enable_irq(); 完整代码如下再次提醒此代码是以外部晶振为12MHz的前提下有STM32CubeMX生成的使用时需根据自身情况修改 /*** brief 设置系统时钟频率* param plln 锁相环倍频* details 基于外部晶振为12MHz的配置*/ void SystemClock_SetFrequency(uint32_t plln) {// 禁用全局中断__disable_irq();// 切换到 HSISystemClock_SwitchToHSI();// 禁用 PLL__HAL_RCC_PLL_DISABLE();// 配置 PLLRCC_OscInitTypeDef RCC_OscInitStruct {0};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 6; // HSE 分频系数RCC_OscInitStruct.PLL.PLLN plln; // PLL 倍频系数RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2; // PLLP 分频系数RCC_OscInitStruct.PLL.PLLQ 4; // PLLQ 分频系数if (HAL_RCC_OscConfig(RCC_OscInitStruct) ! HAL_OK){Error_Handler();}// 配置系统时钟RCC_ClkInitTypeDef RCC_ClkInitStruct {0};RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK | 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;// 设置 Flash 等待周期uint32_t flash_latency (plln 168) ? FLASH_LATENCY_5 : FLASH_LATENCY_7;if (HAL_RCC_ClockConfig(RCC_ClkInitStruct, flash_latency) ! HAL_OK){Error_Handler();}// 切换到 PLLSystemClock_SwitchToPLL();// 重新启用全局中断__enable_irq(); }         此时可另写两个函数其一为默认配置以便能从超频状态返回标准状态其二为超频状态建议不要设太高推荐200~216MHz。提高主频后也会提高其他时钟线进而会对外设产生影响。此时需要注意一些如USB、以太网等对频率要求很高的外设需要重新设置参数。 /*** brief 超频* param 无* retval 无* details 通过超频可以提升至 200MHz~216MHz这里默认使用216MHz*/void SystemClock_Overclock() {SystemClock_SetFrequency(216); }/*** brief 默认系统时钟初始化* details 最高稳定频率为168MHz*/ void SystemClock_DefaultConfig() {SystemClock_SetFrequency(168); } HAL中对定时器的频率设置是依赖于全局变量SystemCoreClock由HAL_RCC_ClockConfig来更新使用HAL_RCC_GetPCLK1Freq等函数可以实现自动纠正频率下面代码可以作为参考 #include stm32f4xx_hal.h/*** brief 设置定时器频率* param htim: 定时器句柄如 htim2* param target_freq: 目标频率单位Hz* retval HAL_StatusTypeDef: 成功返回 HAL_OK失败返回 HAL_ERROR*/ HAL_StatusTypeDef Timer_SetFrequency(TIM_HandleTypeDef *htim, uint32_t target_freq) {uint32_t timer_clock_freq; // 定时器时钟源频率uint32_t psc_value; // 预分频器值// 获取 APB 总线时钟频率if (htim-Instance TIM2 || htim-Instance TIM3 || htim-Instance TIM4 || htim-Instance TIM5 ||htim-Instance TIM9 || htim-Instance TIM10 || htim-Instance TIM11){// APB1 定时器timer_clock_freq HAL_RCC_GetPCLK1Freq();if (RCC-CFGR RCC_CFGR_PPRE1_2) // 检查 APB1 预分频器{timer_clock_freq * 2; // 如果预分频器不为 1时钟频率乘以 2}}else{// APB2 定时器timer_clock_freq HAL_RCC_GetPCLK2Freq();if (RCC-CFGR RCC_CFGR_PPRE2_2) // 检查 APB2 预分频器{timer_clock_freq * 2; // 如果预分频器不为 1时钟频率乘以 2}}// 检查目标频率是否有效if (target_freq 0 || target_freq timer_clock_freq){return HAL_ERROR; // 目标频率无效}// 计算预分频器值psc_value (timer_clock_freq / target_freq) - 1;// 检查预分频器值是否超出范围if (psc_value 0xFFFF){return HAL_ERROR; // 预分频器值超出 16 位范围}// 设置定时器预分频器__HAL_TIM_SET_PRESCALER(htim, psc_value);return HAL_OK; } 其参考的是STM32CubeMX生成的“系统”定时器这里使用的是TIM7的初始化代码 /*用于配置供HAL使用基础时钟频率为1KHz*/ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {RCC_ClkInitTypeDef clkconfig;uint32_t uwTimclock, uwAPB1Prescaler 0U;uint32_t uwPrescalerValue 0U;uint32_t pFLatency;HAL_StatusTypeDef status;/* Enable TIM7 clock */__HAL_RCC_TIM7_CLK_ENABLE();/* Get clock configuration */HAL_RCC_GetClockConfig(clkconfig, pFLatency);/* Get APB1 prescaler */uwAPB1Prescaler clkconfig.APB1CLKDivider;/* Compute TIM7 clock */if (uwAPB1Prescaler RCC_HCLK_DIV1){uwTimclock HAL_RCC_GetPCLK1Freq();} else{uwTimclock 2UL * HAL_RCC_GetPCLK1Freq();}/* Compute the prescaler value to have TIM7 counter clock equal to 1MHz */uwPrescalerValue (uint32_t) ((uwTimclock / 1000000U) - 1U);/* Initialize TIM7 */htim7.Instance TIM7;/* Initialize TIMx peripheral as follow: Period [(TIM7CLK/1000) - 1]. to have a (1/1000) s time base. Prescaler (uwTimclock/1000000 - 1) to have a 1MHz counter clock. ClockDivision 0 Counter direction Up*/htim7.Init.Period (1000000U / 1000U) - 1U;htim7.Init.Prescaler uwPrescalerValue;htim7.Init.ClockDivision 0;htim7.Init.CounterMode TIM_COUNTERMODE_UP;htim7.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE; // 考虑到LVGL初始化会死循环status HAL_TIM_Base_Init(htim7);if (status HAL_OK){/* Start the TIM time Base generation in interrupt mode */status HAL_TIM_Base_Start_IT(htim7);if (status HAL_OK){/* Enable the TIM7 global Interrupt */HAL_NVIC_EnableIRQ(TIM7_IRQn);/* Configure the SysTick IRQ priority */if (TickPriority (1UL __NVIC_PRIO_BITS)){/* Configure the TIM IRQ priority */HAL_NVIC_SetPriority(TIM7_IRQn, TickPriority, 0U);uwTickPrio TickPriority;} else{status HAL_ERROR;}}}/* Return function status */return status; }
http://www.w-s-a.com/news/234781/

相关文章:

  • 三大网络架构seo是啥职业
  • 一个域名可以做中英文两个网站吗搜索引擎营销的6种方式
  • 可以做ppt的网站天津网站建设怎么样
  • 网站怎么做的qq邮件订阅浙江省住房和城乡建设厅网站查询
  • 主机屋网站在线做图片
  • 河南省城乡住房建设厅网站wordpress登陆密码
  • 漳州做网站的公司搭建网站多少时间
  • 网站开发实习计划模板微营销手机
  • 网站设计与制作是做什么工作免费封面设计在线制作生成
  • 网站开发的教学课程网站广告调词软件
  • 进下加强新闻宣传网站建设入门 做网站 书籍
  • 电商网站主题photolux wordpress
  • 周口专业做网站公司深圳市宝安区松岗街道邮政编码
  • 上海企业网站推广方法网络营销策划方案框架
  • 一流的常州网站建设机械加工网报价
  • 上海响应式网站建设公司seo课程总结
  • vs网站开发教程昆山普立斯特做的有网站
  • 柳州网站seo网站swordpress 输出内容
  • 网站设计制作电话多少网站流量下降
  • 沈阳做网站推广的公司唐山哪家做网站好
  • 国外著名网站建设公司WordPress破解怎样主题修复
  • 网站建设济南云畅网络广州电力建设有限公司网站
  • 查看公司信息的网站思特奇是外包公司吗
  • 制作企业网站的目的啥都能看的浏览器
  • 做网站可以用哪些语言如何进行网站运营与规划
  • 做效果图网站有哪些电子商城网站制作数据库
  • 小刘网站建设wordpress调用php文件上传
  • 建设银行对账网站网络营销广告案例
  • 做网站开票是多少个点的票wordpress扫码提交数据库
  • 织梦网站改版需要怎么做企业网站备案管理系统