关注?+ 点赞? ??不错过精彩内容
大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!?
依据电路图连接电路
复制LED闪烁的工程,改个名字叫3-2 LED流水灯
修改部分代码,因为我们连接的都是GPIOA的端口,所以第一句不用变的
接着初始化端口的这一部分,我们流水灯用的是GPIOA的0到7号端口,所以这里要加一些端口,如图所示这样就可以把这三个端口初始化了
在stm32f10x_gpio.h文件中可以看到,各个端口的定义,将各位转化为二进制是0000000000000001、0000000000000010、0000000000000100,这里每一个端口对应着一个位,按位或的操作就相当于0000000000000111
最后,我们还可以看到,这里有个GPIO_Pin_All,它对应的数据就是0xFFFF,也就是所有位都为1,这样就相当于选中了所有的引脚
在这里,除了这个GPIO_Pin可以用按位或的操作方式外,这个时钟控制的这一项,也是可以用按位或的操作有式来选择多个外设的
介绍完按位或,我们就可以在这里使用按位或把这8个引脚都选上,这样就把16个端口全部配置为推挽输出模式
在while中,为了实现同时控制16个端口,我们就可以使用GPIO_Write这个函数了,我们复制过来,第一个参数是GPIOx,我们直接写GPIOA
第二个转到定义看一下,这第二个参数就是直接写到GPIO的ODR寄存器里的
所以我们可以写0x0001,对应二进制就是0000 0000 0000 0001,因为C语言不支持直接写二进制,所以这里只能转换为十六进制来写,这16个二进制分别对应PA0到PA15总共16个端口,最低位对应PA0,然后往上依次是PA1、PA2,一直到PA15
因为是低电平点亮,所以前面再加一个按位取反的符号,这样就是第一个LED点亮,其他都熄灭了
以此类推可以实现8个Led灯的点亮,再加上Delay延时函数,就可以实现8个Led灯的循环点亮,想快一点的话可以让Delay函数延时时间改为100,如:Delay_ms(100);
#include "stm32f10x.h" ? ? ? ? ? ? ? ? ?// Device header
#include "delay.h"
int main(void)
{ ? ? ? ?
? ? ? ?GPIO_InitTypeDef GPIO_Initstructure;
? ? ? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
? ? ? ?
? ? ? ?GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;
? ? ? ?//GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; 按或取
? ? ? ?GPIO_Initstructure.GPIO_Pin = GPIO_Pin_All;
? ? ? ?GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? ? ?GPIO_Init(GPIOA, &GPIO_Initstructure);
? ? ? ?
? ? ? ?while(1)
? ? ? ?{ ? ? ? ?
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ? ? ? ? ?GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000
? ? ? ? ? ? ? ?Delay_ms(500);
? ? ? ?}
}
可以看到LED循环点亮!
作?者?:硬核王同学
-------?END?------
关注公众号回复“加群”按规则加入技术交流群 ?回复“1024”查看更多内容
如果觉得有用请点个免费的赞