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优化激进。


更多推荐

所有评论(0)