码迷,mamicode.com
首页 > 其他好文 > 详细

GPIO

时间:2017-11-18 11:08:42      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:ice   gpo   div   data   保留   ati   sse   内容   包含   

  1 /*!
  2  *     COPYRIGHT NOTICE
  3  *     Copyright (c) 2013,野火科技
  4  *     All rights reserved.
  5  *     技术讨论:野火初学论坛 http://www.chuxue123.com
  6  *
  7  *     除注明出处外,以下所有内容版权均属野火科技所有,未经允许,不得用于商业用途,
  8  *     修改内容时必须保留野火科技的版权声明。
  9  *
 10  * @file       MK60_gpio.c
 11  * @brief      gpio驱动函数
 12  * @author     野火科技
 13  * @version    v5.0
 14  * @date       2013-06-26
 15  */
 16 
 17 /*
 18  * 包含头文件
 19  */
 20 #include "common.h"
 21 #include "MK60_port.h"
 22 #include "MK60_gpio.h"
 23 
 24 /*
 25  * 定义数组
 26  */
 27 GPIO_MemMapPtr GPIOX[PTX_MAX] = {PTA_BASE_PTR, PTB_BASE_PTR, PTC_BASE_PTR, PTD_BASE_PTR, PTE_BASE_PTR}; //定义五个指针数组保存 GPIOX 的地址
 28 
 29 
 30 
 31 /*!
 32  *  @brief      初始化gpio
 33  *  @param      PTxn    端口
 34  *  @param      cfg     引脚方向,0=输入,1=输出
 35  *  @param      data    输出初始状态,0=低电平,1=高电平 (对输入无效)
 36  *  @since      v5.0
 37  *  Sample usage:       gpio_init (PTA8, GPI,0);    //初始化 PTA8 管脚为输入
 38  */
 39 void gpio_init (PTXn_e ptxn, GPIO_CFG cfg, uint8 data)
 40 {
 41     //复用管脚为GPIO功能
 42     port_init( ptxn, ALT1);
 43 
 44     //端口方向控制输入还是输出
 45     if(  cfg == GPI )
 46     {
 47         //设置端口方向为输入
 48         GPIO_PDDR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn));       // GPIO PDDR 管脚号 清0,即对应管脚配置为端口方向输入
 49     }
 50     else
 51     {
 52         //设置端口方向为输出
 53         GPIO_PDDR_REG(GPIOX_BASE(ptxn)) |= (1 << PTn(ptxn));        // GPIO PDDR 管脚号 置1,即对应管脚配置为端口方向输出
 54 
 55         //端口输出数据
 56         if(data == 0)
 57         {
 58             GPIO_PDOR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn));   // GPIO PDOR 管脚号 清0,即对应管脚配置为端口输出低电平
 59         }
 60         else
 61         {
 62             GPIO_PDOR_REG(GPIOX_BASE(ptxn))  |= (1 << PTn(ptxn));   // GPIO PDOR 管脚号 置1,即对应管脚配置为端口输出高电平
 63         }
 64     }
 65 }
 66 
 67 /*!
 68  *  @brief      设置引脚数据方向
 69  *  @param      PTxn    端口
 70  *  @param      cfg     引脚方向,0=输入,1=输出
 71  *  @since      v5.0
 72  *  Sample usage:       gpio_ddr (PTA8, GPI);    //设置 PTA8 管脚为输入
 73  */
 74 void    gpio_ddr   (PTXn_e ptxn, GPIO_CFG cfg)
 75 {
 76     //端口方向控制输入还是输出
 77     if(  cfg == GPI )
 78     {
 79         //设置端口方向为输入
 80         GPIO_PDDR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn));           // GPIO PDDR 管脚号 清0,即对应管脚配置为端口方向输入
 81     }
 82     else
 83     {
 84         //设置端口方向为输出
 85         GPIO_PDDR_REG(GPIOX_BASE(ptxn)) |= (1 << PTn(ptxn));            // GPIO PDDR 管脚号 置1,即对应管脚配置为端口方向输出
 86     }
 87 }
 88 
 89 /*!
 90  *  @brief      设置引脚状态
 91  *  @param      PTxn    端口
 92  *  @param      data    输出初始状态,0=低电平,1=高电平 (对输入无效)
 93  *  @since      v5.0
 94  *  @warning    务必保证数据方向为输出(DEBUG模式下,有断言进行检测)
 95  *  Sample usage:       gpio_set (PTA8, 1);    // PTA8 管脚 输出 1
 96  */
 97 void gpio_set (PTXn_e ptxn, uint8 data)
 98 {
 99     ASSERT( BIT_GET( GPIO_PDDR_REG(GPIOX_BASE(ptxn)) , PTn(ptxn)) == GPO ); // 断言,检测 输出方向是否为输出
100                                                                             // 获取 GPIO PDDR 管脚号 ,比较是否为输出
101 
102     //端口输出数据
103     if(data == 0)
104     {
105         GPIO_PDOR_REG(GPIOX_BASE(ptxn)) &= ~(1 << PTn(ptxn));   // GPIO PDOR 管脚号 清0,即对应管脚配置为端口输出低电平
106     }
107     else
108     {
109         GPIO_PDOR_REG(GPIOX_BASE(ptxn))  |= (1 << PTn(ptxn));   // GPIO PDOR 管脚号 置1,即对应管脚配置为端口输出高电平
110     }
111 }
112 
113 
114 /*!
115  *  @brief      反转引脚状态
116  *  @param      PTxn    端口
117  *  @since      v5.0
118  *  @warning    务必保证数据方向为输出(DEBUG模式下,有断言进行检测)
119  *  Sample usage:       gpio_turn (PTA8);    // PTA8 管脚 输出 反转
120  */
121 void gpio_turn (PTXn_e ptxn)
122 {
123     ASSERT( BIT_GET( GPIO_PDDR_REG(GPIOX_BASE(ptxn)) , PTn(ptxn)) == GPO ); // 断言,检测 输出方向是否为输出
124                                                                             // 获取 GPIO PDDR 管脚号 ,比较是否为输出
125 
126     GPIO_PTOR_REG( GPIOX_BASE(ptxn))  =  1 << (PTn(ptxn ));                 // GPIO PTOR ptxn 置1,其他清0 ,即对应管脚配置为端口输出反转,其他位不变
127                                                                             // 此处不能用 BIT_SET 这个宏来置1 ,因为必须保证其他位 不变,其他位直接清0即可
128 }
129 
130 /*!
131  *  @brief      读取引脚输入状态
132  *  @param      PTxn    端口
133  *  @return     管脚的状态,1为高电平,0为低电平
134  *  @since      v5.0
135  *  @warning    务必保证数据方向为输入(DEBUG模式下,有断言进行检测)
136  *  Sample usage:       uint8 pta8_data = gpio_get (PTA8);    // 获取 PTA8 管脚 输入电平
137  */
138 uint8 gpio_get(PTXn_e ptxn)
139 {
140     ASSERT( BIT_GET( GPIO_PDDR_REG(GPIOX_BASE(ptxn)) , PTn(ptxn)) == GPI ); // 断言,检测 输出方向是否为输入
141                                                                             // 获取 GPIO PDDR 管脚号 ,比较是否为输入
142 
143     return ((GPIO_PDIR_REG(GPIOX_BASE(ptxn)) >> PTn(ptxn )) & 0x01);        // 获取 GPIO PDIR ptxn 状态,即读取管脚输入电平
144 }

 

GPIO

标签:ice   gpo   div   data   保留   ati   sse   内容   包含   

原文地址:http://www.cnblogs.com/scrazy/p/7856009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!