版权声明:本文为博主原创文章,转载请注明原创链接! https://blog.csdn.net/qq_34706280/article/details/83828870
STM32芯片最简单的实现,控制流水灯。这里代码逻辑不是重点,看明白内存映射,寄存器映射是关键之处。
/*
重点函数解释
经过GPIO_Set,GPIOx就被设置为我们想要的模式了
void GPIO_Set
(
GPIO_TypeDef* GPIOx,
u32 BITx,
u32 MODE,
u32 OTYPE,
u32 OSPEED,
u32 PUPD
)
GPIO_Set形参意义:
GPIOx:GPIOA~GPIOI 选择GPIO,stm32f429xx.h中给予映射
BITx: 0x0000~0xffff 位设置PIN0~PIN15恳桓鑫淮硪桓鯥O,sys中给予映射
//GPIO引脚编号定义
#define PIN0 1<<0
#define PIN1 1<<1
#define PIN2 1<<2
#define PIN3 1<<3
#define PIN4 1<<4
#define PIN5 1<<5
#define PIN6 1<<6
#define PIN7 1<<7
#define PIN8 1<<8
#define PIN9 1<<9
#define PIN10 1<<10
#define PIN11 1<<11
#define PIN12 1<<12
#define PIN13 1<<13
#define PIN14 1<<14
#define PIN15 1<<15
MODE: 模式选择,sys.h中给予映射
GPIO设置专用宏定义
#define GPIO_MODE_IN 0 //普通输入模式
#define GPIO_MODE_OUT 1 //普通输出模式
#define GPIO_MODE_AF 2 //AF功能模式
#define GPIO_MODE_AIN 3 //模拟输入模式
OTYPE: 输出类型选择,sys.h中给予映射
#define GPIO_OTYPE_PP 0 //推挽输出
#define GPIO_OTYPE_OD 1 //开漏输出
OSPEED: 输出速度设置,sys.h中给予映射
#define GPIO_SPEED_2M 0 //GPIO速度2Mhz
#define GPIO_SPEED_25M 1 //GPIO速度25Mhz
#define GPIO_SPEED_50M 2 //GPIO速度50Mhz
#define GPIO_SPEED_100M 3 //GPIO速度100Mhz
PUPD: 上下拉设置,sys.h中给予映射
#define GPIO_PUPD_NONE 0 //不带上下拉
#define GPIO_PUPD_PU 1 //上拉
#define GPIO_PUPD_PD 2 //下拉
#define GPIO_PUPD_RES 3 //保留
注意:
startup_stm32f429xx.s需要将官网提供代码进行修改
修改Reset_Handler函数如下:
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
;IMPORT SystemInit
;寄存器版本代码不需要调用
;库函数版本代码可以留下
IMPORT __main
LDR R0, =0xE000ED88
LDR R1, [R0]
ORR R1, R1, #(0xf << 20)
STR R1, [R0]
;LDR R0, =SystemInit
;BLX R0
LDR R0, =__main
BX R0
ENDP
led.c文件:
#include "led.h"
//LED IO初始化
void LED_Init(void)
{
//使能PORTB时钟
RCC -> AHB1ENR |= 1 << 1;
//根据硬件电路设置PB0、PB1
GPIO_Set(GPIOB, PIN0|PIN1, GPIO_MODE_OUT, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU);
//LED0关闭
LED0 = 1;
//LED1关闭
LED1 = 1;
}
led.h文件:
#ifndef __LED__HH__
#define __LED__HH__
#include "sys.h"
//定义LED端口
#define LED0 PBout(1)
#define LED1 PBout(0)
/*
这里LED0是接PB1端口
LED1是接PB0端口
此处经过define,LED0就是PB1的地址
LED1就是PB0的地址
选择端口为输出模式
*/
//LED初始化
void LED_Init(void);
#endif
main.c文件:
#include "sys.h"
#include "delay.h"
#include "led.h"
//这里没有用到usart.h
int main(void)
{
//设置时钟
Stm32_Clock_Init(360, 25, 2, 8);
//初始化延时函数
delay_init(180);
//初始化LED
LED_Init();
while(1)
{
LED0 = 0; //LED0亮
LED1 = 1; //LED1灭
delay_ms(500);
LED0 = 1; //LED0灭
LED1 = 0; //LED1亮
delay_ms(500);
}
}
这里重点分析了GPIO设置函数。
扫描二维码关注公众号,回复:
4658161 查看本文章