STM32-IO口操作

上传人:缘*** 文档编号:213256097 上传时间:2021-11-21 格式:DOCX 页数:12 大小:33.94KB
返回 下载 相关 举报
STM32-IO口操作_第1页
第1页 / 共12页
STM32-IO口操作_第2页
第2页 / 共12页
STM32-IO口操作_第3页
第3页 / 共12页
STM32-IO口操作_第4页
第4页 / 共12页
STM32-IO口操作_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《STM32-IO口操作》由会员分享,可在线阅读,更多相关《STM32-IO口操作(12页珍藏版)》请在金锄头文库上搜索。

1、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 :关闭 Systi

2、ck 功能; 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 口进行输

3、入输出读取和控制。代码如下:#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_Add

4、r (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+#) /0x40011E0C#define GPIOA_IDR_Addr

5、 (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) /0x4001180855#define GPIOF_IDR_Addr (GPIOF_BASE+8) /0x40011A08-#define GPIOG_IDR_Addr (G

6、PIOG_BASE+8) /0x40011E#/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

7、) / 输出#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) /

8、 输出#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 ;既可以实现。我要判断 PO

9、RTA的第15个位是否等于1,则可以使用if (PAin (14) =1 ); 就可以了。另种方式:(基本上做出来了)我的STM32板子PA0和PA1接的LED灯,所以先映射这两位。查看手册中的寄存器组起始地址0x4001 20&0 - 0x4001 23FFGP心端口 GAPB2*A7S,丁0x4t1 2C&Q - 0x4001 23FFGPi。靖口 F格比7 5节0x4001 1800-0x4001 1BFFGPIOUE静仃5IJ0x4001 1400-0x4001 17FFGPI。晁口 D鬼力5节0x4001 1000-0x4001 13FFGFI。端口 C琴KZ5节0X4001 DCO

10、O - 0x4001 OFFFGPO端LIB毂此7 5节0)(40010x4001 obffGPIO2SUA惠更工5宙(原文件名:地址.jpg)引用图片GPIOA 是 0x4001 0800GPIOD 是 0x4001 1400端口输出数据寄存器(GPIOx_ODR)的偏移地址是0x0c根据公式:另I名区 =ADDRESS=0x4200 0000 + (0x0001 080C*0x20) + (bitx*4) ;bitx: 第 x 位得到PA.0和PA.1的别名区地址#define PA_Bit0 (volatile unsigned long *) (0x42210180) #define

11、PA_Bit1 (volatile unsigned long *) (0x42210184)/42228180#define PD_Bit7 (volatile unsigned long *) (0x4222819C)#define PD_Bit13 (volatile unsigned long *) (0x422281CC)#define PD_Bit3 (volatile unsigned long *) (0x4222818C)#define PD_Bit4 (volatile unsigned long *) (0x42228190)接下来就可以对PA.0 和 PA.1 进行位操

12、作了*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的存储结构不了解,0x4200 0000不知道是从哪里来的。后来看到了一个PDF文档表4-2存储区的许可EM设誓类型XN禺速线存代玛OxOOOOOOOO-OxtFFFFFFF常规*WTSRAM0x2W00CX)0-0xjFFfTFFF常规WBWASR AM_hiihatidOxMn.HUFFFFFF内部-外设0x40000 DOEM)x,FFFF

13、FFF设备XX-外设亡0K4 2000000x43 FFF FF F内部*外部RAMOx6DCOOOOO-Ox7FFFFFFF常规-WBWA外部RAMOxSDOOOWO-Ox9FFFFFFF常规-WT外部没备Ox 000 DO 00-OxB F FF FF FF设备XX共用外部设备OxC OOOOOOOOxD F FF FF FF设餐XX专用卧段总线。工EMOOOM - h E00 FFFFFSOXN系统OxE0100000 thFFFFFFFF设备XN(原文件名:存储.jpg)引用图片原来 0x4200 0000 是外设别名区域的地址。我也是刚刚学习 STM32 ,有错误的地方请大家指点。3

14、 、使用库函数,如下部分程序对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)16);/ 将要写

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号