使用STM32点亮一盏LED灯需要执行三个步骤:
①使用RCC开启时钟
②使用GPIO_Init()初始化GPIO口
③使用输入输出函数控制GPIO口
GPIO的库函数:
1.GPIO_DeInit():参数写GPIOx,复位指定的GPIO外设
2.GPIO_AFIODeInit():复位AFIO外设
3.GPIO_Init():用结构体的参数来初始化GPIO
4.GPIO_StructInit():给结构体变量赋值
5.8个GPIO读写函数,具体参考gpio.h文件
GPIO的8种工作模式:
·每个GPIO端口对应16个引脚。例:GPOIOA(PA0~PA15)
(注:PA15、PB3、PB4为JTAG的调试端口,若作为普通端口输出需另外配置)
·内核CPU可以通过APB2总线对寄存器读写,完成输出电平和读取电平的功能
点亮LED灯使用GPIO的推挽输出功能(OUT_PP),且LED灯接在A0口。
main函数如下所示:
int main(void)
{
//使用RCC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//使用GPIO_Init函数初始化GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //Out_PP为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{ //使用输出函数控制GPIO口
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
Delay_ms(2000);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); //GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
Delay_ms(2000);
}
}
对于LED亮灭之间的间隔,使用一个Delay函数来进行延时
另外在工程文件中对不同模块进行封装,Delay函数则需要新建一个Delay.c,Delay.h文件封装在System文件夹中
delay.c文件如下所示
#include "stm32f10x.h"
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
delay.h文件如下所示
#ifndef __DELAY_H
#define __DELAY_H
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
至此就完成了使用单片机进行点灯操作。
类似的,如果要实现流水灯的项目,则需要初始化更多所用到的端口
流水灯的main.c文件如下
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//使用RCC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//使用GPIO_Init函数初始化GPIO口
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //Out_PP为推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //初始化所有GPIOA端口
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
while(1)
{
//使用输出函数控制GPIO口
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);
}
}
至此,流水灯也完成了。