STM32开发项目:定时器预装载寄存器(ARR)
項(xiàng)目背景
筆者在進(jìn)行某項(xiàng)目開發(fā)時(shí),需要實(shí)時(shí)調(diào)節(jié)定時(shí)器的周期,以控制定時(shí)器下次更新中斷的時(shí)間。
預(yù)裝載寄存器
自動(dòng)重裝載寄存器 ARR 是一個(gè) 16 位的寄存器,這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷。在物理上這個(gè)寄存器對應(yīng)2個(gè)寄存器,一個(gè)是程序員可以寫入或讀出的寄存器,稱為preload register(預(yù)裝載寄存器),另一個(gè)是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器)。
在圖中可以看到auto-reload register這個(gè)框有一個(gè)陰影,有些其它寄存器也有用陰影表示,如我用藍(lán)色標(biāo)出的Capture/Compare寄存器;有陰影的寄存器,表示在物理上這個(gè)寄存器對應(yīng)2個(gè)寄存器,一個(gè)是程序員可以寫入或讀出的寄存器,稱為preload register(預(yù)裝載寄存器),另一個(gè)是程序員看不見的、但在操作中真正起作用的寄存器,稱為shadow register(影子寄存器);正如手冊上的14.3.1節(jié)所說,根據(jù)TIMx_CR1寄存器中APRE位的設(shè)置,preload register的內(nèi)容可以隨時(shí)傳送到shadow register,即兩者是連通的(permanently),或者在每一次更新事件(UEV)時(shí)才把preload register的內(nèi)容傳送到shadow register。
參考文獻(xiàn)
實(shí)現(xiàn)方法
禁用預(yù)裝載寄存器,修改ARR的值(TIM_Period)會(huì)直接操作影子寄存器,新的ARR值將立即生效:
TIM_ARRPreloadConfig(TIM4, DISABLE);使能預(yù)裝在寄存器,修改ARR的值(TIM_Period)會(huì)操作預(yù)裝載寄存器,直到更新事件后,ARR預(yù)裝載寄存器的值才會(huì)被拷貝到影子寄存器中:
TIM_ARRPreloadConfig(TIM4, ENABLE);TIM_ARRPreloadConfig函數(shù)的定義如下:
/*** @brief Enables or disables TIMx peripheral Preload register on ARR.* @param TIMx: where x can be 1 to 17 to select the TIM peripheral.* @param NewState: new state of the TIMx peripheral Preload register* This parameter can be: ENABLE or DISABLE.* @retval None*/ void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState) {/* Check the parameters */assert_param(IS_TIM_ALL_PERIPH(TIMx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Set the ARR Preload Bit */TIMx->CR1 |= TIM_CR1_ARPE;}else{/* Reset the ARR Preload Bit */TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE);} }總結(jié)
以上是生活随笔為你收集整理的STM32开发项目:定时器预装载寄存器(ARR)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三国杀开源系列之一104@365
- 下一篇: [转]SQL Server 数据库规范