飞道的博客

STM32F 103C8T6开发板 点亮LED灯

257人阅读  评论(0)

每组IO口含下面7个寄存器。7个寄存器可以控制一组GPIO的16个IO口。

  • GPIOx_CRL:端口配置低寄存器
  • GPIOx_CRH:端口配置高寄存器
  • GPIOx_IDR:端口输入寄存器
  • GPIOx_ODR:端口输出寄存器
  • GPIOx_BSRR:端口位设置 / 清除寄存器
  • GPIOx_BRR:端口位清除寄存器
  • GPIOx_LCKR:端口配置锁存寄存器

注:IO口输出高电平,LED灭,输出低电平,LED点亮。

头文件:stm32f10x.h

注:操作IO口必须引入的源文件和头文件。

初始化函数:

  • void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

4个设置输出电平函数:

  • void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    • 作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器
  • void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    • 作用:设置某个IO口输出为低电平(0)。 实际操作BSRR寄存器
  • void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
    • 作用:用来设置IO口输出电平。
  • void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
    • 作用:用来设置IO口输出电平。

1.点亮LED灯

#include "stm32f10x.h"

void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 // PB,PE端口时钟
// 可以一次初始化一个IO组下的多个IO,前提是这些IO口的配置方式一样。
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 // LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 // 根据设定参数初始化 GPIOB.5
 GPIO_SetBits(GPIOA,GPIO_Pin_5);						 // PB.5 输出高
}

int main(void){
   	
	LED_Init();		  	// 初始化与LED连接的硬件接口
	while(1){
   
	}
}

代码运行结果:

2.点亮全部的LED灯

#include "stm32f10x.h"

void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 // PB,PE端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;				 // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
 GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8);						 // PB.5,PB.6,PB.7,PB.8 输出高
}

int main(void){
   	
	LED_Init();		  	// 点亮全部的led灯
	while(1){
   
	}
}

代码运行结果:

3.LED等闪烁

#include "stm32f10x.h"

void delay_ms(uint16_t t){
    // 延迟函数
      uint16_t i; 
      for(;t>0;t--)
             for(i = 0;i<7500;i++);
}

void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 // PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 // LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 // 根据设定参数初始化 GPIOB.5
 GPIO_SetBits(GPIOA,GPIO_Pin_5);						 // PB.5 输出高
}

int main(void){
   	

	LED_Init();		  	// 初始化与LED连接的硬件接口
	while(1){
   
		GPIO_SetBits(GPIOA, GPIO_Pin_5); // 输出低电平,点亮led灯
		delay_ms(1000); // 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 输出高电平,熄灭led灯
		delay_ms(1000);	
	}
}

4.流水灯实现左移

#include "stm32f10x.h"

void delay_ms(uint16_t t){
    // 延迟函数
      uint16_t i; 
      for(;t>0;t--)
             for(i = 0;i<7500;i++);
}

void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 // PB,PE端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;				 // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
 GPIO_SetBits(GPIOA, GPIO_Pin_5);						 // PB.5
}

int main(void){
   	
	LED_Init();		  	// 初始化与LED连接的硬件接口
	while(1){
   
		GPIO_SetBits(GPIOA, GPIO_Pin_5); // 输出低电平,点亮led灯
		delay_ms(100); // 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 输出高电平,熄灭led灯
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_6); 
		delay_ms(100); // 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_6); 
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_7); 
		delay_ms(100); // 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_7); 
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_8); 
		delay_ms(100); // 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_8); 
		delay_ms(100);	
	}
}

5.流水灯实现右移

#include "stm32f10x.h"

void delay_ms(uint16_t t){
    // 延迟函数
      uint16_t i; 
      for(;t>0;t--)
             for(i = 0;i<7500;i++);
}

void LED_Init(void){
   
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 // PB,PE端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;				 // LED0-->PB.5 端口配置,LED1-->PB.6 端口配置,LED2-->PB.7 端口配置,LED3-->PB.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 // 推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 // IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 // 根据设定参数初始化 GPIOB.5,GPIOB.6,GPIOB.7,GPIOB.8
 GPIO_SetBits(GPIOA, GPIO_Pin_8);		 // PB.8
}

int main(void){
   	
	LED_Init();		  	// 初始化与LED连接的硬件接口
	while(1){
   
		GPIO_SetBits(GPIOA, GPIO_Pin_8); // 输出低电平,点亮led灯
		delay_ms(100);// 调用延迟函数
		GPIO_ResetBits(GPIOA, GPIO_Pin_8); // 输出高电平,熄灭led灯
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_7); 
		delay_ms(100);
		GPIO_ResetBits(GPIOA, GPIO_Pin_7); 
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_6); 
		delay_ms(100);
		GPIO_ResetBits(GPIOA, GPIO_Pin_6);
		delay_ms(100);	
		GPIO_SetBits(GPIOA, GPIO_Pin_5); 
		delay_ms(100);
		GPIO_ResetBits(GPIOA, GPIO_Pin_5); 
		delay_ms(100);	
	}
}

转载:https://blog.csdn.net/qq_44989881/article/details/117405184
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场