stm32 io操作 头文件规范
在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操作 头文件规范的更多相关文章
- 文件IO操作..修改文件的只读属性
文件的IO操作..很多同行的IO工具类都是直接写..但是如果文件有只读属性的话..则会写入失败..所以附加了一个只读的判断和修改.. 代码如下: /// <summary> /// 创建文 ...
- 八. 输入输出(IO)操作7.文件的随机读写
Java.io 包提供了 RandomAccessFile 类用于随机文件的创建和访问.使用这个类,可以跳转到文件的任意位置读写数据.程序可以在随机文件中插入数据,而不会破坏该文件的其他数据.此外,程 ...
- 八. 输入输出(IO)操作6.文件与目录管理
目录是管理文件的特殊机制,同类文件保存在同一个目录下不仅可以简化文件管理,而且还可以提高工作效率.Java 语言在 java.io 包中定义了一个 File 类专门用来管理磁盘文件和目录. 每个 Fi ...
- .NET中的IO操作之文件流
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- .NET中的IO操作之文件流(一)
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- 八. 输入输出(IO)操作8.文件的压缩处理
Java.util.zip 包中提供了可对文件的压缩和解压缩进行处理的类,它们继承自字节流类OutputSteam 和 InputStream.其中 GZIPOutputStream 和 ZipOut ...
- 基于Java语言的IO操作(文件复制)
public static void main(String[] args) { //获取复制开始前系统时间毫秒值 long start=System.currentTimeMillis(); //文 ...
- 【UNIX环境高级编程】文件 IO 操作 一 ( open | close | creat | lseek | write | read )
博客地址 : http://blog.csdn.net/shulianghan/article/details/46980271 一. 文件打开关闭操作相关函数介绍 1. open 函数 (1) op ...
- 【Linux 应用编程】文件IO操作 - 常用函数
Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...
随机推荐
- Chrome Extension 小试牛刀
自从有了Chrome以后,就喜欢上了这个浏览器,从此IE 886了. 以前作爬虫,做登录,做数据采集,做数据处理等各种功能,后来H5出来后,出现了,除了Session/Cookie 出了Local S ...
- MySQL开发规范与使用技巧总结
命名规范 1.库名.表名.字段名必须使用小写字母,并采用下划线分割. a)MySQL有配置参数lower_case_table_names,不可动态更改,Linux系统默认为 0,即库表名以实际情况存 ...
- java编程思想第四版第三章要点习题
使用"简短的" 和正常的 打印语句来编写一个程序 package net.mindview.util; public class Print { /** * 不带有回车 * @pa ...
- JMeter从0开始-笔记
1.安装Jmeter之前 安装Jmeter之前需要先配置Java环境,我们下载的是jmeter4.0,所以java版本最好是选用java8以上的版本. 安装JDk1.6的步骤如下: 点击下载的JDK文 ...
- 转:MySQL中变量的定义和变量的赋值使用(转)
MySQL中变量的定义和变量的赋值使用(转) 说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin...end块中,而普通的变量定义和使用都说的比较 ...
- JavaScript笔记九
1.数组方法 reverse() - 可以用来反转一个数组,它会对原数组产生影响 concat() - 可以连接两个或多个数组,它不会影响原数组,而是新数组作为返回值返回 join() - 可以将一个 ...
- Requests小技巧
- HT Vue 集成
(本文中 dataModel = dm = 数据容器, gv = graphView = g2d = 2D 视图) 初始化项目 使用 vue-cli 生成项目.生成注意以下几个问题 1. 建议手动配置 ...
- mysql如何设置主从(读写分离),redis发布功能,以及redis的持久化存储(rdb,aof)
1 mysql基本命令 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroot -p -h 127.0.0.1 3.远程链接mysq ...
- 从别人那里拿过来的工程,在Idea上打开时报错
如果是这个错误:也许原因有很多种,但是不妨试一下⑴将给你项目工程的人的.idea文件夹删除,这样在你导入工程时,会生成一个属于你本地的.idea.⑵最好是使用SVN重新把项目工程检出(把项目下载下来, ...