(一)简介
我们可以先熟悉一下stm32f103c8t6的编程软件keil5,由于配置环境比较麻烦,所以建议用工程模板
平时在工程模板的基础上加点功能,或者开发都是比较方便的
(二)工程模板
工程模板:https://wwmg.lanzouj.com/i9Fx72h0jq9e
①DebugConfig、Listings、Objects是在创建工程时自动生成的,用来存放调试文件
②User、Start、Library文件夹是自己创建的,用来存放应用程序,和标准库文件
③Project.uvprojx是项目文件,点这个直接打开项目
(对于模板是怎么来的,里面的配置文件有什么用,本教程不细说,详细信息在江科大的视频有讲解)
(三)配置GPIO
点灯,其实就是配置GPIO口的高低电平,所以我们需要了解GPIO口的配置流程
①开启GPIO时钟
在时钟库函数STM32f10x_rcc.h里面可以找到
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
所以根据板载LED的位置,C13端口,可以得到下面的函数
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOC的时钟
②配置GPIO参数
在GPIO配置库stm32f10x_gpio.h里面可以找到
GPIO_InitStructure.GPIO_Mode 引脚工作模式
GPIO_InitStructure.GPIO_Pin GPIO引脚
GPIO_InitStructure.GPIO_Speed 引脚速度
GPIO_InitTypeDef GPIO_InitStructure; 定义一个结构体变量
GPIO_Init(GPIOC, &GPIO_InitStructure); 将配置后的结构体变量传入GPIO_Init函数
我们知道板子上的LED是C13引脚,而且是输出模式,速度设置50mhz
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
(四)定时器延时
我们在system里面可以看到已经写好的delay函数,delay是很重要的函数,我们看看stm32是如何实现的
- 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_us(uint32_t xus)这是一个函数定义,函数名为Delay_us,它接受一个无符号32位整型参数xus,这个参数表示需要延时的微秒数。
- SysTick->LOAD = 72 * xus;这行代码设置了SysTick定时器的重装载值。由于STM32的SysTick定时器是向下计数的,当计数到0时产生SysTick中断(如果使能了中断)。这里的72通常表示STM32的系统时钟频率(HCLK)是72MHz,即每秒72,000,000个时钟周期。因此,72 * xus计算出达到xus微秒所需的时钟周期数,并设置为重装载值。注意,这里的计算假设了系统时钟频率是72MHz,实际应用中需要根据具体的系统时钟频率来调整这个值。
- SysTick->VAL = 0x00;这行代码将SysTick定时器的当前值(VAL寄存器)清零,即从最大值(LOAD寄存器的值)开始计数。
- SysTick->CTRL = 0x00000005;这行代码配置了SysTick定时器的控制寄存器(CTRL寄存器)。0x00000005这个值做了以下几件事:
- 第0位(ENABLE位)被设置为1,启动了SysTick定时器。
- 第2位(CLKSOURCE位)被设置为1,选择HCLK(系统时钟)作为SysTick定时器的时钟源。
- 第16位(TICKINT位)保持为0,表示不使能SysTick中断。
- while(!(SysTick->CTRL & 0x00010000));这行代码是一个忙等待循环,它检查CTRL寄存器的第17位(COUNTFLAG位)。当SysTick计数器计数到0时,COUNTFLAG位会被硬件置为1。因此,这个循环会一直执行,直到SysTick计数器达到0,即延时完成。
- SysTick->CTRL = 0x00000004;最后,这行代码通过清除ENABLE位(将CTRL寄存器的值设置为0x00000004)来关闭SysTick定时器。这样做是为了防止在函数返回后定时器继续运行,可能会干扰其他使用SysTick定时器的功能。
以上的解析看不懂也没关系,会用delay函数就可以了
- Delay_ms(500);//延时500ms
- Delay_us(500);//延时500us
- Delay_s(5);//延时5s
(五)点灯
在配置完GPIO和delay函数后,就可以做一个LED闪烁
我们的程序写在User里面的main.c函数内
先引用stm32的库,还有delay库
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
配置一下GPIO13引脚
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
-
- GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
可以用GPIO_ResetBits(低电平),GPIO_SetBits(高电平)来控制引脚
并且加上延时函数Delay_ms(500);来达到闪烁的效果
- GPIO_ResetBits(GPIOC, GPIO_Pin_13); //将PC13引脚设置为低电平
- Delay_ms(500); //延时500ms
- GPIO_SetBits(GPIOC, GPIO_Pin_13); //将PC13引脚设置为高电平
- Delay_ms(500); //延时500ms
(六)烧录
我这里使用的烧录工具是ST link v2
点击一下魔术棒
在debug选项内,可以选择我们的下载器,这里选择st link
点击Settings,看到右边读取到板子信息,则代表连接成功
我们还需再Flash Download内选择板子的Flash
这里选择128k的,然后点击Add
左上角,点第三个,可以全部编译一下
0错误0警告,代表程序没问题
点一下绿色的下载按钮,可以将程序下载到板子内
下载成功
(七)程序现象
可以看到板载LED以500ms的间隔闪烁