上节我们已经会点亮STM32板子上的灯,现在我们尝试去点亮外面的灯。
就用PA0口吧,基本的库函数还是跟上一节一样的,只不过多了DeLay延时函数;
只要在工程再多添加system文件,放入Delay.c与Delay.h两个延时函数库文件,然后在点击keil魔术棒,在c++选项添加好system的头文件路径。
然后还要添加头文件#include"Delay.h"
代码如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //结构体定义
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推免输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0; //GPIO端口
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //输出50MHZ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能时钟
GPIO_Init(GPIOA,&GPIO_InitStruct); //GPIO初始化
GPIO_ResetBits( GPIOA, GPIO_Pin_0); //GPIO输出低电平
GPIO_SetBits( GPIOA, GPIO_Pin_0); //GPIO输出高电平
while(1)
{
//写法一:这里列举了几种函数
GPIO_ResetBits( GPIOA, GPIO_Pin_0);//输出低电平
Delay_ms(100);
GPIO_SetBits( GPIOA, GPIO_Pin_0);
Delay_ms(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_RESET);//输出低电平
Delay_ms(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,Bit_SET);
Delay_ms(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)0);//(BitAction)0是枚举类型强制转换,
Delay_ms(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_0,(BitAction)1);
Delay_ms(100);
}
这样就可以闪烁了,这里补充一个就是如果把LED的管脚反过来,把正的一脚插到PA0也可以点亮的,这证明了推免输出模式下,高低电平都是驱动有效的。开漏模式下仅有低电平有效,如果改为开漏输出模式即 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;那么管脚置反后LED是不会闪烁的,只接受低电平点亮;
2.流水灯
我们已经会让一个灯闪烁了,现在尝试一下流水灯的操作;接线图:
代码的写法可以在函数参数里面用或的操作写出⑦个GPIO端口。
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
//用或的方式来写,并列出7个GPIO端口
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIO_InitStruct);
while(1)
{
GPIO_ResetBits( GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
// ResetBits的参数可以是GPIO的多种组合,也是或的方式;GPIO输出低电平
Delay_ms(100);
GPIO_SetBits( GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
Delay_ms(100);
// GPIO输出高电平
}
}
可以右键点击GPIO_SetBits();访问函数定义内容来看参数说明,可见参数二是可以用Any种组合方式来写的;
3.最后介绍一种位移的方式的闪烁操作,通过与非,
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Init(GPIOA,&GPIO_InitStruct);
while(1)
{
GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001
Delay_ms(100);
GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010
Delay_ms(100);
GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100
Delay_ms(100);
GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000
Delay_ms(100);
GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000
Delay_ms(100);
GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000
Delay_ms(100);
GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000
Delay_ms(100);
GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000
Delay_ms(100); }
}
这是GPIO_Pin_X的定义,联系之前的寄存器操作,给某一位置0,要用与非的操作,是一样的;
这个我们用了GPIO_Write();函数,跳转到函数定义页面可以看到参数就是输出寄存器ODR的值