文章目录
- 一、LED点亮
- 1.原理
- 2.寄存器方式--代码
- 3.库函数--代码
- 4.结果展示
- 二、LED闪烁
- 三、LED流水灯
- 1.代码
- 2.结果展示
一、LED点亮
1.原理
其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯
2.寄存器方式–代码
//寄存器方式//主频8Mhz的时候实现1us延时的方法//LED灯//1,开时钟PE时钟RCC->APB2ENR |= 1<<6;//2,配置IO口GPIOE->CRL &= ~(0xffff<<8);//先清零指定寄存器位GPIOE->CRL |= 0x1111<<8;//设置模式为推挽输出模式//3, 设置开关灯GPIOE->ODR |= 0xf<<2;//关灯操作
3.库函数–代码
(1)led.c:函数led_config()
//库函数RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_ResetBits(GPIOE,GPIO_Pin_2);
(2)main.c调用led_config
4.结果展示
二、LED闪烁
原理:让连接的IO口先置零再置1可以使其先亮再灭,我们先使灯置1,然后宏定义让灯反转,delay一个时间,代码如下
(1)led.c函数led_config()置1:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_SetBits(GPIOE,GPIO_Pin_2);
(2)led.h宏定义灯的反转
#define LED1_Toggle() GPIOE->ODR ^= (1<<2)//反转灯操作
(3)main.c调用
int main(void){
LED_Config();
while(1)
{if(sys_time>=1000){sys_time = 0;LED1_Toggle();}
}
sys_time在delay.c中定义
#include "delay.h"//主频72Mhz的时候实现1us延时的方法
#define delay_1us() __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
__nop();__nop();
void Delay_us(uint32_t time)
{while(time--){delay_1us();}
}
void Delay_ms(uint32_t time)
{while(time--){Delay_us(1000);}
}uint32_t led_time = 0;
uint32_t sys_time = 0;
uint32_t dht11_time = 0;void SysTick_Handler(void)//1ms进入一次
{led_time++;sys_time++;dht11_time++;
}void Sys_ms(uint32_t time)
{uint32_t temp = time+sys_time;while(temp>sys_time);
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H#include "stm32f10x.h"
//extern uint16_t temperature;
//extern uint16_t humidity;
extern uint32_t led_time ;
extern uint32_t sys_time ;
extern uint32_t dht11_time ;
void Delay_us(uint32_t time);
void Delay_ms(uint32_t time);#endif
ps:systick_handler是由系统定时器(SysTick)触发的中断处理函数。SysTick是一种基于硬件的定时器,它可以在每个时钟周期结束时触发中断。在ARM Cortex-M系列处理器中,SysTick定时器是由内核提供的,并且可以用于实现操作系统的时间片轮转调度、延时等功能。当SysTick定时器计数器减到时,就会触发systick_handler中断处理函数。因此,systick_handler的触发是由SysTick定时器的计数器减到时自动触发的。
三、LED流水灯
使这四个灯轮流亮起-代码如下
1.代码
int main(void){
LED_Config();
while(1)
{if(sys_time>=1000){sys_time = 0;LED1_Toggle();Delay_ms(300);LED2_Toggle();Delay_ms(300);LED3_Toggle();Delay_ms(300);LED4_Toggle();Delay_ms(300);}
}
2.结果展示
流水灯