在stm32众多项目开发中,有太多的对io进行操作,若置1或清0,使用官方库提供的函数,固然方便,规范,但是需要包含标准的库,尺寸较大,还得处理不同版本兼容问题,包括io初始化也太繁琐,于是操作原子等例程进行精简,

初始化如下,变得如此简单:适用于stm32f和stm32L

void Init_Io(void)
{
JTAG_Set(SWD_ENABLE); //开启SWD
RCC->APB2ENR|=1<<6;//先使能外设PORTE时钟
RCC->APB2ENR|=1<<5;//先使能外设PORTD时钟
RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟
RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
RCC->APB2ENR|=1<<2;//先使能外设PORTA时钟
RCC->APB2ENR|=1<<0; //开启辅助时钟
JTAG_Set(SWD_ENABLE); //开启SWD
//AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
//AFIO->MAPR|=0X02000000; //设置jtag模式

//PORTC6~10复用推挽输出
GPIOA->CRL&=0XFFFF0000;
GPIOA->CRL|=0X00003333;
GPIOA->ODR|=0Xffff;
//PORTC 推挽输出

头文件

#ifndef __STM32_IO_H__
#define __STM32_IO_H__

// taobao:ccjt.taobao.com
//#include "stm3"
///////////////////////////////////////////////////////////////
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#if defined(STM32L1XX_MD) || defined(STM32L1XX_HD)|| defined(STM32L1XX_MD_PLUS)
#define OFFSET_O 0x14
#define OFFSET_I 0x10
#elif defined (STM32F10X_MD) || defined (STM32F10X_HD) || defined (STM32F10X_XL) || defined (STM32F10X_CL)
#define OFFSET_O 0x0c
#define OFFSET_I 0x08
#else
#error "11222"
#endif
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+OFFSET_O) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+OFFSET_O) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+OFFSET_O) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+OFFSET_O) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+OFFSET_O) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+OFFSET_O) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+OFFSET_O) //0x40011E0C

#define GPIOA_IDR_Addr (GPIOA_BASE+OFFSET_I) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+OFFSET_I) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+OFFSET_I) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+OFFSET_I) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+OFFSET_I) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+OFFSET_I) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+OFFSET_I) //0x40011E08

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入

#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入

#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入

#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入

#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入

#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入

#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
/////////////////////////////////////////////////////////////////
//Ex_NVIC_Config专用定义
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define GPIO_D 3
#define GPIO_E 4
#define GPIO_F 5
#define GPIO_G 6
#define FTIR 1 //下降沿触发
#define RTIR 2 //上升沿触发
/////////////////////////////////////////////////////////////////
//JTAG模式设置定义
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00

#endif

每个项目的头文件如下

#ifndef __HW_CFG_H__
#define __HW_CFG_H__
#define SMART

#ifdef SMART
//LED端口定义
#define LED0 PAout(15)// PA15
#define LED1 PAout(8) // PA8
#define LED2 PDout(13)
#define LED3 PDout(14)
#define LED4 PDout(15)
#define LCD_CS_SET GPIOA->BSRR=1<<0 //片选端口
#define LCD_RS_SET GPIOA->BSRR=1<<1 //数据/命令
#define LCD_WR_SET GPIOA->BSRR=1<<3 //写数据
#define LCD_RD_SET GPIOA->BSRR=1<<2 //读数据

#define LCD_CS_CLR GPIOA->BRR=1<<0 //片选端口
#define LCD_RS_CLR GPIOA->BRR=1<<1 //数据/命令
#define LCD_WR_CLR GPIOA->BRR=1<<3 //写数据
#define LCD_RD_CLR GPIOA->BRR=1<<2 //读数据
#define LCD_PORT GPIOB
// 20150128
// cckj 2011-12-22 0 1 2 3
//PB0~15,作为数据线
#define DATAOUT(x) LCD_PORT->ODR=x; //数据输出
#define DATAIN LCD_PORT->IDR; //数据输入

#define PEN PAin(9) //PC1 INT
#define DOUT PAin(6) //PC2 MISO
#define TDIN PAout(7) //PC3 MOSI
#define TCLK PAout(5) //PC0 SCLK
#define TCS PAout(4) //PC13 CS

stm32 io操作 头文件规范的更多相关文章

  1. 文件IO操作..修改文件的只读属性

    文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...

  2. 八. 输入输出(IO)操作7.文件的随机读写

    Java.io 包提供了 RandomAccessFile 类用于随机文件的创建和访问.使用这个类,可以跳转到文件的任意位置读写数据.程序可以在随机文件中插入数据,而不会破坏该文件的其他数据.此外,程 ...

  3. 八. 输入输出(IO)操作6.文件与目录管理

    目录是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率.Java 语言在 java.io 包中定义了一个 File 类专门用来管理磁盘文件和目录. 每个 Fi ...

  4. .NET中的IO操作之文件流

    读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...

  5. .NET中的IO操作之文件流(一)

    读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...

  6. 八. 输入输出(IO)操作8.文件的压缩处理

    Java.util.zip 包中提供了可对文件的压缩和解压缩进行处理的类,它们继承自字节流类OutputSteam 和 InputStream.其中 GZIPOutputStream 和 ZipOut ...

  7. 基于Java语言的IO操作(文件复制)

    public static void main(String[] args) { //获取复制开始前系统时间毫秒值 long start=System.currentTimeMillis(); //文 ...

  8. 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )

    博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...

  9. 【Linux 应用编程】文件IO操作 - 常用函数

    Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...

随机推荐

  1. go 学习笔记之咬文嚼字带你弄清楚 defer 延迟函数

    温故知新不忘延迟基础 A "defer" statement invokes a function whose execution is deferred to the momen ...

  2. [Error]使用了未经检查或不安全的操作...

    编译错误注: MethodReflect.java使用了未经检查或不安全的操作.注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译. 解决:在类前面加入下面一句解决 @Suppr ...

  3. Mac上sonar插件的安装及使用

    本文主要讲解sonar的安装及使用. 分为两个维度来讲解 1. 使用sonarqube以及自带的Derby数据库 2. 使用sonarqube以及配置mysql数据库 ---------------- ...

  4. DAL

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;u ...

  5. java中hashmap容量的初始化

    HashMap使用HashMap(int initialCapacity)对集合进行初始化. 在默认的情况下,HashMap的容量是16.但是如果用户通过构造函数指定了一个数字作为容量,那么Hash会 ...

  6. 小白学 Python 爬虫(2):前置准备(一)基本类库的安装

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 本篇内容较长,各位同学可以先收藏后再看~~ 在开始讲爬虫之前,还是先把环境搞搞好,工欲善其事必先利其器嘛~~~ 本篇 ...

  7. 关键路径法(Critical Path Method, CPM)

    1.活动节点描述及计算公式 通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析. 产生目的:为了解决,在庞大而复杂的项目中,如何合理而有效地组织人力.物力和财力,使之在有限资源 ...

  8. 消除router-link 的下划线问题

    <div class="small-size"> <router-link to="/About"> <img src=" ...

  9. mysql的属性zerofill

    一.字段中zerofill属性的类似定义方式 SQL语句:字段名 int(M) zerofill 二.zerofill属性的作用 1.插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上 ...

  10. 新闻网页通用抽取器GNEv0.04版更新,支持提取正文图片与源代码

    GeneralNewsExtractor以下简称GNE是一个新闻网页通用抽取器,能够在不指定任何抽取规则的情况下,把新闻网站的正文提取出来. 我们来看一下它的基本使用方法. 安装 GNE 使用 pip ...