2021-10-20

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


原理

GPIO相关寄存器
两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH

两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR

一个32位的置位/复位寄存器:GPIOx_BSRR

一个16位复位寄存器:GPIOx_BRR

一个32位锁定寄存器:GPIOx_LCKR
x为配置使用的端口
GPIO口有八种模式:

1.输入浮空
2.输入上拉
3.输入下拉
4.模拟输入
5.开漏输出
6.推挽式输出
7.推挽式复用功能
8.开漏复用功能

这里点亮LED灯使用推挽输出。

端口1-7为低,端口8-15为高。每个引脚由四个位控制。
本此使用a4,b5,c14端口输出信号对led灯进行控制

一、C语言使用hal库实现流水灯

首先,在stm32cubemx 中选择创建新项目,芯片选择自己使用的芯片。在可视界面中右键选择所需使用的引脚,选择设置为GPIO_OUT,如下图
在这里插入图片描述
在project manager中,设置项目名称和项目放置文件夹,tool_chain/ide和版本选择自己使用的版本,点击generate code,生成后选择打开项目。
在项目内main.c中while循环内输入以下代码:

//                           A灯
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);//灯亮
		HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0);//灯灭		
//                           B灯		
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 1);
		HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);		
//                           C灯		
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, 1);
		HAL_Delay(100);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, 0);		

二、汇编代码实现

代码如下:

 AREA MYDATA, DATA
	
 AREA MYCODE, CODE
	ENTRY
	EXPORT __main
__main
	;GPIOA,B,C使能
    ldr r0, =0x40021018
    ldr r1, =0x0000001c
    str r1, [r0]                


	;配置A4
	ldr r0, =0x40010800
    ldr r1, [r0]
    bic r1, r1, #0x000f0000
    orr r1, r1, #0x00010000
    str r1, [r0]

	;配置B5
    ldr r0, =0x40010c00
    ldr r1, [r0]
    bic r1, r1, #0x00f00000
    orr r1, r1, #0x00100000
    str r1, [r0]
	
	;配置C14
	ldr r0, =0x40011004
    ldr r1, [r0]
    bic r1, r1, #0x0f000000
    orr r1, r1, #0x01000000
    str r1, [r0]


	ldr r0, =0x4001080c
    ldr r1, =0x00000010
    str r1, [r0]

	ldr r0, =5000000;延时
    ldr r1, =0
	
;灯循环
blink
    add r1, r1, #1
    cmp r1, r0
    blt blink
	
	
	ldr r1, =0x4001080c
    ldr r2, [r1]
    eor r2, r2, #0x00000010
    str r2, [r1]
	

	ldr r1, =0x40010c0c
    ldr r2, [r1]
    eor r2, r2, #0x00000020
    str r2, [r1]
	
	ldr r1, =0

blink1	
	add r1, r1, #1
    cmp r1, r0
    blt blink1
	

	ldr r1, =0x40010c0c
    ldr r2, [r1]
    eor r2, r2, #0x00000020
    str r2, [r1]
	

	ldr r1, =0x4001100c
    ldr r2, [r1]
    eor r2, r2, #0x00004000
    str r2, [r1]
	

	ldr r1, =0

blink2
	add r1, r1, #1
    cmp r1, r0
    blt blink2
	

	ldr r1, =0x4001100c
    ldr r2, [r1]
    eor r2, r2, #0x00004000
    str r2, [r1]
	

	ldr r1, =0x4001080c
    ldr r2, [r1]
    eor r2, r2, #0x00000010
    str r2, [r1]
	

	ldr r1, =0
    b blink

	
	END



三.效果

效果如下
请添加图片描述


总结

通过本次实验了解到了关于GPIO寄存器的相关操作以及部分hal库的使用方法,相信本次实验会对接下来的实验奠定的基础。。

Guess you like

Origin blog.csdn.net/weixin_45747542/article/details/120873220