刚学STM32,发博客加深自己的记忆,顺便给新学者一些参考
用了几个文件把LED操作都写了
延时:config.c ,config.h
config.h
#ifndef _CONFIG_H
#define _CONFIG_H
#include "stm32f10x.h"
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
#define GPIOA_ODR_Addr (GPIOA_BASE+12)
#define GPIOB_ODR_Addr (GPIOB_BASE+12)
#define GPIOC_ODR_Addr (GPIOC_BASE+12)
#define GPIOD_ODR_Addr (GPIOD_BASE+12)
#define GPIOE_ODR_Addr (GPIOE_BASE+12)
#define GPIOF_ODR_Addr (GPIOF_BASE+12)
#define GPIOG_ODR_Addr (GPIOG_BASE+12)
#define GPIOA_IDR_Addr (GPIOA_BASE+8)
#define GPIOB_IDR_Addr (GPIOB_BASE+8)
#define GPIOC_IDR_Addr (GPIOC_BASE+8)
#define GPIOD_IDR_Addr (GPIOD_BASE+8)
#define GPIOE_IDR_Addr (GPIOE_BASE+8)
#define GPIOF_IDR_Addr (GPIOF_BASE+8)
#define GPIOG_IDR_Addr (GPIOG_BASE+8)
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n)
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)
void delay_us(uint16_t us);
void delay_ms(uint16_t nms);
void Delay(u32 nCount);
void delay_qus(void);
#endif
config.c
#include"config.h"
void delay_us(u16 us)
{
u8 i;
while (us--)
{
for(i=8;i>0;i--);
}
}
void delay_ms(u16 nms)
{
while (nms--)
{
delay_us(960);
}
}
void Delay(u32 nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
/* 1/4微秒延时函数(含函数调用及返回时间共计耗时约1/4微妙@72MHz主频) */
void delay_qus(void)
{
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
__ASM ("nop");
}
bsp_led.h
#ifndef __LED_H
#define __LED_H
#include"config.h"
/* 定义LED连接的GPIO端口, 用户只需要修改下面的代码即可改变控制的LED引脚 */
// R-红色
#define LED1_GPIO_PORT GPIOB /* GPIO端口 */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED1_GPIO_PIN GPIO_Pin_5 /* 连接到SCL时钟线的GPIO */
// G-绿色
#define LED2_GPIO_PORT GPIOB /* GPIO端口 */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED2_GPIO_PIN GPIO_Pin_0 /* 连接到SCL时钟线的GPIO */
// B-蓝色
#define LED3_GPIO_PORT GPIOB /* GPIO端口 */
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define LED3_GPIO_PIN GPIO_Pin_1 /* 连接到SCL时钟线的GPIO */
/* 使用标准的固件库控制IO*/
#define LED1_OFF GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_OFF GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_OFF GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED1_ON GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_ON GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED3_ON GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
/* 直接操作寄存器的方法控制IO */
#define digitalHi(p,i) {p->BSRR=i;} //输出为高电平
#define digitalLo(p,i) {p->BRR=i;} //输出低电平
#define digitalToggle(p,i) {p->ODR ^=i;} //输出反转状态
/* 定义控制IO的宏 */
#define led1_toggle digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define led1_off digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define led1_on digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define led2_toggle digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define led2_off digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define led2_on digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define led3_toggle digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define led3_off digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define led3_on digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
/* 基本混色,后面高级用法使用PWM可混出全彩颜色,且效果更好 */
//红
#define LED_RED {LED1_ON;LED2_OFF;LED3_OFF;}
//绿
#define LED_GREEN {LED1_OFF;LED2_ON;LED3_OFF;}
//蓝
#define LED_BLUE {LED1_OFF;LED2_OFF;LED3_ON;}
//黄(红+绿)
#define LED_YELLOW {LED1_ON;;LED2_ON;LED3_OFF;}
#define LED_PURPLE {LED1_ON;LED2_OFF;LED3_ON;}
void LED_GPIO_Config(void);
#endif
bsp_led.c
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*调用库函数,初始化GPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
/*调用库函数,初始化GPIOF*/
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
/* 关闭所有led灯 */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
/* 关闭所有led灯 */
GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}
main.c
#include "config.h"
#include "bsp_led.h"
main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
while (1)
{
LED1_ON; // 亮
Delay(0xFFFFFF);
LED1_OFF; // 灭
LED2_ON; // 亮
Delay(0xFFFFFF);
LED2_OFF; // 灭
LED3_ON; // 亮
Delay(0xFFFFFF);
LED3_OFF; // 灭
/*轮流显示 红绿蓝黄紫青白 颜色*/
LED_RED;//红
Delay(0xFFFFFF);
LED_GREEN;//绿
Delay(0xFFFFFF);
LED_BLUE;//蓝
Delay(0xFFFFFF);
LED_YELLOW;//黄
Delay(0xFFFFFF);
LED_PURPLE;//紫
Delay(0xFFFFFF);
}
}