首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 MCU勿忘初始

STM32 MCU勿忘初始

咋看题目,貌似有点情感类文字了。呵呵,当然不是,至少不完全是。这里是指在MCU开发过程中不要完全无视或忽视复位后各模块的初始状态及各寄存器的默认初始值的意思。



我们知道,除了个别模块或寄存器在MCU复位后其初始值或初始状态是不确定的外,其它模块及相应寄存器都呈现一个确定的初始状态或初始值。由于这些复位后的初始状态或初始值可能跟我们应用开发所期待的不一致,常常在应用程序的开始部分重新根据实际需求对相关寄存器做初始化配置。其中有些寄存器对用户来说是只读的,用户程序一般不必自行手动初始化。但这也并不代表我们对这类寄存器可以完全视而不见或置之不理,比方状态寄存器。我们使用相关外设时,往往需要对相关状态寄存器的初始值加以关注或使用。




这里以某论坛上的一个咨询帖的一个案例具体聊聊。某STM32用户咨询如下:

    STM32F103的通用定时器,设置了TIM2的基本时基(使能了计数器溢出中断),并没有用CCRx,但是到了第一次及以后计数器溢出,TIM2_SR的CCxIF都被置'1'了。这是为什么呀!纠结了很久。。。。
void TIM2_IRQHandler(void)
{




TIM2->SR=~0x0001;// TIM_ClearFlag(TIM2, TIM_FLAG_Update);//




GPIOB->ODR^=0X0001;
}



咨询者使用STM32F103 的TIM2 作基本的计数定时功能,溢出中断里做GPIO的翻转动作。令他纠结郁闷的是,为什么都没使用IC/OC这些功能,SR里的CCxIF怎么会被置1了?!





    查看手册中令咨询者感到疑惑的CCxIF位,它是定时器x通道的捕捉或比较中断标志位。该位真正状态含义取决于该通道是配置为IC还是OC。那问题来了,以通道1为例,现在用户没有配置它,那通道1在芯片复位后默认的初始状态到底是IC还是OC呢?

某定时器通道是做IC还是OC,得看TIMx_CCMRn寄存器中的CCnS位。




    结合上面截图描述,一目了然,定时器CC1通道在MCU复位后默认为OC模式,那再回头看SR寄存器里的初始值及相关描述。
返回列表