STM32按键输入、所需要的C语言复习、时钟系统框图

发布者:平安守护最新更新时间:2018-04-17 来源: eefocus关键字:STM32  按键输入  C语言复习  时钟系统 手机看文章 扫描二维码
随时随地手机看文章

第一部分:

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的控制最终都是寄存器的控制。


关键字:STM32  按键输入  C语言复习  时钟系统 引用地址:STM32按键输入、所需要的C语言复习、时钟系统框图

上一篇:STM32中SYSTICK定时器、端口复用和重映射
下一篇:STM32之GPIO及第一个STM32程序(跑马灯)

推荐阅读最新更新时间:2024-03-16 16:00

如何使用PIC内含之RC振荡器来当作系统时钟源?
从PIC12C508开始,逐渐地,PIC有很多型号都内含有可以当作系统时脉源的RC振荡器。有了这项功能,不但让整体系统的成本进一步往下降;并且还因为内部的RC振荡源是经过校正的,而获得了比外接RC振荡更精确的时钟。 不过,想要使用内部RC振荡而有精确的时钟,是有方法的。除了在刻录IC时要指定使用内部RC振荡以外,还要在原始程序代码中加上一些命令才行。而命令的用法,还因不同种类的PIC而有不同。 以12-BIT 架构的PIC而言,例如PIC12C508,Microchp在IC的最后一行程式内存,加上一个 movlw 0x?? 的命令,当芯片复位时,IC会先运行该命令之后,再跳到地址0继续运行。因此,如果您一直没有去修改到w暂
[单片机]
STM32的FSMC灵活静态存储器控制器
  FSMC(Flexihie Static Memory Controller)模块只适用于大容量产品。   FSMC模块能够与同步或异步存储器和16位PC存储器卡接口,主要将AHB传输信号转换到适当的外部设备协议,满足访问外部设备的时序要求。   存储器接口包括:   ① SRAM静态随机存储器   ② ROM只读存储器   ③ NOR闪存   ④ PSRAM(4个存储块)   ⑤ 两个NAND闪存块   ⑥ 16位PC卡   STM32之所以能够支持NOR FLASH和NAND FLASH两类访问方式完全不同的存储器扩展,是因为FSMC内部实际包括NOR FLASH和NAND / PC Card两个控制器,分别
[单片机]
<font color='red'>STM32</font>的FSMC灵活静态存储器控制器
STM32固件库详解
1.1 基于标准外设库的软件开发 1.1.1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函数库还包括每一个外设的驱动描述和应用实例,为开发者访问底层硬件提供了一个中间API,通过使用固件函数库,无需深入掌握底层硬件细节,开发者就可以轻松应用每一个外设。因此,使用固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。每个器件的开发都由一个通用API (application programming interface 应用编程界面)驱动,API对
[单片机]
ST 最新STM32 Primer开发工具可玩Maze和Breakout
完整、独立、预编程的评估工具套件,既有充满趣味性的功能介绍,又有严肃的开发工具,可以链接到在线开发社区 中国,2007年10月15日 — 意法半导体(纽约证券交易所代码:STM)今天推出了一套价格低廉的开发工具,这款代号为STM32 Primer开发工具是一套完整的学习与娱乐相结合的趣味性应用开发工具,用于ST的STM32系列基于具有突破性的ARM Cortex-M3内核的闪存微控制器。这套工具包含一个创新的用户界面、多个游戏和向新用户介绍该系列产品的产品入门功能,以及用于高级开发和编程的Raisonance软件工具。 STM32 Primer是一个手持评估开发工具,力图通过简单和有趣的介绍,让用户了解STM32的强大功能。紧
[新品]
基于STM32+华为云IOT设计的智能温室大棚监控系统
一、项目背景 当前文章介绍基于STM32单片机的智能温室大棚监控系统,当前系统由温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器笨时温宏大棚中内作物生长环境因子主要包括温度、湿度、光度、土壤湿度传感、二氧化碳浓度等参数进行监控。 采集数据,判断是否在系统设定上限、下限范围,如果超出了上限下限蜂鸣器报警、通风系统、LED补光系统、水泵系统就会启也可以通过手机APP和华为云华为云物联网云平台对温室大棚中的数据进行修改和设定新的数据。 本设计整体主要采用STM32单片机为核心、温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器、通风系统、LED补光系统、水泵系统组成。 (1) 温湿度传感器: 主要对温室大棚
[单片机]
基于STM32+华为云IOT设计的智能温室大棚监控<font color='red'>系统</font>
stm32的多通道ADC和DMA的设置问题
最近在倒腾LD驱动的时候遇到不少问题,下面就一一的记录一下啦,不然五百年以后谁还记得谁是吧。 一、多通道ADC和DMA的配置问题: 刚开始不知道怎么去配置,到处找资料发现很多不是很适用。很盲目的找了很久的资料,后来发现官方的固件库里面有很详细的资料。稍微改了一下官方的demo一下就编译成功了。这个例子的启示是:别忙着去网上找现成的例子,启示固件库里面的例程很给力了。 程序需求是开通三个ADC通道分别采集3V 的基准电压、控制反馈温度和环境温度。 因为用示波器测试时发现TED控制PWM的开关的高频噪声耦合到控制地中来了,所以会有一些高频尖刺。我的解决办法是每组数据通过DMA采集100个点,除去最大的10个数和最小的10数然后
[单片机]
解决stm32进入HardFault_Handler的定位办法
1、首先在HardFault_Handler的while(1)处打上断点。 2、等待代码运行到此,这时查看寄存器LR,在左边一个是工程,一个是寄存器。 上面的LR是我正常时copy的,一般在进入hardfault时,会变成下图的值,这时就可以知道该看那个寄存器的值,当时我那里是0xFFFFFFFD,所以是看PSP的地址。 3、找到该看的地址后然后如下图打开内存,输入上面找到的寄存器的地址,在右键选择以long型查看地址,如下图。 然后查看这个地址,向下面数6个long地址,大概是0x08xxxxx这样开始的则为出错代码的位置,可以反汇编查看,如下图。 这样上下对应找到这个地址值对应函数代码,在汇
[单片机]
解决<font color='red'>stm32</font>进入HardFault_Handler的定位办法
STM32实现命令行
一、前言 工作中的开发环境都是基于linux命令行交互,作为命令行的重度使用者,玩单片机也要使用命令行工具,百度了一些命令行工具,有几个不错的开源 cmd 交互工具,主要看了 finsh和 nr_micro_shell 两个开源项目。Finsh 功能上限较多,但资源占用比较高,nr 有基本功能,且占用 MCU 资源较少,Github 给出的对比列表如下: Nr 和 Finsh 编译资源对比: 原始工程 添加nr_micro_shell增加量 添加finsh增加量 ROM 63660 +3832 +26908 RAM 4696 +1104 +1304 综合衡量了一下,移植 nr 作为后续项目的一个命令行交互。本篇文章分
[单片机]
在<font color='red'>STM32</font>实现命令行
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved