第三课 MC9S08DZ60之通用输出输入GPIO

发布者:数字探险家最新更新时间:2021-04-07 来源: eefocus关键字:MC9S08DZ60  GPIO 手机看文章 扫描二维码
随时随地手机看文章

对于初学单片机的读者,从第二课到第三课,应该会有种豁然开朗的感觉。对的,这节课讨论的是这款芯片的GPIO,很多课程老师用一句话:点亮一个LED灯。但是很不幸的告诉读者,这里不会真正的去点亮一个LED来展示。因为LED的点亮与熄灭,就是驱动单片机的GPIO口,输出高电平和低电平来进行控制,知道如何去设置寄存器,如何操作寄存器使I/O口输出期望的电平,是讲解的重点,本参考课程非常之简单。


1.请读者先阅读芯片资料中Chapter 6 Parallel Input/Output Control的6.1节和6.2节。


6.1节中记住的第一句话是:Reading and writing of parallel I/Os are performed through the port data registers. The direction, either input or output, is controlled through the port data direction registers.(读写并行I/O的操作都是由操作I/O端口数据寄存器来完成,I/O端口的方向,即输入或是输出,由I/O端口数据方向寄存器控制)很多大学生学过51单片机,玩的也很溜,也知道如何操作51单片机的I/O,甚至知晓通过硬件设计来拓展I/O资源。这里要说明下,MC8S08DZ60芯片,以及大部分8位16位和32位芯片,对I/O口的数据方向的控制由专门的数据方向寄存器控制,这点可能与51单片机不一样。


6.1节中第二句话:The data direction control bit (PTxDDn) determines whether the output buffer for the associated pin is enabled, and also controls the source for port data register reads。控制I/O数据方向的寄存器名为PTxDDn,x是不同类的并行I/O口,如PTA口、PTB口等,n为某一类并行口的一个控制位 如PTADD1。


6.1节中第三句话:It is a good programming practice to write to the port data register before changing the direction of a port pin to become an output.(改变端口数据方向前,写入安全的数据到端口数据寄存器)也就是确保单片器I/O初始化后端口数据状态的确定性。


6.2节中第一句话:An internal pull-up device can be enabled for each port pin by setting the corresponding bit in the pull-up enable register (PTxPEn).(芯片内部上拉设备,可以通过设置PTxPEn,来控制每一个I/O端口的上拉情况),另外需要注意!如果并行输入 / 输出控制逻辑或任何外围设备功能将管脚配置为输出,上拉器件就会被禁止,这与对应的上拉寄存器位的状态无关。如果管脚由模拟功能控制(也即I/O口被配置为其他功能口,而不是简单的I/O口),上拉器件同样会被禁止。


6.2节第二句话: When enabled, slew control limits the rate at which an output can transition in order to reduce EMC emissions(该功能启动时,转换控制限制输出的转换速度,减少 EMC 发射)。斜率控制寄存器 (PTxSEn)的设置可以减少EMC的发射,这个还是蛮重要的。另外如果管脚被配置为输出I/O,其设置不会产生任何影响。


6.2节还讲述了一个驱动强度寄存器PTxDSn,该寄存器的功能就是增加I/O管脚的输出和输入电流能力,但会影响到EMC。


2.看芯片管脚图,请读者找出芯片图中的所有的可用的I/O口。分别是PTA0-7、PTB0-7、PTC0-7、PTD0-7、PTE0-7、PTF0-7、PTG0-5,总共有54个管脚可配置为I/O口,其中PTG只有6个管脚。

3.作者要配置和使用的管脚及如何驱动。


工作内容,把PTC0~4管脚设置为输入口,把PTB0~7管脚设置为输入管脚,把PTG4管脚设置为输出,把PTD0~4管脚设置为输入,并操作它们的数据寄存器,进行数据输入和输出(高低电平获取和输出)。


原理图

4.代码部分


头文件H


#ifndef _DATA_TYPE_H_H

#define _DATA_TYPE_H_H

 

typedef char            INT8;

typedef unsigned char   UINT8;

typedef unsigned short  USHORT16;

typedef unsigned int    UNIT16;

typedef unsigned long   ULONG32;

typedef short           SHORT16;

typedef long            LONG32;

typedef unsigned char   BOOL;

#endif


#ifndef _GPIO_H_H

#define _GPIO_H_H

//------------------------------------------------------------------------------

/*PORTA管脚寄存器设置值和对应的移位量shift值*/

//A端口数据寄存器PTAD

//For port A pins that are inputs,reads return the logic level on the pin.

//For Port A pins this are configured as outputs,reads return the last value

//written to this register.

//表1-寄存器设置值-none 不需要

#define PTAD_RESET 0x00

//表2-移位量shift值

#define PTAD0 0

#define PTAD1 1

#define PTAD2 2

#define PTAD3 3

#define PTAD4 4

#define PTAD5 5

#define PTAD6 6

#define PTAD7 7

//A端口数据方向寄存器PTADD

//These read/write bits control the direction of port A pins and what is read 

//for PTAD reads.

//表1-寄存器设置值

#define PTADD_RESET 0x00

#define PTADD0_AS_INPUT  0x00

#define PTADD0_AS_OUTPUT 0x01

#define PTADD1_AS_INPUT  0x00

#define PTADD1_AS_OUTPUT 0x01

#define PTADD2_AS_INPUT  0x00

#define PTADD2_AS_OUTPUT 0x01

#define PTADD3_AS_INPUT  0x00

#define PTADD3_AS_OUTPUT 0x01

#define PTADD4_AS_INPUT  0x00

#define PTADD4_AS_OUTPUT 0x01

#define PTADD5_AS_INPUT  0x00

#define PTADD5_AS_OUTPUT 0x01

#define PTADD6_AS_INPUT  0x00

#define PTADD6_AS_OUTPUT 0x01

#define PTADD7_AS_INPUT  0x00

#define PTADD7_AS_OUTPUT 0x01

#define PTADD_AS_INPUT   0x00

#define PTADD_AS_OUTPUT  0xFF

//表2-移位量shift值

#define PTADD0 0

#define PTADD1 1

#define PTADD2 2

#define PTADD3 3

#define PTADD4 4

#define PTADD5 5

#define PTADD6 6

#define PTADD7 7

//A端口上拉使能寄存器PTAPE

//Each of these control bits determines if the internal pull-up or pull-down

//device is enabled for the associated PTA pin. For port A pins that are configured 

//as outputs, these bits have no effect and the internal pull devices are disabled.

//表1-寄存器设置值

#define PTAPE_RESET 0x00

#define PTAPE0_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE0_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled.  

#define PTAPE1_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE1_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE2_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE2_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE3_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE3_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE4_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE4_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE5_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE5_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE6_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE6_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled. 

#define PTAPE7_PULL_DISABLE 0x00 //Internal pull_up/pull_down device disabled.

#define PTAPE7_PULL_ENABLE  0x01 //Internal pull_up/pull_down device enabled.

#define PTAPE_PULL_DISABLE  0x00 //Internal pull_up/pull_down of PTA all disabled.

#define PTAPE_PULL_ENABLE   0xFF //Internal pull_up/pull_down of PTA all enabled. 

//表2-移位量shift值

#define PTAPE0    0

#define PTAPE1    1

#define PTAPE2    2

#define PTAPE3    3

#define PTAPE4    4

#define PTAPE5    5

#define PTAPE6    6

#define PTAPE7    7

//A端口斜率使能寄存器

//Each of these control bits determines if the output slew rate control

//is enabled for the associated PTA pin. For port A pins that are configured as inputs, 

//these bits have no effect.

//表1-寄存器设置值

#define PTASE_RESET    0xFF

#define PTASE0_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE0_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE1_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE1_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE2_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE2_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE3_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE3_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE4_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE4_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE5_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE5_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE6_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE6_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE7_SLEW_RATE_DISABLE 0x00 //Output slew rate control disabled.

#define PTASE7_SLEW_RATE_ENABLE  0x01 //Output slew rate control enabled.

#define PTASE_SLEW_RATE_DISABLE  0x00 //Output slew rate control for PTA all disabled.

#define PTASE_SLEW_RATE_ENABLE   0xFF //Output slew rate control for PTA all enabled.

//表2-移位量shift值

#define PTASE0  0

#define PTASE1  1

#define PTASE2  2

#define PTASE3  3

#define PTASE4  4

#define PTASE5  5

#define PTASE6  6

#define PTASE7  7

//A端口驱动强度选择寄存器

//Each of these control bits selects between low and high

//output drive for the associated PTA pin. For port A pins that are configured 

//as inputs, these bits have no effect.

//表1-寄存器设置值

#define PTADS_RESET 0x00

#define PTADS0_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS0_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS1_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS1_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS2_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS2_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS3_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS3_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS4_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS4_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS5_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS5_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS6_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS6_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS7_LOW_STRENGTH  0x00 //Low output drive strength selected.

#define PTADS7_HIGH_STRENGTH  0x01 //High output drive strength selected.

#define PTADS_LOW_STRENGTH   0x00 //Low output drive strengh for all PTA.

#define PTADS_HIGH_STRENGTH   0x01 //High output driver strenggh for all PTA.

//表2-移位量shift值

#define PTADS0  0

#define PTADS1  1

#define PTADS2  2

#define PTADS3  3

#define PTADS4  4

#define PTADS5  5

#define PTADS6  6

#define PTADS7  7

//A端口中断状态控制寄存器PTASC

 

//表1-寄存器设置值

//None - configurations are in INTERRUPT mode

//表2-移位量shift值

//A端口中断管教选择寄存器PTAPS

 

//表1-寄存器设置值

//None - configurations are in INTERRUPT mode

//表2-移位量shift值

//A端口中断边沿选择寄存器PTAES

 

//表1-寄存器设置值

//None - configurations are in INTERRUPT mode

//表2-移位量shift值

 

//------------------------------------------------------------------------------

/*PORTB管脚寄存器设置值和对应的移位量shift值*/

//B端口数据寄存器PTBD

//For port B pins that are inputs,reads return the logic level on the pin.

//For Port B pins this are configured as outputs,reads return the last value

[1] [2] [3] [4] [5] [6] [7]
关键字:MC9S08DZ60  GPIO 引用地址:第三课 MC9S08DZ60之通用输出输入GPIO

上一篇:第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1
下一篇:第四课 MC9S08DZ60之实时计数器RTC

推荐阅读最新更新时间:2024-11-05 01:38

STM32开发板例程讲解之二:GPIO的描述和配置
上一讲创建了一个stm32工程,从本讲开始将深入stm32内核与外设讲解。 首先介绍stm32的GPIO,这是入门的起点,也是最容易上手的部分。 一、GPIO的综合描述 stm32每一个GPIO端口拥有2个32bits的configuration寄存器(GPIOx_CRL,GPIOx_CRH),2个32bits的数据寄存器(GPIOx_IDR,GPIOx_ODR),1个32bits的set/reset寄存器(GPIOx_BSRR),1个16bits的reset寄存器(GPIOx_BRR)和1个32bits的Lock寄存器(GPIOx_LCKR)。 (一)每一个IO引脚都可以使用软件配置为以下几种模
[单片机]
GPIO 配置之ODR, BSRR, BRR 详解
用stm32 的配置GPIO 来控制LED 显示状态,可用ODR,BSRR,BRR 直接来控制引脚输出状态. ODR寄存器可读可写:既能控制管脚为高电平,也能控制管脚为低电平。 管脚对于位写1 gpio 管脚为高电平,写 0 为低电平 BSRR 只写寄存器: 既能控制管脚为高电平,也能控制管脚为低电平。 对寄存器高 16bit 写1 对应管脚为低电平,对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作 BRR 只写寄存器:只能改变管脚状态为低电平,对寄存器 管脚对于位写 1 相应管脚会为低电平。写 0 无动作。 刚开始或许你跟我一样有以下疑惑: 1.既然ODR 能控制管脚高低电平为什么还需要BSRR和SRR寄存器? 2.既
[单片机]
<font color='red'>GPIO</font> 配置之ODR, BSRR, BRR 详解
【STM32】1-LED 使用GPIO点灯
前言 本文用于记录学习过程,因个人水平有限,如有错误还请批评指正。 一、目的 使用STM32进行点灯实验 二、使用器材 1、keil 5 2、Proteus 三、Proteus仿真电路 元件包含: 1、STM32F103R6 2、LED-BIRG 3、POWER 4、RES(电阻) 四、keil 5操作 1、芯片选择 2、新建工程的勾选 3、添加main.c文件 五、main.c中的代码 #include stm32f10x.h void delay_ms(int32_t ms);//延时函数声明 int main() { uint8_t k;//LED亮灭计数 /*L
[单片机]
【STM32】1-LED 使用<font color='red'>GPIO</font>点灯
STM32F107以太网配置函数GPIO_ETH_MediaInterfaceConfig
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface) { assert_param(IS_GPIO_ETH_MEDIA_INTERFACE(GPIO_ETH_MediaInterface)); /* Configure MII_RMII selection bit */ *(__IO uint32_t *) MAPR_MII_RMII_SEL_BB = GPIO_ETH_MediaInterface; } STM32很大的优势就是:内部RAM+内部外设寄存器都可以位寻址,这是很难得的。 MAPR_MII_RMII_SEL_B
[单片机]
STM32F107以太网配置函数<font color='red'>GPIO</font>_ETH_MediaInterfaceConfig
STM32F407--GPIO的工作原理
一、参考资料 1、STM32F407ZGT6.pdf(探索者资料盘A7,硬件资料2,芯片资料) 2、STM32F4xx中文参考手册.pdf(探索者资料盘A8,STM32参考资料) 3、STM32F4开发指南-库函数版本_V1.1.pdf(探索者资料盘A) 二、GPIO口的基本结构 三、引脚的说明 注:STM32大部分引脚可以当GPIO口外,还可以复用为外设功能引脚(如串口)。 四、GPIO的工作模式 1、4种输入模式 (1)GPIO_Mode_IN_FLOATING 浮空输入 (2)GPIO_Mode_IPU 上拉输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_AI
[单片机]
STM32F407--<font color='red'>GPIO</font>的工作原理
STM32学习笔记(1):GPIO口的使用
摸索了很久之后终于把ARM开发板上的LED灯点亮了,虽然是很简单的一个IO口操作,但是由于以前从来都没有什么经验,所以浪费了很多时间,也查找了很多资料。现在可以操作IO口了,证明迈出了学习ARM的第一步。 实验平台清单如下: 开发板: 奋斗STRIVE V3 核心芯片: STM32F103VET6 开发环境: RealView MDK-ARM Version:3.50 PC操作系统: Windows 7 家庭普通版 仿真器: SEGGER J-Link 其中,STM32F103VET6芯片是基于ARM Cortex-M3内核的,具体技术参数请参考ST公司给出的芯片资料(http:
[单片机]
STM32总结之GPIO 常用库函数
配置相关函数 1.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数: (1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 (2)GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明: GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。 GPIO_Mode:指定GPIO的模式,有八种模式: GPIO_
[单片机]
(ARM11 S3C6410) ARM11裸机初体验,GPIO寄存器
拿到一款陌生的MCU,通常想的是先跑跑裸机。……通常第一件事是观摩GPIO寄存器。 OK6410开发板电路图。 6410的IO口资源…… 想关的寄存器地址 GPMCON:IO口配备寄存器。 GPMDAT与GPLPUD寄存器。 通常,接触一款新的MCU。个人喜好写一个构件库(观摩完所有的寄存器后,构件就全部写好了)。调用自己写好的构件会很方便。 创建init.s汇编代码 关看门狗 设置堆栈 设置CPU基地址 IMPORT main AREA init,CODE,READONLY PRESERVE8 ENTRY LDR R0, =0x70000000 ORR R
[单片机]
(ARM11 S3C6410) ARM11裸机初体验,<font color='red'>GPIO</font>寄存器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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