STM32F407寄存器点灯
一.创建keil 工程
二.代码
1.观察原理图,发现led的gpio引脚为PF9和PF10
1.先使能GPIOF
2.查看F407芯片手册,设置寄存器,查看到GPIOF的基地址是0x4002 3800
又查看到AHB1模式寄存器的偏移地址为0x30,也就是(0x4002 3800+0x30),同时我们要把bit5设置为1,使能
2.配置GPIOF9和F10引脚
查看到GPIOF的基地址是0x4002 1400
又查看到GPIO模式寄存器的偏移地址为0x00,也就是(0x4002 1400+0x00),同时我们要把MODER9和MODER10都设置为01
接着查看到output type寄存器偏移地址为0x04,也就是(0x4002 1400+0x04),同时同时我们要把OT9和OT10都设置为0(推挽输出)
然后查看到speed寄存器偏移地址为0x08,也就是(0x4002 1400+0x08),同时我们要OSPEEDR9和OSPEEDR10都设置为00(低速)
上下拉电阻这边就不配置了,因为硬件上已经配置了上拉电阻
3.配置引脚输出高低电平
查看到寄存器偏移地址为0x18,也就是(0x4002 1400+0x18)
PF9高电平:bit9设置为1 PF9低电平:bit25设置1
PF10高电平:bit10设置为1 PF10低电平:bit26设置为1
void delay(int timeout); void delay(int timeout) { while(timeout --); } int main(void) { volatile unsigned int *pReg9; volatile unsigned int *pReg10; /* 使能GPIOF */ pReg9 = (unsigned int *)(0x40023800 + 0x30); pReg10 = (unsigned int *)(0x40023800 + 0x30); *pReg9 |= (1<<5); *pReg10 |= (1<<5); /* 设置GPIOF9、GPIOF10为输出引脚 */ pReg9 = (unsigned int *)(0x40021400 + 0x00); pReg10 = (unsigned int *)(0x40021400 + 0x00); *pReg9 |= (0x01<<18); *pReg10 |= (0x01<<20); /* 设置GPIOF9、GPIOF10为推挽输出 */ pReg9 = (unsigned int *)(0x40021400 + 0x04); pReg10 = (unsigned int *)(0x40021400 + 0x04); *pReg9 &= ~(1<<9); *pReg10 &= ~(1<<10); /* 设置GPIOF9、GPIOF10为低速输出 */ pReg9 = (unsigned int *)(0x40021400 + 0x08); pReg10 = (unsigned int *)(0x40021400 + 0x08); *pReg9 &= ~(0x03<<18); *pReg10 &= ~(0x03<<20); // pReg9 = (unsigned int *)(0x40021400 + 0x14); // pReg10 = (unsigned int *)(0x40021400 + 0x14); pReg9 = (unsigned int *)(0x40021400 + 0x18); pReg10 = (unsigned int *)(0x40021400 + 0x18); while(1) { /* 设置GPIOF9、GPIOF10输出1 */ *pReg9 |= (1<<9); *pReg10 |= (1<<10); // *pReg9 |= (1<<9); // *pReg10 |= (1<<10); delay(100000); /* 设置GPIOF9、GPIOF10输出0 */ *pReg9 |= (1<<25); *pReg10 |= (1<<26); // *pReg9 &= ~(1<<9); // *pReg10 &= ~(1<<10); delay(100000); } return 0; }三.汇编启动文件
PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD 0 DCD Reset_Handler ; Reset Handler AREA |.text|, CODE, READONLY ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT main LDR SP, =0x20000000 + 0x20000 BL main ENDP END四.注意事项
同时也要注意的一点是控制寄存器需要加volatile
这里要注意的一点是:使用版本5实现,time可以不用加volatile,但是使用版本6实现的话是一定要加volatile,不然会被编译器优化掉。版本6比版本5优化激进。
