历史上的今天
返回首页

历史上的今天

今天是:2025年04月17日(星期四)

正在发生

2018年04月17日 | STM32按键输入、所需要的C语言复习、时钟系统框图

2018-04-17 来源:eefocus

第一部分:

STM32按键输入是我的第二个在STM32 平台上有输入的小实例。思路为,先查询硬件图看清按键是低电平有效还是高电平有效,根据我的开发环境得知四个按键有三个按键是低电平有效,有一个按键是高电平有效。然后设计代码,设计代码之前得分析清楚,按键有两种情况,可持续按键和不可持续按键。可持续按键的意思是,按一下放开后,继续按还会有用,而不可持续按键就不行。

分清按键类型就可以照一般运用外设的三步走战略前进,第一步初始化按键输入时钟,第二步初始化所运用的IO时钟,第三步扫描键盘

初始化时钟选择时钟系统中的高速总线挂载的时钟,APB2所包含的时钟函数RCC_APB2PeriphClockCmd()。具体下面的时钟系统分析会清晰的讲述。

接下来调用IO初始化函数GPIO_Init();

最后一步用于扫描键盘,扫描键盘设置了扫描参数,为两种模式,模式0是不持续按键,模式1是持续按键,具体扫描参数如下代码:

u8 key_scan(u8 mode)
{
static u8 key_up=1;//mode0是不持续按键,mode1是持续按键
  if(mode==1) key_up=1;
if(key_up&&(key0==0||key1==0||key2==0||wk_up==1))
{
delay_ms(30);
key_up=0;
if(key0==0)return key0_pres;//
else if(key1==0) return key1_pres;
else if(key2==0) return key2_pres;
else if(wk_up==1) return wkup_pres;
}
else if(key0==1&&key1==1&&key2==1&&wk_up==0)key_up=1;
return 0;
}

所写的头文件主要是函数申明和一些所需要的预编译如下:

#ifndef __Key_Init
#define __Key_Init
#include "sys.h"//包含位带操作
//采用位带操作
//#define key0  PEin(4)
//#define key1  PEin(3)
//#define key2  PEin(2)
//#define wk_up PAin(0)
//采用库函数
#define key0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define key1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define wk_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define key0_pres 1//控制led0
#define key1_pres 2//控制led0
#define key2_pres 3//控制跑马灯
#define wkup_pres 4//控制蜂鸣器
//采用寄存器

void __key_init(void);
u8 key_scan(u8);
#endif
采用寄存器进行操作,主要是操作CRL和ODR寄存器,由于采用的是上拉下拉输入,而上拉下拉的控制是由ODR寄存器控制

第二部分:

接下来的内容是对STM32 中经常用到的C语言知识的复习回顾,按键输入中用到的不持续按键就用到了static变量,让变量存储于静态区,以利于键值的保持。

对于STM32中用到比较多的C语言是下述


n位操作

n  define宏定义关键词

n  ifdef条件编译

n  extern变量申明

n  typedef类型别名

n  结构体

n  static关键字

位操作主要有六种,按位与,或,取反,异或左移右移

按位或主要运用在如上面对GPIO口的初始化中GPIO_InitKEY.GPIO_Pin= GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;

可以节省代码量。

后面的ifdef等属于预编译,主要有的代码块可以执行也可以不执行,一般用到ifdef预编译。

extern申明这个变量或者函数可以在别的文件中引用

typedef主要就是给数据类型取一个别名如u8等,和#define类型,但差别又很大,#define可以定义任何别名,而typedef一般用于数据类型

static主要就是把全局或局部变量存储于静态存储区,运用其所谓的记忆功能

结构体则具有很强的作用,很重要的作用,尤其对于代码的扩展性来说,如一个函数有很多的参数,若想添加参数则,整个文件所有运用到这个函数的地方都得改动,而用结构体只需在引用时引用在结构体中添加即可。

增加一个内容,STM32中的寄存器地址映射:

以地址是如何计算到GPIOA为例,首先地址找到的是外设的基地址,然后加上偏移找到APB2总线的地址,再加上GPIOA的地址偏移量,计算出GPIOA的基地址,其他的七个寄存器地址依次加入偏移量即可,原理图如图一。

第三部分:


我认为第三部分是整个STM32中最重要的地方,很多地方把时钟系统比喻为系统的心脏,我觉得更贴切的是比喻为血液,一个器官有血液流过,才带来氧用于提供器官所需能量。
时钟系统原理图在最下面给出。首先给出时钟系统的总结如下:


1.STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。

     ①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
   ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时

                钟源,频率范围为4MHz~16MHz。
   ③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。WDG
   ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。RTC
   ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

              倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
2. 系统时钟SYSCLK可来源于三个时钟源:
        ①、HSI振荡器时钟

        ②、HSE振荡器时钟

        ③、PLL时钟

3.STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL

  输出的2分频、HSI、HSE、或者系统时钟。

4.任何一个外设在使用之前,必须首先使能其相应的时钟。

下面给出系统比较重要的时钟:

1SYSCLK(系统时钟) :

2AHB总线时钟:总共有六种分频因子,用来提供APB1和APB2

3APB1总线时钟(低速): 速度最高36MHz,主要用来提供低速外设的

4APB2总线时钟(高速): 速度最高72MHz,主要用来提供高速外设

5PLL时钟,锁相环所提供的时钟主要用来倍频。

typedefstruct

{

  __IO uint32_tCR;                //HSI,HSE,CSS,PLL等的使能和就绪标志位

  __IO uint32_tCFGR;           //PLL等的时钟源选择,分频系数设定

 __IO uint32_t CIR;              //清除/使能 时钟就绪中断

 __IO uint32_t APB2RSTR;  //APB2线上外设复位寄存器

 __IO uint32_t APB1RSTR;   //APB1线上外设复位寄存器

  __IO uint32_tAHBENR;    //DMA,SDIO等时钟使能

  __IO uint32_tAPB2ENR;   //APB2线上外设时钟使能

  __IO uint32_tAPB1ENR;   //APB1线上外设时钟使能

 __IO uint32_t BDCR;        //备份域控制寄存器

 __IO uint32_t CSR;           //控制状态寄存器

} RCC_TypeDef;

控制上述时钟的各个状态就靠寄存器,任何MCU的控制最终都是寄存器的控制。


推荐阅读

史海拾趣

BAE Systems公司的发展小趣事

电子行业是一个充满竞争和挑战的领域。面对不断变化的市场环境和客户需求,BAE Systems公司不断调整自身的战略和业务结构。公司注重市场调研和客户需求分析,根据市场变化及时调整产品线和市场策略。同时,公司也加强了对内部管理和流程的优化,提高了运营效率和成本控制能力。这些举措使得公司能够在激烈的市场竞争中保持领先地位,实现稳健发展。

Hirose Electric公司的发展小趣事

作为一个大型企业,BAE Systems公司不仅关注经济效益,也积极履行社会责任,推动可持续发展。公司注重环境保护和安全生产,严格遵守相关法律法规和行业标准。同时,公司也积极参与社会公益事业,为社区发展和员工福利做出了贡献。此外,公司还注重员工的培训和发展,为员工提供了广阔的职业发展空间和良好的工作环境。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

这五个故事只是BAE Systems公司在电子行业发展历程中的一部分,它们展示了公司的成长、创新、合作、应对挑战以及履行社会责任等方面的努力和成果。这些故事也充分说明了BAE Systems公司在电子行业中的重要地位和影响力。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

随着电子行业的快速发展,客户对电容器的需求日益多样化。CDE公司积极应对市场变化,致力于定制化电容器的研发与应用。公司利用数学建模和定制化的仿真App对电容器的设计进行微调,以满足不同客户的特定需求。这一举措不仅提升了CDE的市场竞争力,也为公司在定制化电容器领域树立了领先地位。

Dynex公司的发展小趣事

在电子行业的早期,创始人William Dubilier凭借其敏锐的洞察力和创新精神,于1909年创立了CDE公司。Dubilier首次使用一种名为云母的玻璃状矿物,开发出一种新型电容器,这一创新为CDE公司的诞生奠定了基石。自那时起,CDE便以电容器为专业方向,不断追求技术突破和产品创新。

ETC1公司的发展小趣事

金溢科技是国内ETC行业的领军企业之一。公司自创立之初,就致力于ETC技术的研发与应用。通过不断的技术创新,金溢科技成功推出了多款具有自主知识产权的ETC设备,并在市场中获得了广泛应用。同时,公司还积极参与国家标准的制定和修订工作,推动ETC行业的规范化发展。金溢科技凭借其在ETC领域的卓越表现,逐渐成为了行业的标杆企业。

FRONTIER公司的发展小趣事

背景:FRONTIER Electronics作为一家专注于无源元件和集成无源元件设计与制造的公司,自成立以来便致力于技术创新。

发展故事:在21世纪初,FRONTIER Electronics凭借其在电感器、变压器、二极管等领域的深厚技术积累,成功推出了一系列高性能、高可靠性的电子产品。随着市场需求的不断增长,公司逐步扩大生产规模,并在全球范围内建立了完善的销售网络。通过持续的技术研发和市场拓展,FRONTIER Electronics逐渐在电子行业中崭露头角,成为该领域的领军企业之一。

问答坊 | AI 解惑

汽车导航系统的DC/DC转换器选择指南

汽车环境的宽工作电压要求、大瞬变电压以及大温度漂移等因素共同作用下,电子系统面临着严酷的条件,本文介绍如何在性能要求变得愈加苛刻的条件下,设计多个电源电压以满足汽车电子系统不同部分的要求。        ...…

查看全部问答>

51单片机综合学习系统_DS18B20温度实验篇.pdf

51单片机综合学习系统_DS18B20温度实验篇.pdf…

查看全部问答>

编译问题解决

Can\'t insert Symbol into Block Design File filename because the Symbol represents the current Block Design File…

查看全部问答>

大功率开关电源中功率MOSFET的驱动技术

功率MOSFET具有导通电阻低、负载电流大的优点,因而非常适合用作开关电源(switch-mode power supplies,SMPS)的整流组件,不过,在选用MOSFET时有一些注意事项。    功率MOSFET和双极型晶体管不同,它的栅极电容比较大,在导通之前要 ...…

查看全部问答>

wi-fi的设置问题

我开发板上有一个wi-fi模块,经常在不同的无线局域网中使用,每次都需要手工设置,有没有办法用代码来完成无线网络的设置呢(无线网络没加密,或固定的一个密码)?…

查看全部问答>

请问大家都用什么笔记本.现在 一般的笔记本都没有串并口

如题. 做ARM开发,有时候会用到串并口,现在 的笔记本一般都没有,不知道大家有什么建议,我听朋友说,用转接口不太稳定.最好用台式机,不过我还是想换个带串并口的笔记本,大家有什么建议…

查看全部问答>

WINCE 分区如何隐藏

eboot 分了 4个分区, 1个binfs 3个fatfs 3个fatfs在pc上都是别出来了, 现在遇到以下问题: 1). 我想隐藏其中2个fatfs分区, 因为 我要放 应用程序 用 所以需要隐藏起来 2). 现在分区的路径名是按默认的名字, 比如默认是 disk, 那么 后面几 ...…

查看全部问答>

atmega16单片机 自身AD问题

近期用atmega16 自身的ad测试陀螺仪,在测试的时候发现,当把ADC0接地时  LCD1602显示AD转换后的值为0096,接VCC=AVCC时  显示0993 这不对啊  应该是0和1023啊,这是程序 DDRA&=0xfe; PORTA&=0xfe; SF ...…

查看全部问答>

【课后练习】LaunchPad课后练习九之模拟SPI驱动数码管

LaunchPad课后练习九之模拟SPI驱动数码管   1.采用共阳极的数码管 数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。     什么是共阳极呢?就是他们的公共端接正极。扫描型的意思是,几位的数码管的段选都是 ...…

查看全部问答>

学习ARM过程中的堆栈初始化详解

1、寄存器 R13 在 ARM 指令中常用作堆栈指针 2、对于 R13 寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器: R13_ 其中,mo ...…

查看全部问答>