历史上的今天
今天是:2025年04月16日(星期三)
2021年04月16日 | STM32流水灯实验编程
2021-04-16 来源:eefocus
首先,在上一节的模板基础上建立一个新的Keil工程,取名为LED。打开main.c函数,可以直接在这里写代码,当然也可以重新建立.c文件,这里我们直接在main文件中写程序。第一步,也是最重要的一步就是配置作为输出的IO口,代码如下:
GPIO_InitTypeDef GPIO_Structure; //定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的时钟
GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //结构体引脚为PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻转速度设置为50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引脚
这里只设置了一个PE9引脚,其他引脚的设置类似,只需改变GPIO_Pin_x然后初始化即可,如下:
GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE,&GPIO_Structure);
将以上初始化IO口的代码封装成一个函数命名为LED_init():
void Led_init(void)
{
GPIO_InitTypeDef GPIO_Structure; //定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的时钟
GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //结构体引脚为PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻转速度设置为50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引脚
GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE,&GPIO_Structure);
}
然后需要一个延时函数,控制LED等亮与灭的时间间隔:
void Delay(int n)
{
while(n--)
; //学过51的人都明白
}
至此,驱动LED的程序代码基本已经完成,为了更方便的调用,我们定义一些宏:
#define LED1_ON() GPIO_SetBits(GPIOE,GPIO_Pin_13) //LED1置位
#define LED1_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_13) //LED1复位
#define LED2_ON() GPIO_SetBits(GPIOE,GPIO_Pin_9)
#define LED2_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_9)
#define LED3_ON() GPIO_SetBits(GPIOE,GPIO_Pin_15)
#define LED3_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_15)
#define LED4_ON() GPIO_SetBits(GPIOE,GPIO_Pin_11)
#define LED4_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_11)
好了,要LED等怎么闪烁就看你怎么调用这些宏了,实现流水灯的调用如下:
int main()
{
//SystemInit();
Led_init(); //初始化LED等所用的IO口
while(1)
{
LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();
Delay(0x8ffff);
}
}
对于SystemInit()函数,在启动代码中已经调用过,那么在main函数中无需再调用,如果使用的固件库版本比较低,启动代码中没有调用,那么main函数中就需要调用了。好了,我们看一下运行的效果怎么样:

史海拾趣
|
前段时间买了2440开发板也没怎么搞,惭愧:$ 最近没啥其它事情就好好啃啃吧,哎……没什么基础啊,先欣赏下别人的东西吧 【mini2440开发板实现国际象棋人机对弈 】 我在机子上跑了一下,好像不太能跟电脑对弈啊,不知道哪个地方还有问题 ...… 查看全部问答> |
|
VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? VC如何发彩信,已经实现ATDT*99***1#这一步了,下一步应该是什么,内容打包?如果打包? ATE AT+CMGF=0 AT+CIMI AT+CIMI获得IMSI IMSI 国际移动用户识别码(IMSI) international mobile subscriber identity 国际上为唯一识别 ...… 查看全部问答> |
|
/*进行SAA7121H的初始化*/ GPIO_RSET(GPVAL,0x0); addrI2C = 0xB8 >>1; /*选择第0路的I2C的地址*/ /*将第0路的视频输入口的数据口设为高阻状态, 使能SCLK,将第27脚设为输入*/ _IIC_write(hSeeddm642i2 ...… 查看全部问答> |
|
问题是这样的:我用flash烧写了一个控制电机的程序,不能运行,就把代码改了一下,再进行烧程序的时候就烧不进去啦,我也没有动“lock”和密码(在flash烧写的时候一直很小心的),怎么会锁住呢?很是不解。请EEWORLD老师和各位高手解答一下,谢谢 ...… 查看全部问答> |
|
各位高手,小弟近日在学习关于修改BSP的内容,有一种想法,设置多个引导行,然后在系统启动时按照需要选择相应的引导顺序,然后将config.h中的引导行 #define DEFAULT_BOOT_LINE \\ \"fd=0,0(0,0)host:/fd0/vxWorks.st h=90.0.0.3 e=90.0.0.50 u=ta ...… 查看全部问答> |
|
我是一个只有初中毕业没有读过多少书的人从小就爱好无线电记得很小的时候当通讯兵的父亲带回来几本电子方面的书籍从此就迷上了无线电那种痴迷程度决不亚于现在的小孩迷恋游戏机至今仍然清楚的记得曾经因为装成功一台6管收音机而兴奋的几天几夜没睡 ...… 查看全部问答> |




