起初用原子的战舰初学STM32,接触流水灯时,由于是51过渡来的,总觉得两个灯看着别扭,自己也做了几个一排灯接在开发板上面。奈何原子的板子IO不是类似51的整组排列分布,所以当时接的电路是这样的
导致自己做个流水灯写了一堆的初始化,程序在这
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#define LED0 PBout(11)// PB11 声明LED0
#define LED1 PEout(15)// PE15
#define LED2 PEout(13)// PE13
#define LED3 PEout(11)// PE11
#define LED4 PEout(9)// PE9
#define LED5 PEout(7)// PE7
#define LED6 PGout(0)// PG0
#define LED7 PFout(14)// PF14
#define LED8 PFout(12)// PF12
#define LED9 PBout(2)// PB2
#define LED10 PBout(0)// PB0
#define LED11 PCout(4)// PC4
#define LED12 PAout(6)// PA6
#define LED13 PAout(4)// PA4
#define LED14 PAout(0)// PA0
#define LED15 PCout(2)// PC2
void LED_Init(void);
void LED_Control(uint8_t LED_Number);
int main(void)
{
uint8_t LED_Number = 0;
delay_init(); //延时函数初始化
while(1){
LED_Control(LED_Number);
LED_Number ++;
if(17 == LED_Number)
LED_Number = 0; //当LED_Number=17时变为0
delay_ms(100); //延时100ms
LED_Init(); //初始化与LED连接的硬件接口
}
}
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG, ENABLE);
// 控制GPIO的引脚配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_6); //PA.0 4 6 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_11; // 端口配置,
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_11);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_4; // 端口配置, 推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_4); //PC.2 4 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15; //端口配置,
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_15); //PE.7 9 11 13 15 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14; // 端口配置,
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_12|GPIO_Pin_14); //PF.12 14 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 端口配置,
GPIO_Init(GPIOG, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOG,GPIO_Pin_0); //PG.0 输出高
}
void LED_Control(uint8_t LED_Number)
{
switch(LED_Number)
{
case 1:LED0=0;break;
case 2:LED1=0;break;
case 3:LED2=0;break;
case 4:LED3=0;break;
case 5:LED4=0;break;
case 6:LED5=0;break;
case 7:LED6=0;break;
case 8:LED7=0;break;
case 9:LED8=0;break;
case 10:LED9=0;break;
case 11:LED10=0;break;
case 12:LED11=0;break;
case 13:LED12=0;break;
case 14:LED13=0;break;
case 15:LED14=0;break;
case 16:LED15=0;break; //给对应的IO口低电平,使得灯亮
}
}
最近看了下数据结构的内容,弥补之前的过错用数据结构重写了个,算是相对之前能入眼。IO用的是
程序如下
#define LED1_PIN GPIO_Pin_12
#define LED1_GPIO GPIOB
#define LED1_RCC RCC_APB2Periph_GPIOB
#define LED2_PIN GPIO_Pin_14
#define LED2_GPIO GPIOB
#define LED2_RCC RCC_APB2Periph_GPIOB
#define LED3_PIN GPIO_Pin_8
#define LED3_GPIO GPIOD
#define LED3_RCC RCC_APB2Periph_GPIOD
#define LED4_PIN GPIO_Pin_10
#define LED4_GPIO GPIOD
#define LED4_RCC RCC_APB2Periph_GPIOD
#define LED5_PIN GPIO_Pin_12
#define LED5_GPIO GPIOD
#define LED5_RCC RCC_APB2Periph_GPIOD
#define LED6_PIN GPIO_Pin_14
#define LED6_GPIO GPIOD
#define LED6_RCC RCC_APB2Periph_GPIOD
#define LED7_PIN GPIO_Pin_2
#define LED7_GPIO GPIOG
#define LED7_RCC RCC_APB2Periph_GPIOG
#define LED8_PIN GPIO_Pin_4
#define LED8_GPIO GPIOG
#define LED8_RCC RCC_APB2Periph_GPIOG
#include
#include
#include
#include
typedef struct
{
uint32_t ir_rcc;
GPIO_TypeDef * ir_gpio;
uint16_t ir_pin;
}GPIO_Config;
const GPIO_Config led[8]={
LED1_RCC, LED1_GPIO, LED1_PIN,
LED2_RCC, LED2_GPIO, LED2_PIN,
LED3_RCC, LED3_GPIO, LED3_PIN,
LED4_RCC, LED4_GPIO, LED4_PIN,
LED5_RCC, LED5_GPIO, LED5_PIN,
LED6_RCC, LED6_GPIO, LED6_PIN,
LED7_RCC, LED7_GPIO, LED7_PIN,
LED8_RCC, LED8_GPIO, LED8_PIN,
};
void LED_GPIO_Config()
{
u8 i;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
for(i=0; i<8; i++)
{
RCC_APB2PeriphClockCmd(led[i].ir_rcc, ENABLE);
GPIO_InitStructure.GPIO_Pin = led[i].ir_pin;
GPIO_Init(led[i].ir_gpio, &GPIO_InitStructure);
GPIO_SetBits(led[i].ir_gpio,led[i].ir_pin);
}
}
int main()
{
u8 j;
delay_init();
LED_GPIO_Config();
while(1)
{
for(j=0;j<8;j++)
{
GPIO_ResetBits(led[j].ir_gpio,led[j].ir_pin);
delay_ms(500);
GPIO_SetBits(led[j].ir_gpio,led[j].ir_pin);
}
}
}