Cortex-M3处理器的GPIO实验自学

发布者:蓝天飞行最新更新时间:2018-03-09 来源: eefocus关键字:Cortex-M3  处理器  GPIO 手机看文章 扫描二维码
随时随地手机看文章

    以前在学校时不知以后会干什么所以什么都学点,感觉什么有用就拿起学学,但是出来以后发现学没有致以用,于是也开始学者老前辈们抱怨当前教育与社会严重脱钩,但是学校也有冠冕堂皇的理由,我们教你的是思想,教你的是学习的方法。也许社会的现实就是这样吧,一遇到事,公说公有理,婆说婆有理,我们又能奈何?幸亏我们还有网络,幸亏我们还没有完全被封口,所以我们还能发发牢骚,好了,时间不早了,牢骚发的差不多了,下面开始写学习总结。

 

    因为项目所需,所以不得不开始研究M3,我用的是NXP公司的LPC1768这个芯片,它是具有三级流水线的哈佛结构,带独立的本地指令和数据总线以及用于外设的稍微低性能的第三条总线,还包含一个支持随机跳转的内部预取指单元。关于LPC1768这个芯片的内部资源这里就不罗列了,这些数据手册上都写的很详细,以后在学习总结中也会慢慢涉及。好了,今天只是初步测试一下它的GPIO功能,所谓的GPIO也就是通用输入/输出口(General Purpose Input Output),万丈高楼平地起,慢慢来吧。实验的原理图很简单,就是几个LED灯,关于灯的电流电压参数,这里不作详细介绍,有兴趣的可以到网上或供应商那里要一份数据手册看一下,做技术的不能懒,有些东西该看的还是要看的。

图1 硬件原理图

图1 硬件原理图

    硬件原理图很简单了,74LVC244是用来驱动LED的,74LVC244内部就是8个三态门,关于它的详细电气参数,请参阅它的数据手册。关于程序也不是太难,有几个地方要说一下。即然是GPIO实验,当然要关注GPIO的配置了,由于大部分引脚都具有一个以上功能,所以首先要配置引脚功能寄存器PINSEL,只有当引脚配置为GPIO功能时,GPIO的方向位才有效,对于其它功能来说,方向是自动的。关于引脚功能寄存器PINSEL功能如下表所示:

PINSEL0~PINSEL9的值

功能

复位后的值

00

    默认功能,通常为GPIO口

     

00

01

    第一个可选功能

10

    第二个可选功能

11

    第三个可选功能

    PINSEL寄存器每两位控制一个引脚,由于各个引脚的功能不一样,所以PINSEL0~PINSEL9的配置也相应的有所不同,想详细了解这10个寄存器的功能可以参看《user.manual.lpc17xx》,这个手册可以到NXP的网站上去下载。由于这次实验只是用到GPIO功能,所以暂时不用管这个寄存器,用它的默认值就可以了。

    另一个寄存器是引脚模式选择寄存器PINMODE,它控制所有端口的工作模式,包括是否配置上拉/下拉电阻和特定的开漏操作模式等。引脚模式选择寄存器PINMODE的功能如下表所示:

PINMODE0~PINMODE9的值

功能

复位后的值

00

    引脚使能片内上拉电阻

     

00

01

    中断模式

10

    引脚没有使能片内上拉/下拉电阻

11

    引脚使能下拉电阻

    当引脚处于逻辑高电平时,中继模式使能上拉电阻,当引脚处于逻辑低电平时,使能下拉电阻,当引脚配置为输入且不是通过外部驱动时,引脚将保持上一个已知状态。PINMODE_0D寄存器控制寄存器的开漏模式,引脚配置为输出且值为0时,开漏模式会正常地将引脚电平拉低。但是如果输出引脚为1,则引脚输出驱动关闭,等同于改变了引脚的方向,实际上是模拟了一个开漏输出。

PINMODE_0D0~PINMODE_0D4的值

功能

复位后的值

00

    引脚处于正常模式(非开漏模式)

00

01

    引脚处于开漏模式

    除了以上两个寄存器要配置,与GPIO端口相关的寄存器还有快速端口值寄存器FIOPIN可以用来读/写端口的值,端口输出置位寄存器FIOSET,当这个寄存器的相应位置1时,相应端口引脚输出1,当然也可以从这个寄存器读取当前引脚输出的值,与它对应的寄存器是FIOCLR,当寄存器FIOCLR相应位置1时,相应引脚输出0,但这个寄存器是只写寄存器,不能读取数据。好了,关于这些寄存器先总结到这,详细的配置还要看LPC1768的用户手册《user.manual.lpc17xx》,当然也可以经常去NXP网站逛逛看看其它的handbook或whitepaper            好了,下面给出实验程序,由于程序太多,只给出部分,剩下的源文件可以到工程文件夹中去找:

      /*********************************************************************************

      文件名称:mian.c

      功    能: 主要调度函数及应用函数

      编译环境: MDKV4.12

      时    钟: 外部12MHz

      日    期: 11/08/16

      作    者: 懒猫爱飞

      备    注:NULL

      ---------------------------------------------------------------------------------

      修改内容:NULL

      修改日期:XXXX年xx月xx日      xx时xx分

      修改人员:xxx xxx xxx

      **********************************************************************************/

      #include"main.h"

      volatile unsigned lONg SysTICkCnt;      /* 用于系统时钟计数*/

      /********************************************************************************

      * 函数名称:void SysTick_Handler (void)

      * 函数功能: 系统节拍定时器中断函数,每1ms计数一次

      * 入口参数: 无

      * 出口参数: 无

      * 备    注:无

      *******************************************************************************/

      void SysTick_Handler (void)

      {

      SysTickCnt++;

      }

      /********************************************************************************

      * 函数名称:void Delay (unsigned long tick)

      * 函数功能: 毫秒级延时函数

      * 入口参数: unsigned long tick -- 延时时长

      * 出口参数: 无

      * 备    注:无

      *******************************************************************************/

      void DelayMs (unsigned long tICk)

      {

      unsigned long systickcnt;

      systickcnt = SysTickCnt;

      while ((SysTickCnt - systickcnt) < tick);

      }

      /********************************************************************************

      * 函数名称:void PortInit(void)

      * 函数功能: 端口初始化

      * 入口参数: 无

      * 出口参数: 无

      * 备    注:无

      *******************************************************************************/

      void PortInit(void)

      {

      GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */

      GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */

      Led1Off();     /* 初始化时熄灭所有的灯*/

      Led2Off();

      Led3Off();

      Led4Off();

      Led5Off();

      Led6Off();

      Led7Off();

      Led8Off();

      }

      /********************************************************************************

      * 函数名称:int main(void)

      * 函数功能: 主函数

      * 入口参数: 无

      * 出口参数: 无

      * 备    注:无

      *******************************************************************************/

      int main(void)

      {

      SystEMInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义*/

      SysTick_Config(SystemFrequency/1000 - 1);   /* 配置时钟中断,每1ms中断一次*/

      /* 在core_cm3.h中定义*/

      PortInit();       /* 端口初始化*/

      while(1)

      {

      Led1On();     //LED1开

      Led4On();    //LED4 开

      DelayMs(200);

      Led1Off();    //LED1关

      Led4Off();    //LED4关

      DelayMs(200);

      }

      }

      因为程序是最基础的实验,所以不是太难,程序中延时函数用的是系统节拍定时器,每1m中断一次,系统节拍定时器的中断配置函数是SysTick_Config(uint32_t ticks)它在core_cm3.h中有定义,有兴趣的话可以看看。GPIO是一个结构体指针,原型在LPC17XX.H这个头文件中,其定义的原型如下所示:

      typedef struct

      {

      __IO uint32_t FIODIR;

      uint32_t RESERVED0[3];

      __IO uint32_t FIOMASK;

      __IO uint32_t FIOPIN;

      __IO uint32_t FIOSET;

      __O  uint32_t FIOCLR;

      } GPIO_TypeDef;

      还有几个宏定义,如下所示:

      1)、#define GPIO1                 ((     GPIO_TypeDef *)     GPIO1_BASE)

      上面这个宏是把GPIO1指向芯片GPIO1的基址上,

      2)、#define GPIO1_BASE            (GPIO_BASE + 0x00020)

      3)、#define GPIO_BASE             (0x2009C000UL)

    这三个宏就把GPIO的基址定义了出来,关于LPV1768内部地址的分配情况,可以参看它的数据手册,也可参考一下《ARM Cortex-M3 权威指南》,这本书在网上有电子书,好像宋岩宁牛人早已把它翻译成中文了,懒猫现在也正在参考这本书,另外一定要多去NXP网站看一下它的handbook,whitepaper等资料,还可多到论坛转转,有些坛子里深藏了好多老鸟,好多大虾,好多大牛,有你学的,有你问的,只要肯用心,一根网线,能解决很多问题。


关键字:Cortex-M3  处理器  GPIO 引用地址:Cortex-M3处理器的GPIO实验自学

上一篇:基于keil C mdk开发环境的stm32的USB接口单片机程序设计
下一篇:Cortex-M3处理器按键实验程序自学

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

基于微处理器的S12ZVM-EFP燃油泵方案介绍
燃油泵是汽车内非常重要的一个部件,目前绝大部分的 电动 燃油泵都是采用直流有刷电机来控制的,但基于无刷直流电机的电动燃油泵越来越受欢迎,特别是在高端品牌汽车。本方案可以满足这个开发需求。 一、S12ZVM-EFP 方案介绍 本方案以 S12ZVML128 为主控,S12ZVM 系列产品是 NXP 推出的汽车级 电机控制 单芯片集成方案,其将 微处理器 、电源、驱动及各种模拟外设集成在一起,最大化节省 PCB 尺寸,集成度非常高,稳定可靠,既有单电阻方案、也有双电阻方案,是 EFP(电动燃油泵)、冷却风扇、暖通风机等 PMSM/BLDC 电机应用的绝佳选择。本方案主要特点如下: 1)支持 12V 电源输入,支持功率高
[汽车电子]
基于微<font color='red'>处理器</font>的S12ZVM-EFP燃油泵方案介绍
基于MPC8260处理器和FPGA的DMA接口设计
   引言   在基于软件无线电的某无线通信信号侦收平台的设计中,天线接收到的信号经过变频器处理和A/D变换之后,经过高速通道把采集的信号送入主控板进行数据分发处理。系统的结构框图如图1所示。 图1 主控板的系统结构框图   主控板的硬件核心是嵌入式微处理器MPC8260,负责系统软件的加载、数据的分发以及与外界命令控制的交互。软件上,采用高性能的VxWorks嵌入式实时操作系统。从天线接收到的射频信号经过变频和A/D变换之后作为数据源连接到FPGA,FPGA对接收到的数据进行中频变换和信道估计等预处理后,在CPU的控制下将数据传输到本地内存,最后CPU对数据打包后进行快速分发。因此,将40~50 Mbps的高速数据流从
[嵌入式]
基于MPC8260<font color='red'>处理器</font>和FPGA的DMA接口设计
数字信号处理器概论
数字信号处理学科与数字信号处理器   数字信号处理(DSP)自1965年由Cooley和Tukey提出DFT(离散傅里叶变换)的高效快速算法(Fourier Transform,简称FFT)以来,已有近40年的历史。随着计算机和信息技术的发展,数字信号处理技术已形成一门独立的学科系统。数字信号处理作为一门独立学科是围绕着三个方面迅速发展的:理论、现实和应用。作为数字信号理论,一般是指利用经典理论(如数字、信号与系统分析等)作为基础而形成的独特的信号处理理论,以及各种快速算法和各类滤波技术等基础理论。由此在各个应用领域如语音与图象处理、信息的压缩与编码、信号的调制与调解、信道的辨识与均衡、各种智能控制与移动通讯等都延伸出各
[应用]
STM32F103的GPIO 模式区分
四种输入模式: 上拉输入模式(GPIO_Mode_IPU):默认模式下(GPIO没有输入)读取的GPIO引脚数据为1,高电平。 下拉输入模式(GPIO_Mode_IPD):默认模式下(GPIO没有输入)读取的GPIO引脚数据为0,低电平。 浮空输入模式(GPIO_Mode_IN_FLOATING):既没有上拉也没有下拉,引脚电压为不确定值。(主要用于来做 I2C,USART的接收端) 模拟输入模式(GPIO_Mode_AIN):关闭了斯密特触发器,不接上拉下拉电阻,经由另一个线路把电压信号传送到片上外设模块。(主要用于ADC外设的时候) 四种输出模式: 推挽输出模式(GPIO_Mode_Out_PP):输出 0
[单片机]
STM8L探索套件学习笔记-GPIO端口操作(一)
STM8与STM32一样提供了固件库函数,方便用户快速开发,不需要花费很多时间去查寄存器。不过没有STM32的库完善,给的说明文档是chm格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载,今天按照官方给的模板自己做个模板文件夹,方便后期的移植,这样就不要再重复设置了。首先我们看看GPIO模块,在用固件库之前先了解下GPIO里面的大体的寄存器,方便后期使用固件库。缺点是你所以输入的参数都会检测是否符合规范,必须得按照库函数里面定义的参数写。 GPIO寄存器有:输出寄存器(ODR),输入寄存器(IDR),方向寄存器(DDR),控制寄存器1(CR1)和控制寄存器2(CR2).后面三个寄存器组和可
[单片机]
STM8L探索套件学习笔记-<font color='red'>GPIO</font>端口操作(一)
香蕉派M2开箱:全志四核处理器和千兆以太网口
香蕉派M2开箱——全志四核处理器、千兆口,碉堡了!
[机器人]
恩智浦推出家用/小型商用网关解决方案
德克萨斯州奥斯丁(恩智浦FTF 2016)2016年5月16日讯 随着当今千兆位级网络服务愈发普及,恩智浦半导体(NXP Semiconductors N.V.)(纳斯达克代码:NXPI)推出了革命性的高速家用和中小企业级(SMB)商用宽带网关平台。该平台拥有绝佳的可扩展性,可提供从极低功耗的1Gbps到20Gbps双向有线/WiFi高端服务的性能。 恩智浦今天发布了广受欢迎的家用网关解决方案的新产品系列,覆盖了高性能和高性价比市场。该系列通用平台满足广泛的功率和性能需要,并共享通用的架构环境、API和软件。该平台基于OpenWrt操作系统,可无缝将数据包处理卸载至更加高效的硬件加速器上,极大提升了数据吞吐量和整体服务质量,为用户
[网络通信]
stm32gpio的工作模式
1、推挽输出 可以输出高、低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补 信号 的控制,总是在一个三极管导通的时候另一个截止。高低电平由 IC 的 电源 决定。 推挽电路是两个 参数 相同的三极管或 MOSFET ,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌 电流 ,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 2、开漏输出 输出端相当于三极管的集电极,要得到高电平状态需要上拉 电阻 才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。 3、浮空输入 对于浮空输
[单片机]
stm32<font color='red'>gpio</font>的工作模式
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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