
注意本文章默认您已经将STM32单片机的启动项以及库函数等前期工作准备就绪。一、材料清单1.STM32F103C8T62.面包板3.面包板跳线若干4.STLINK(usb款)5.LED灯若干6.keil5软件二、接线1.STLINK连接STM32开发板示意图图片来源bilibili江协科技2.LED闪烁接线示意图图片来源bilibili江协科技3.LED流水灯接线示意图图片来源bilibili江协科技三、程序编程打开keil5创建新项目先编写延时函数Delay这里我们选择新增一个文件夹的形式。添加一个System文件夹并添加源文件Delay.c以及头文件Delay.hDelay.c代码如下#include stm32f10x.h 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; //关闭定时器 } void Delay_ms(uint32_t xms) { while(xms--) { Delay_us(1000); } } 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写好之后不要忘记在编译器中添加该文件夹以防编译运行时无法调用该文件中的延时函数代码说明在STM32单片机中有几种模式可以写入这里我们使用标准库函数调用GPIO输出数据。3.1LED闪烁RCC_APB2PeriphClockCmd是STM32 标准库StdPeriph_Library中用于使能 / 失能 APB2 外设时钟的核心函数所有挂载在 APB2 总线上的外设如 GPIO、USART1、SPI1、ADC 等必须先通过该函数开启时钟才能正常使用。我们在keil中右键该函数在这里我们可以看到该函数的说明及参数如何使用我们要利用GPIOA端控制输出所以参数为RCC_APB2Periph_GPIOA,第二个参数选ENABLE。第二行代码则是决定GPIO的模式包括输出模式、输出端口、输出速度。GPIO_InitTypeDef Typedefname自定义结构体名GPIO_InitTypeDef GPIO_InitStructure;//定义结构体决定GPIO的模式、端口、及速度GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;端口输出模式有以下8种我们跳到定义枚举常量十六进制值中文含义典型使用场景GPIO_Mode_AIN0x0模拟输入接 ADC 采样、模拟传感器如温敏GPIO_Mode_IN_FLOATING0x04浮空输入按键检测、USART 接收引脚GPIO_Mode_IPD0x28下拉输入按键检测默认低电平按下为高GPIO_Mode_IPU0x48上拉输入按键检测默认高电平按下为低GPIO_Mode_Out_OD0x14开漏输出I2C 通信、多设备共用总线GPIO_Mode_Out_PP0x10推挽输出LED 灯、继电器、普通数字输出GPIO_Mode_AF_OD0x1C复用开漏输出复用外设如 USART、SPI开漏模式GPIO_Mode_AF_PP0x18复用推挽输出复用外设如 USART、SPI推挽模式我们一般选推挽输出模式在该模式下高低电平都能够驱动GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;我们选择A0口GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;速度选择50Mhz即可。GPIO_Init(GPIOA, GPIO_InitStructure);//所有参数一次性传给初始化函数无需多次调用函数传递单个参数。我们写为实现功能的部份我们LED灯点亮的方式是低电平点亮的在这里我们需要先将A0口置为低电平这里我们需要用到一个函数GPIO_ResetBits 该函数的作用是将指定端口置为低电平。我们查看该函数说明因为我们用的是GPIOA口所以第一个参数为GPIOA,端口为A0口所以第二个参数是GPIOA_Pin_0;要实现闪烁效果的花需要高低电平依次交替我们还需要一个将端口置为高电平的函数GPIO_SetBits该函数的作用是将指定端口置为高电平。用法与上述效果一致。所以该部分代码为while (1) { GPIO_ResetBits(GPIOA,GPIO_Pin_0); Delay_ms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_0); Delay_ms(1000); }我们将代码进行整合得到完整代码如下#include stm32f10x.h // Device header #include Delay.h int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//STM32 标准库中开启 GPIOA 外设时钟的核心语句 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//点亮Led灯为低电平点亮推挽输出模式推挽输出模式下高低电平都有驱动能力 GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;//因为点亮的端口为A0故为GPIO_Pin_0 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//速度选为50Mhz GPIO_Init(GPIOA, GPIO_InitStructure);//形参要传递指针传地址 while (1) { //LED闪烁 GPIO_ResetBits(GPIOA,GPIO_Pin_0); Delay_ms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_0); Delay_ms(1000); } }3.2LED流水灯接下来我们实现LED流水灯效果;我们知道了LED灯闪烁的效果便可以知道流水灯是如何实现唯一的区别就是LED闪烁只定义了一个口而LED流水灯需要定义8个口。A0~A7,那么我们该如何定义呢我们跳转到GPIO_Pin的定义查看一下这里会出现在下面GPIO_Pin有多个我们选择member这一项双击打开。然后选择按住CtrlF点击Find Next可以看到下列就是各个端口对应的16进制的值。首先我们需要将A0-A7端口全部启用这里有两种方法第一种GPIO_InitStructure.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;这种方法是一个一个端口来定义从A0-A7第二种GPIO_InitStructure.GPIO_Pin GPIO_Pin_All;这种方法就是将A0-A15的全部端口都启用比较省时间。启用端口后我们完成功能实现部份的代码while (1) { GPIO_Write(GPIOA, ~0x0001);//16进制0x0001对应二进制为0000 0000 0000 0001最后一位1对应A0口倒数第二位对应A1口依次往上 Delay_ms(500); //因为我们是低电平点亮所以要加取反反之则不用加 GPIO_Write(GPIOA, ~0x0002);//16进制0x0002对应二进制为0000 0000 0000 0010 Delay_ms(500); GPIO_Write(GPIOA, ~0x0004);//16进制0x0001对应二进制为0000 0000 0000 0100 Delay_ms(500); GPIO_Write(GPIOA, ~0x0008);//16进制0x0001对应二进制为0000 0000 0001 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0010);//16进制0x0001对应二进制为0000 0000 0010 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0020);//16进制0x0001对应二进制为0000 0000 0100 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0040);//16进制0x0001对应二进制为0000 0000 1000 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0080);//16进制0x0001对应二进制为0000 0001 0000 000 Delay_ms(500); }将代码整合后得到完整代码如下#include stm32f10x.h // Device header #include Delay.h int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; 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);//16进制0x0001对应二进制为0000 0000 0000 0001最后一位1对应A0口倒数第二位对应A1口依次往上 Delay_ms(500); //因为我们是低电平点亮所以要加取反反之则不用加 GPIO_Write(GPIOA, ~0x0002);//16进制0x0002对应二进制为0000 0000 0000 0010 Delay_ms(500); GPIO_Write(GPIOA, ~0x0004);//16进制0x0001对应二进制为0000 0000 0000 0100 Delay_ms(500); GPIO_Write(GPIOA, ~0x0008);//16进制0x0001对应二进制为0000 0000 0001 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0010);//16进制0x0001对应二进制为0000 0000 0010 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0020);//16进制0x0001对应二进制为0000 0000 0100 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0040);//16进制0x0001对应二进制为0000 0000 1000 0000 Delay_ms(500); GPIO_Write(GPIOA, ~0x0080);//16进制0x0001对应二进制为0000 0001 0000 000 Delay_ms(500); } }3.3蜂鸣器发声这个部分和LED闪烁类似仅是将A0换为B12这里不做过多赘述。完整代码#include stm32f10x.h // Device header #include Delay.h int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//STM32 标准库中开启 GPIOB 外设时钟的核心语句 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽输出模式下高低电平都可驱动 GPIO_InitStructure.GPIO_Pin GPIO_Pin_12;//启用B12口 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//速度选为50Mhz GPIO_Init(GPIOB, GPIO_InitStructure);//形参要传递指针传地址 while (1) { GPIO_ResetBits(GPIOB,GPIO_Pin_12); Delay_ms(100); GPIO_SetBits(GPIOB,GPIO_Pin_12); Delay_ms(100); GPIO_ResetBits(GPIOB,GPIO_Pin_12); Delay_ms(100); GPIO_SetBits(GPIOB,GPIO_Pin_12); Delay_ms(500); } }四、结语谢谢观看如果对您有帮助请留个免费的赞和收藏谢谢啦