主函数:
#include "stm32f10x.h" #include "led.h" #include "delay.h" int main(void) { led_Init(); //led初始化 Delay_init(); //延时函数初始化 while(1) { //正向 GPIO_ResetBits(GPIOC,GPIO_Pin_8); /**低电平**/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_8); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_9); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_9); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_10); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_10); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_11); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_11); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_12); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_12); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_13); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_13); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_14); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_14); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_15); /**低电平*/ Delay(300); GPIO_SetBits(GPIOC,GPIO_Pin_15); /**高电平*/ Delay(500); //反向 GPIO_ResetBits(GPIOC,GPIO_Pin_14); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_14); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_13); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_13); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_12); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_12); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_11); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_11); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_10); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_10); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_9); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_9); /**高电平*/ GPIO_ResetBits(GPIOC,GPIO_Pin_8); /**低电平*/ Delay(200); GPIO_SetBits(GPIOC,GPIO_Pin_8); /**高电平*/ Delay(500); } }
led.c
#include "led.h" void led_Init(void) //定义led初始化函数 { GPIO_InitTypeDef GPIO_InitStructure; //定义了一个GPIO_InitTypeDef类型的结构体,要想看到结构体中的内容,可以从stm32f10x.h中找到其结构体内部包含了哪些变量, Structure变量可随意取 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //GPIOC的时钟被打开( 因为STM32为了实现低功耗,设计了很复杂的时钟系统,每个外设配置使用前都要开启外设时钟) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //选择要控制的GPIO引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速率为50MHZ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择GPIOC引脚输出方式为推挽输出方式 GPIO_Init(GPIOC, &GPIO_InitStructure); //是把上面配置的信息写入这个结构体中,也叫对引脚配置的初始化 GPIO_SetBits(GPIOC,GPIO_Pin_All); //开始全为高电平————全灭 / }
led.h
#ifndef __LED_H_ #define __LED_H_ #include "stm32f10x.h" void led_Init(void); #endif
delay.c:
#include "delay.h" u32 TimingDelay; //32对应就是32位数据了,我们使用库开发时,库文件中已经把原本的unsigned int\short\char宏定义为u32、 u16、 u8等等数据类型了 //u8是unsigned char,u16是unsigned short,u32是unsigned int这些都属于变量类型 void Delay_init(void) { SysTick_Config(SystemCoreClock / 1000); //是判断你配置的定时频率是否可以实现,如果可以就继续往下执行,如果不可以就一直停在这里。 } void Delay(u32 nTime) { TimingDelay= nTime; //延时函数。1个nTime相当于时间:1ms while(TimingDelay != 0); }
delay.h:
#ifndef __DELAY_H_ #define __DELAY_H_ #include "stm32f10x.h" void Delay_init(void); void Delay(u32 nTime); #endif
以上的流水灯重复度较高,改用switch.....case...语句,并将该功能写为一个函数:
#include "stm32f10x.h" #include "led.h" #include "delay.h" void LED_Control(u8 LED_Number); int main(void) { u8 LED_Number=0 ; led_Init(); //led初始化 Delay_init(); //延时函数初始化 while(1) { LED_Control(LED_Number); Delay(200); LED_Number++; if(LED_Number==8) { LED_Number = 0; } } } void LED_Control(u8 LED_Number) { GPIO_SetBits(GPIOC,GPIO_Pin_All); //全灭 switch(LED_Number) { case 0: GPIO_ResetBits(GPIOC,GPIO_Pin_8); //亮 break; case 1: GPIO_ResetBits(GPIOC,GPIO_Pin_9); break; case 2: GPIO_ResetBits(GPIOC,GPIO_Pin_10); break; case 3: GPIO_ResetBits(GPIOC,GPIO_Pin_11); break; case 4: GPIO_ResetBits(GPIOC,GPIO_Pin_12); break; case 5: GPIO_ResetBits(GPIOC,GPIO_Pin_13); break; case 6: GPIO_ResetBits(GPIOC,GPIO_Pin_14); break; case 7: GPIO_ResetBits(GPIOC,GPIO_Pin_15); break; default: GPIO_SetBits(GPIOC,GPIO_Pin_All); break; } }
总结:
(1)设置输出电平函数:SetBits 高电平
ResetBits 低电平
(2)推挽输出(GPIO_Mode_Out_PP)
可以输出高低电平。
(3)GPIO
GPIO是通用输入输出端口的简称,就是stm32可以控制的引脚。
GPIOx:x可以是A、B、C、D、E,以此来选择GPIO外设。
(4)GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15为控制八个LED等的端口。