在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. Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!

    maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...

  2. 产品分析:华为短信APP体验的问题和建议

  3. P0-Logisim简单部件与有限状态机

    #自学了6week,pre都挂了,做了做P0课下测试,觉得自己对有限状态机概念的的理解,特别是牵扯到时序还是很模糊:状态的抽象也不够熟练:logisim和Verilog的实现也存在问题.网上针对性的l ...

  4. hdu 1874 畅通工程续 (dijkstra(不能用于负环))

    畅通工程续Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. nyoj 324-猴子吃桃问题 (m[i] = (m[i-1] + 1) * 2)

    324-猴子吃桃问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:20 提交数:21 难度:0 题目描述: 有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法, ...

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

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

  7. runlevel init

    init概念存在于cnetos7以下,配置文件/etc/inittab init 以及 文本和图形界面切换(可以用ctrl+alt+n 或者 init3 5切换,不是重启切) 命令init N 0 关 ...

  8. 简单说说基于JWT的token认证方式

    一.什么是认证 好多人不知道什么是认证,认证,其实就是服务端确认用户身份.Http协议是无状态的,客户端发送一条请求,服务端返回一条响应,二者就算做成一单买卖,一拍两散.在很久以前,互联网所能提供的服 ...

  9. Freemarker + xml 实现Java导出word

    前言 最近做了一个调查问卷导出的功能,需求是将维护的题目,答案,导出成word,参考了几种方案之后,选择功能强大的freemarker+固定格式之后的wordxml实现导出功能.导出word的代码是可 ...

  10. Nginx 匹配流程一览

    在 nginx server 模块中,location 的定义长被用来匹配一个标准的 URI, 并根据 URI 的不同做出相应的服务方案. nginx location 匹配的优先级 在 locati ...