按关键词阅读: IO 操作 STM32
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) / 。
【STM32|STM32-IO口操作】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 。
稿源:(未知)
【傻大方】网址:/a/2021/0905/0024107226.html
标题:STM32|STM32-IO口操作