学习目录
- 一.流水灯
- 1.创建文件
- 2.编写相关代码
一.流水灯
1.创建文件
将方法进行分类保存在不同的 .c 文件中,方便复用和寻找;
创建Hardware\LED文件,其中有led.c和led.h文件,用于存放有关LED灯操作的方法;
在User文件中创建delay.c和delay.h文件,用于存放延迟的方法;
2.编写相关代码
(1)编写LED灯有关的代码:
在led.h中声明方法名等,方便其他 .c 文件进行引用;
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
//宏定义
#define LED1 GPIO_ODR_ODR0
#define LED2 GPIO_ODR_ODR1
#define LED3 GPIO_ODR_ODR8
//初始化
void LED_Init(void);
//控制某个LED的开关
void LED_On(uint16_t led);
void LED_Off(uint16_t led);
//翻转LED状态
void LED_Toggle(uint16_t led);
//对一组LED灯,全开全关
void LED_OnAll(uint16_t leds[],uint8_t size);
void LED_OffAll(uint16_t leds[],uint8_t size);
#endif
在led.c中实现方法:
#include "led.h"
//初始化
void LED_Init(void)
{
//1.时钟配置;为了让stm32的时钟与外设的时钟进行适配
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
//2.GPIO工作模式配置;
GPIOA->CRL &= ~GPIO_CRL_CNF0;
GPIOA->CRL |= GPIO_CRL_MODE0;
GPIOA->CRL &= ~GPIO_CRL_CNF1;
GPIOA->CRL |= GPIO_CRL_MODE1;
GPIOA->CRH &= ~GPIO_CRH_CNF8;
GPIOA->CRH |= GPIO_CRH_MODE8;
//3.PA0输出高电平,默认关灯;
LED_Off(LED1);
LED_Off(LED2);
LED_Off(LED3);
}
//控制某个LED的开关
void LED_On(uint16_t led)
{
GPIOA->ODR &= ~led;
}
void LED_Off(uint16_t led)
{
GPIOA->ODR |= led;
}
//翻转LED状态
void LED_Toggle(uint16_t led)
{
//需要先判断当前LED状态,读取IDR对应位
if((GPIOA->IDR & led) == 0)
{
LED_Off(led);
}
else
{
LED_On(led);
}
}
//对一组LED灯,全开全关
void LED_OnAll(uint16_t leds[],uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
LED_On(leds[i]);
}
}
void LED_OffAll(uint16_t leds[],uint8_t size)
{
for (uint8_t i = 0; i < size; i++)
{
LED_Off(leds[i]);
}
}
(2)编写延迟的代码:
在delay.h中:
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
void Delay_us(uint16_t us);
void Delay_ms(uint16_t ms);
void Delay_s(uint16_t s);
#endif
在delay.c中:
在该方法中使用到了stm32中自带的系统时钟
#include "delay.h"
// 延时函数,微秒作为单位,利用系统嘀嗒定时器,72MHz,一次嘀嗒 1/72 us
void Delay_us(uint16_t us)
{
//1.装载一个计数器,72 * us
SysTick->LOAD = 72 * us;
//2.配置,使用系统时钟(1),计数结束不产生中断(0),使能定时器(1)
SysTick->CTRL |= 0x05;
//3.等待计数值变为0,判断CTRL标志位COUNTFLAG是否位1
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG) == 0)
{}
//4.关闭定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE;
}
void Delay_ms(uint16_t ms)
{
while (ms--)
{
Delay_us(1000);
}
}
void Delay_s(uint16_t s)
{
while (s--)
{
Delay_ms(1000);
}
}
(3)主函数编写:
#include "led.h"
#include "delay.h"
int main(void)
{
//初始化LED
LED_Init();
//定义一个LED数组
uint16_t leds[] = {LED1,LED2,LED3};
//在循环中执行流水灯,依次点亮每个灯,保持一段时间再关灯;
while(1)
{
for (uint8_t i = 0; i < 3; i++)
{
LED_On(leds[i]);
Delay_ms(500);
LED_Off(leds[i]);
}
}
}