历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2018年10月15日 | STM32时钟使能函数

2018-10-15 来源:eefocus

最近在学习STM32单片机,之所以选择这款单片机作为入门原因有以下几点:

       1. 配套资料详细  

       2. 工作中正在用这款单片机,有疑问可以请教同事,熟悉了这款单片机能更好服务于工作 

       3. ST单片机非常火爆,很多公司都在用

对于单片机小白的我,想要学好一款单片机,不仅仅是一时的冲动,凭借的更是长期的毅力和兴趣,这点觉悟必须具备。为什么要写博文呢?因为怕忘记,有时候花很长时间琢磨的函数,再见面只有相见无言唯有泪千行!!!所以做笔记尤其重要啊!!!

 

使用一个外设时,必须先使能它的时钟,这些时钟函数可大致分为三类:一)外设时钟使能函数    二)时钟源和倍频因子配置函数    三)外设复位函数

外设时钟使能函数又包括外设时钟使能和时钟源使能,因为外设是挂在AHB和APB总线上的,所以使能外设时钟就是使能对应外设所挂的总线时钟,比如GPIO 外设它是挂接在APB2 总线上的,如果使用GPIO 外设,就需要先调用 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);函数使能APB2时钟,外设时钟使能函数有两个形参,第一个是你所使用的外设所挂接的时钟,第二个是选择你用的外设时钟使能还是失能。比如我们要使能端口GPIOC,那么第一个传递的参数是:RCC_APB2Periph_GPIOC 宏,第二个传递的参数是ENABLE 使能。下面为具体函数:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
 
  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    RCC->APB2ENR |= RCC_APB2Periph;
  }
  else
  {
    RCC->APB2ENR &= ~RCC_APB2Periph;
  }
}

首先来看下这个函数assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));这是个断言函数,意思就是如果外设是挂在APB2总线上的,程序就继续执行,如果不是则做其它处理。

 

再来看下IS_RCC_APB2_PERIPH(RCC_APB2Periph)这个宏,具体如下:

#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))

其实这个宏的目的就是识别APB2的外设,那为什么是0xFFC00002呢?来看下APB2总线上的所有外设时钟是如何定义的

#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)

 

以RCC_APB2Periph_GPIOC为例,想要使能RCC_APB2Periph_GPIOC的时钟,就要将RCC->APB2ENR 寄存器的相应位置1,即bit4=1,所以RCC_APB2Periph_GPIOC= (uint32_t)0x00000010,其它以此类推,如果使能APB2总线上的所有外设时钟那么 RCC->APB2ENR=0x003FFFFD,取反就是0xFFC00002

最后是,使能外设时钟的具体操作

if (NewState != DISABLE)
  {
    RCC->APB2ENR |= RCC_APB2Periph;//将APB2ENR寄存器中相应的外设时钟使能位置1
  }
  else
  {
    RCC->APB2ENR &= ~RCC_APB2Periph;//APB2ENR寄存器中相应的外设时钟使能位为置0,其它位保持不变

  }

 

 

STM32时钟使能函数


推荐阅读

史海拾趣

Fibrefab Limited公司的发展小趣事

面对全球环境问题日益严峻的现状,Fibrefab积极响应环保号召,推动绿色生产和可持续发展。公司采用环保材料和生产工艺,降低产品生产和使用过程中的能耗和排放。同时,Fibrefab还积极参与环保公益活动和社会责任项目,为保护环境贡献自己的力量。这一举措不仅提升了Fibrefab的企业形象和社会责任感,也为其长期发展奠定了坚实基础。

Hitano Enterprise Corp公司的发展小趣事

为了进一步扩大市场份额,Fibrefab开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立生产基地和研发中心,以满足不同地区客户的需求。同时,Fibrefab还积极与全球知名的电信运营商和设备制造商建立合作关系,共同推动光纤通讯技术的发展和应用。这一战略的实施不仅帮助Fibrefab拓展了海外市场,也提升了其品牌影响力和市场竞争力。

Chemi-Con公司的发展小趣事

在电子行业的发展过程中,Chemi-Con公司意识到单一产品线的局限性,并开始积极探索多元化发展的道路。公司不仅拓展了电容器产品的应用领域,还涉足了光电子机械等新兴产业。此外,Chemi-Con还积极寻求与其他企业的合作,通过技术共享、资源共享等方式实现共赢。这种开放、合作的姿态使得Chemi-Con在行业中树立了良好的形象,也为公司的长远发展奠定了坚实的基础。

HTSEMI( Jin Yu Semiconductor )公司的发展小趣事

金宇半导体成立于2005年,由一群来自国内外顶尖高校的半导体专家共同创立。在成立初期,公司面临着资金短缺和技术瓶颈的双重挑战。创始人团队凭借在微处理器设计领域的深厚积累,成功研发出了一款低功耗、高性能的嵌入式处理器芯片,迅速获得了市场的关注。这款芯片不仅在国内智能手机市场占据了一席之地,还成功打入国际市场,为公司的后续发展奠定了坚实基础。

American Power Devices Inc公司的发展小趣事

在激烈的市场竞争中,APD公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都严格把关。凭借卓越的产品品质和良好的售后服务,APD赢得了众多客户的信赖和支持。

Elytone Electronics Co Ltd公司的发展小趣事

随着公司规模的扩大,Elytone公司意识到品质管理对于企业发展至关重要。他们引入了先进的质量管理体系,加强了对原材料采购、生产过程和售后服务的监控。通过持续改进和优化,公司的产品质量得到了显著提升,赢得了客户的广泛认可。

问答坊 | AI 解惑

基于单片机的酒瓶自动计数系统的设计

大家好啊,在这转悠了好几天,发现大家都是高手!我是一名专升本的学生,专科没有学过单片机本科学校因为大部分人都学过所以也就没开这门课,现在要做有关单片机的毕业设计,想请大家帮帮忙,谢谢了!     昨天问了一下老师那个设计一共 ...…

查看全部问答>

Altera的用IP核设计的信号发生程序

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 Altera的用IP核设计的信号发生程序  …

查看全部问答>

LPC1300中文手册(完整版)--无广告

我整理了一下,方便大家阅读,呵呵   …

查看全部问答>

关于手机开发和JavaEE开发哪个好?

毕业在即,是选择JAVAEE的培训还是接受老师推荐,去做手机开发呢,前提是我是一个没有任何嵌入式基础的专科生。…

查看全部问答>

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答>

急!ARM D/A转换程序实现多种波形输出

ARM D/A转换程序设计 1.编程实现多种波形(正弦波信号、三角波信号、方波信号)的输出,在 DA接口利用示波器观测实验输出。 2.在 LCD上显示信号…

查看全部问答>

AVR与液晶的直接访问和间接访问

请假,利用AVR实现与液晶屏的访问,如果采用直接访问(给液晶屏分配一个地址空间),直接接到对应的地址和数据线上,对应的RD和WR信号分别接到AVR的RD和WR上。但是如果采用间接访问的话,液晶屏幕的RD和WR信号是不是一般不能接在对应AVR的RD和WR信 ...…

查看全部问答>

AD9851软件程序

本帖最后由 paulhyde 于 2014-9-15 03:40 编辑 欢迎支持!    …

查看全部问答>