免费预览已结束,剩余2页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、不使用库函数的IO口操作Systick 部分内容属于NVIC控制部分,一共有4个寄存器SysTick_CTRL,0xE000E010-控制寄存器默认值:0x0000 0004SysTick_LOAD, 0xE000E014-重载寄存器默认值:0x0000 0000SysTick_VAL,0xE000E018-当前值寄存器默认值:0x0000 0000SysTick_CALIB,0xE000E01C-校准值寄存器默认值:0x0002328SysTick_CTRL 寄存器内有4个bit具有意义第0位:ENABLE,Systick 使能位(0:关闭Systick功能;1:开启Systick功能)第1位:TICKINT,Systick 中断使能位(0:关闭Systick中断;1:开启Systick中断)第2位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为系统时钟)第16位:COUNTFLAG,Systick计数比较标志IO口的位操作实现该部分代码实现对STM32各个IO口的位操作,包括读入和输出。当然在这些函数调用之前,必须先进行IO口时钟的使能和IO口功能定义。此部分仅仅对IO口进行输入输出读取和控制。代码如下: #define BITBAND(addr, bitnum) (addr & 0xF0000000)+0x2000000+(addr &0xFFFFF)5)+(bitnum2) #define MEM_ADDR(addr) *(volatile unsigned long *)(addr) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum) /IO口地址映射#define GPIOA_ODR_Addr (GPIOA_BASE+12) /0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) /0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) /0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) /0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) /0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE+12) /0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) /0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) /0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) /0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE+8) /0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE+8) /0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE+8) /0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE+8) /0x40011A08 55 #define GPIOG_IDR_Addr (GPIOG_BASE+8) /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) /输入以上代码的实现得益于CM3的位带操作,具体的实现比较复杂,请参考第五章(87页92页)。有了上面的代码,我们就可以像51/AVR一样操作STM32的IO口了。比如,我要PORTA的第七个IO口输出1,则可以使用PAout(6)=1;既可以实现。我要判断PORTA的第15个位是否等于1,则可以使用if(PAin(14)=1);就可以了。另种方式:(基本上做出来了)我的STM32板子PA0和PA1接的LED灯,所以先映射这两位。 查看手册中的寄存器组起始地址(原文件名:地址.jpg)引用图片GPIOA是0x40010800 GPIOD是0x4001 1400端口输出数据寄存器(GPIOx_ODR)的偏移地址是0x0c 根据公式:别名区=ADDRESS=0x42000000+(0x0001080C*0x20)+(bitx*4);bitx:第x位 得到PA.0和PA.1的别名区地址 #definePA_Bit0(volatileunsignedlong*)(0x42210180) #definePA_Bit1(volatileunsignedlong*)(0x42210184) /42228180#define PD_Bit7 (volatileunsignedlong*)(0x4222819C)#define PD_Bit13 (volatileunsignedlong*)(0x422281CC)#define PD_Bit3 (volatileunsignedlong*)(0x4222818C)#define PD_Bit4 (volatileunsignedlong*)(0x42228190)接下来就可以对PA.0和PA.1进行位操作了 *PA_Bit0=1;/PA.0置1 *PA_Bit1=0;/PA.1置0 还可以读出这一位的值: while(1) *PA_Bit1=(*PA_Bit1); Delay(1000);/延时1秒 PA.1接的LED会闪烁。 由于对STM32的存储结构不了解,0x42000000不知道是从哪里来的。后来看到了一个PDF文档 (原文件名:存储.jpg)引用图片原来0x42000000是外设别名区域的地址。 我也是刚刚学习STM32,有错误的地方请大家指点。3、使用库函数,如下部分程序对IO的操作。while(1) /* Turn on LD1 */ GPIO_SetBits(GPIOD, GPIO_Pin_8); /* Insert delay */ Delay(0xAFFFF); /* Turn on LD2 and LD3 */ GPIO_SetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10); /* Turn off LD1 */ GPIO_ResetBits(GPIOD, GPIO_Pin_8); /* Insert delay */ Delay(0xAFFFF); /* Turn on LD4 */ GPIO_SetBits(GPIOD, GPIO_Pin_11); /* Turn off LD2 and LD3 */ GPIO_ResetBits(GPIOD, GPIO_Pin_10 | GPIO_Pin_9); /* Insert delay */ Delay(0xAFFFF); /* Turn off LD4 */ GPIO_ResetBits(GPIOD, GPIO_Pin_11); 4、 IO1PIN=(IO1PIN&0xff00ffff)|(Reg_Code&0xff)IDR)的值。输出值照样设定,不过输出pin脚可能要硬件上上拉。此外,每个IO口均可以单独设置,比如,A口的高八位可以设置为下拉输入,低八位可以设置为推挽输出,用 PA8的电平状态控制PA0 的IO设置如下: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; / 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; / 最高输出速率50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); / 选择A端口 初始化外设GP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年春季人力资源管理师二级考试模拟试卷及答案
- 2025年白城市保安员招聘考试题库附答案解析
- 顺风车考试题库及答案
- 2025年湖南省邵阳中小学教师招聘考试卷附答案
- 二手车鉴定评估题库及答案
- 技术项目评估与规划制定工具集
- 2025年煤矿机电运输安全管理人员理论考试题库(浓缩300题)
- 业务谈判信息收集与记录模板
- 电工证考试试题及答案(试卷及答案)
- 2025年公务员时事政治热点试题解析+答案
- 工业厂房安全生产管理细则
- 贵州辅警面试题目及答案
- 2025年(完整版)大学英语四级真题及答案(多套题及详解)
- 2026年能源加工公司煤炭料场管理制度
- 仓储物流月工作总结
- 全国大学生职业规划大赛《社区康复》专业生涯发展展示【高职(专科)】
- 安全生产警示标志教案(2025-2026学年)
- 黑马程序员课件Java
- T-CHATA 023-2022 结核病定点医疗机构结核感染预防与控制规范
- 2025年中国素描本行业市场分析及投资价值评估前景预测报告
- 生产成本控制及核算数据表格模板
评论
0/150
提交评论