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

网站建设文化怎么样泰安网站建设公司带

网站建设文化怎么样,泰安网站建设公司带,网站原型设计工具,备案密码找回STM32cubeMX版本:6.11.0 现象 STM32cubeMX配置Systick的时钟,不管选择不分频 还是8分频。 生成的代码都是一样的,代码都是不分频。 即不管选择不分频还是8分频,Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…

STM32cubeMX版本:6.11.0

现象

STM32cubeMX配置Systick的时钟,不管选择不分频 还是8分频。

生成的代码都是一样的,代码都是不分频。

即不管选择不分频还是8分频,Systick都是使用的系统时钟
在这里插入图片描述

函数调用

HAL_Init() →
HAL_InitTick(TICK_INT_PRIORITY) →
HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) →
SysTick_Config(TicksNumb)

各个函数的源码如下所示:

__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{/* Check uwTickFreq for MisraC 2012 (even if uwTickFreq is a enum type that don't take the value zero)*/if((uint32_t)uwTickFreq == 0UL){return HAL_ERROR;}/* Configure the SysTick to have interrupt in 1ms time basis*/if (HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) > 0U){return HAL_ERROR;}/* Configure the SysTick IRQ priority */if (TickPriority < (1UL << __NVIC_PRIO_BITS)){HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);uwTickPrio = TickPriority;}else{return HAL_ERROR;}/* Return function status */return HAL_OK;
}uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{return SysTick_Config(TicksNumb);
}__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk){return (1UL);                                                   /* Reload value impossible */}SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */return (0UL);                                                     /* Function successful */
}

可以看到
HAL_SYSTICK_Config(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq))
括号里的(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) 会被设置为SysTick的LOAD寄存器,即重装载值。
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */

Cortex M7内核手册有对Systick 的控制和状态寄存器的介绍。
bit2 CLKSOURCE 表明了Systick的时钟源。
为1 时,时钟源为处理器时钟,即系统时钟,也就是不分频或者说1分频。
为0 时,时钟源为外部时钟,也就是系统时钟的8分频。
在这里插入图片描述
而Systick的控制与状态寄存器的时钟源选择位设为1。
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk,即使用系统时钟。

不管选择不分频还是8分频,生成的代码都是这样的,也就是SysTick一直使用的是系统时钟。

配置时钟源HAL_SYSTICK_CLKSourceConfig

其实HAL是有选择时钟源的函数的,就是HAL_SYSTICK_CLKSourceConfig。
源码如下:

/*** @brief  Configures the SysTick clock source.* @param  CLKSource specifies the SysTick clock source.*         This parameter can be one of the following values:*             @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source.*             @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source.* @retval None*/
void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource)
{/* Check the parameters */assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource));if (CLKSource == SYSTICK_CLKSOURCE_HCLK){SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK;}else{SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK;}
}

我们可以看到 ,配置时钟源也就是设置状态与控制寄存器SysTick->CTRL。

但是这个函数从未被调用。

继续文件搜索这个函数

在stm32h7xx_hal_cortex.c文件中 ,发现了这么一段注释:

在这里插入图片描述

You can change the SysTick Clock source to be HCLK_Div8 by calling the macro
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the
HAL_SYSTICK_Config() function call. The HAL_SYSTICK_CLKSourceConfig() macro is defined
inside the stm32h7xx_hal_cortex.h file.

你可以通过在这个函数HAL_SYSTICK_Config()之后调用HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8)来更改SysTick的时钟源为HCLK_Div8 。

验证

我们来实验一下

main中的大循环里只有一个点灯程序,每1s切换一次。

在这里插入图片描述
修改HAL_SYSTICK_Config函数,在SysTick_Config之后调用HAL_SYSTICK_CLKSourceConfig。

uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{//return SysTick_Config(TicksNumb);uint32_t ret = 0;ret = SysTick_Config(TicksNumb);HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);return ret;
}

现象:led灯由原来的1s切换一次,变为8s切换一次。

这是因为SysTick的频率变为原来的1/8。

但是重装载值依然为原来1ms时的装载值(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq)) 。
也就是重装载值没变,但是速度变慢了8倍。

将(SystemCoreClock / (1000UL / (uint32_t)uwTickFreq))修改为
(SystemCoreClock/ 8 / (1000UL / (uint32_t)uwTickFreq))。

现象:led灯1s切换一次。

http://www.yayakq.cn/news/280330/

相关文章:

  • 科凡建站男女之间做那个的网站
  • 数码网站名男子公众号下单做防水补漏
  • 网站友情链接很重要吗网站 售前
  • 做套现网站wordpress4.9.4中文版
  • 网站设计标语邢台视频优化
  • 怎么仿网站贝壳企业网站管理系统
  • 电商网站的多选菜单插件快速排名推荐
  • 企业网站建设相关书籍在线阅读网站开发的问题
  • 网站建设 全网营销专注苏州网站建设
  • 网站制作综述seo 网站优化推广排名教程
  • 贸易网站怎么做有找专业做淘宝网站的美工
  • 石家庄手机网站建站上海电商设计招聘网站
  • 德州市住房和城乡建设部网站成都装修公司招聘
  • 做个网站软件多少钱怎么做免费视频网站
  • 桂林市做网站的公司深圳抖音seo
  • 表白网站制作软件手机适合大学生举办的活动策划
  • 做那种的视频网站注册做网站的公司
  • 网站备案在哪里审批有了主机和域名后如何做网站
  • 为该网站做自适应深圳网站设计制作公司 维仆
  • 北京公司注册核名网站四川建设考试培训网
  • 河南郑州软件定制开发沧州做网站优化哪家公司便宜
  • 网站开发员做教育招生网站
  • 如何用域名做邮箱 网站中文购物网站模板
  • 济南定制网站建设wordpress 改变语言
  • 福建省住房城乡和建设厅网站南通网站seo报价
  • 网站建设 深圳 凡科免费网店代运营
  • 招聘网站企业招聘怎么做九江巿建设局网站
  • 丽江网站制作公司网站建设流程步骤
  • 整站优化全网营销潍坊网页网站制作
  • 萍乡商城网站建设网站设计高端网站设计