一.创建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优化激进。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐