在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. 斐波那契数列的实现(C语言)

    int fibonacci(int positon){ if(position==1||position==2){ return 1; } return fibonacci(position-1)+f ...

  2. [深度学习][图像处理][毕设][笔记][安装环境][下载地址]安装VS2013、matconvnet、cuda、cudnn过程中产生的一些记录,2018.5.6号

    最近半个多月,被cuda等软件折磨的死去活来,昨天下午,终于安装好了环境,趁着matlab正在,在线下载VOT2016数据集,3点睡眼惺忪被闹醒后,睡不着,爬上来写这份记录. 先记录一下自己电脑的基本 ...

  3. Head First设计模式——命令模式

    前言:命令模式我们平常可能会经常使用,如果我们不了解命令模式的结构和定义那么在使用的时候也不会将它对号入座. 举个例子:在winform开发的时候我们常常要用同一个界面来进行文件的下载,但是并不是所有 ...

  4. idea2017建立jsp工程及tomcat等配置

    1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...

  5. nyoj 82-迷宫寻宝(一) (多重BFS)

    82-迷宫寻宝(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:5 难度:4 题目描述: 一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个 ...

  6. Docker从入门到实践(1)

    一.Docker简介 1.1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多 ...

  7. (二十九)golang--map

    map:是key-value数据结构,又称为字段或者关联数组,类似其它编程语言的集合: 基本语法:var 名称 map[键类型]值类型 key的类型可以是:bool.数字.string.指针.管道,还 ...

  8. UML:类图关系总结

    UML类图几种关系的总结,泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Reali ...

  9. opencv 4 图像处理(2 形态学滤波:腐蚀与膨胀,开运算、闭运算、形态学梯度、顶帽、黑帽)

    腐蚀与膨胀 膨胀(求局部最大值)(dilate函数) #include <opencv2/core/core.hpp> #include <opencv2/highgui/highg ...

  10. socket解决编码解码问题

    MySocket类: import socket class MySocket(socket.socket): # 继承自socket文件中的socket类,此时socket就是父类 def __in ...