LED点灯(理解轮子的创造)

LED点灯

  • LED红灯点亮代码
    • 步骤
      • Step   I : \textbf{Step I}: Step I:时钟处理
      • Step   II : \textbf{Step II}: Step II:设置寄存器GPIO端口模式
      • Step   III : \textbf{Step III}: Step III:设置寄存器GPIO输出
    • 代码
      • 初始代码
      • 集成宏定义
  • LED中RGB点灯项目
    • 点亮白灯,黄灯etc.
    • 顺序点亮灯

LED红灯点亮代码

步骤

Step   I : \textbf{Step I}: Step I:时钟处理

GPIO需要复位和时钟控制 (RCC)
根据参考手册:

LED点灯(理解轮子的创造)_第1张图片

因此可知RCC初始边界地址0x40023800

LED点灯(理解轮子的创造)_第2张图片

可见偏移地址是0x30
而GPIOF的位数需要左移5位

	/*打开GPIO端口时钟*/
	*(unsigned int *)(0x40023800+0x30) |= (1<<5)//1是置为高电平,<<5是左移5位

Step   II : \textbf{Step II}: Step II:设置寄存器GPIO端口模式

查询原理图,确认调试哪个接口

LED点灯(理解轮子的创造)_第3张图片

根据原理图可以发现:如果点亮红灯,那么只需要让PF6为低电平

查询参考手册:

LED点灯(理解轮子的创造)_第4张图片 LED点灯(理解轮子的创造)_第5张图片

并且由参考手册得知:GPIOF端口的MODER边界地址0x4002 1400,偏移地址:0x00

	/*定义GPIOF_MODER的状态*/
	*(unsigned int *)(0x40021400+0x00) &=~((0x03)<<(2*6));
		//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
		//~():				然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
	*(unsigned int *)(0x40021400+0x00) |= (1<<(2*6));
		//这样将GPIOF的MODER变成"01",而其余地方变成"11"

Step   III : \textbf{Step III}: Step III:设置寄存器GPIO输出

同样用参考手册定义:

	/*定义GPIOF_ODR的输出状态*/
	*(unsigned int *)(0x40021400+0x14) &=~ (1<<6);//PF6输出低电平

代码

初始代码

#include "STM32F4xx.h"

int main(){
		/*打开GPIO端口时钟*/
		*(unsigned int *)(0x40023800+0x30) |= (1<<5);
			                    //1是置为高电平,<<5是左移5位
			
		
		/*定义GPIOF_MODER的状态*/
		*(unsigned int *)(0x40021400+0x00) &=~((0x03)<<(2*6));
												//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		*(unsigned int *)(0x40021400+0x00) |= (1<<(2*6));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		
		/*定义GPIOF_ODR的输出状态*/
		*(unsigned int *)(0x40021400+0x14) &=~ (1<<6);//PF6输出低电平
}

void SystemInit(void ){
	
}

集成宏定义

main.c

#include "STM32F4xx.h"

int main(){
		/*打开GPIO端口时钟*/
		 RCC_AHB1ENR |= (1<<5);
			                    //1是置为高电平,<<5是左移5位
			
		
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*7));
												//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*7));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		
		/*定义GPIOF_ODR的输出状态*/
		GPIOF_ODR &=~ (1<<7);//PF6输出低电平
}

void SystemInit(void ){
	
}

STM32F4xx.h

/* 用来存放寄存器映射相关代码 */

#define RCC_AHB1ENR *(unsigned int *)(0x40023800+0x30)
#define GPIOF_MODER *(unsigned int *)(0x40021400+0x00)	
#define GPIOF_ODR *(unsigned int *)(0x40021400+0x14)

烧录易错:
LED点灯(理解轮子的创造)_第6张图片

LED中RGB点灯项目

点亮白灯,黄灯etc.

#include "STM32F4xx.h"

int main(){
		/*打开GPIO端口时钟*/
		 RCC_AHB1ENR |= (1<<5);
			                    //1是置为高电平,<<5是左移5位
			
		红灯
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*6));
												//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*6));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		
		/*定义GPIOF_ODR的输出状态*/
		GPIOF_ODR &=~ (1<<6);//PF6输出低电平
	
	  绿灯
	
    /*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*7));
												//(0x03)<<(2*7):	首先,将左移2*7位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*7));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		
		/*定义GPIOF_ODR的输出状态*/
		GPIOF_ODR &=~ (1<<7);//PF7输出低电平
	
	
		蓝灯
	
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*8));
												//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*8));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		
		/*定义GPIOF_ODR的输出状态*/
		GPIOF_ODR &=~ (1<<8);//PF8输出低电平
	
}

void SystemInit(void ){
	
}

顺序点亮灯

这里有软件延时和硬件延时两种方式,我们先采用软件延时:

/*采用软件延迟*/
void Delay(unsigned int count){
	for( ;count!=0 ; count--);
}

综合的代码:

#include "STM32F4xx.h"

/*采用软件延迟*/
void Delay(unsigned int count){
	for( ;count!=0 ; count--);
}


int main(){
		/*打开GPIO端口时钟*/
		 RCC_AHB1ENR |= (1<<5);
			                    //1是置为高电平,<<5是左移5位
			
		红灯
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*6));
												//(0x03)<<(2*6):	首先,将左移2*6位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*6));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
		
		绿灯
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*7));
												//(0x03)<<(2*7):	首先,将左移2*7位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*7));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
	
		蓝灯
		/*定义GPIOF_MODER的状态*/
		GPIOF_MODER &=~((0x03)<<(2*8));
												//(0x03)<<(2*8):	首先,将左移2*8位的端口变成"11",而其余地方变成"00"
												//~():						然后取反,得到左移的端口变成"00",而其余地方变成"11"
		    
		GPIOF_MODER |= (1<<(2*8));
			                  //这样将GPIOF的MODER变成"01",而其余地方变成"11"
												
		
		/*定义GPIOF_ODR的输出状态*/
		
	
	  while(1){
				GPIOF_ODR &=~ (1<<6);	//亮灯
			  Delay(0x0FFFFF);			//延时
				GPIOF_ODR |= (1<<6); 	//灭灯
			  Delay(0x0FFFFF);				//延时
				
				GPIOF_ODR &=~ (1<<7);	//亮灯
			  Delay(0x0FFFFF);			//延时
				GPIOF_ODR |= (1<<7); 	//灭灯
			  Delay(0x0FFFFF);				//延时
			
				GPIOF_ODR &=~ (1<<8);	//亮灯
			  Delay(0x0FFFFF);			//延时
				GPIOF_ODR |= (1<<8); 	//灭灯
			  Delay(0x0FFFFF);				//延时
    }
}
void SystemInit(void ){
	
}

你可能感兴趣的:(STM32:入门,单片机,嵌入式硬件)