实现过程:
1.首先要说的是这里用到的keil5软件中新建项目中选取的板子是STM32F103RC(T6),流程如下:
先在你想创建的盘下创建一个新的文件(一定要在文件管理器中先创建,如果直接在keil中创建的话非常有可能会出现结束后找不到文件夹的情况,或者就算找到了也有不在该盘下的提示(尽管是在这里的盘中创建的)),这里我命名为PaoMaDeng,接着在这个文件夹里面创建四个文件夹,这里命名为USER,SYSTEM,OBJ,HARDWARE,简单来说,USER是在keil5中打开文件的,SYSTEM是系统问价,里面的函数大部分情况下内容是固定的,有些可能要在这些基础上添加一些东西,大多数情况下不用管,直接无脑粘贴原来的或大佬(如正点原子)的就行了。之后请根据大佬的资料在添加一个leilkill.bat问价(windows批处理文件),如下图:
现在打开keil5软件,点击project中的new uVision Project,建好后先添加名为startup_stm32f10x_hd.s的STM32启动文件在进行接下来的文件夹以及.c和.h文件创建的一系列操作,这个创建过程可以参考B站上的正点原子MinSTM32F103教程中的寄存器版本的新建工程进行后续操作,中间的头文件添加以及.c文件添加可以参考正点原子在该板子资源包中的不完全寄存器版本参考手册中的新建工程模块以及可以参考CSDN上的一系列文章进行自我摸索,这里大致概括为三个:
一.这只是大致流程,具体的细节要参考其他的了
二.直接用#include "" 或 #include <>,写完后点击编译按钮后即可添加头文件(只用于不超过三个时间,否则会出现很多错误)
三.如果头文件与.c文件是并列的话(不是要包含在.c中的文件)则可以这样(这里任选了一个文件夹):
四.在我这个keil5软件中是没发现可以直接给.c文件添加头文件的,但当时我搜的时候是好像看到过(搞不懂怎么弄)
2.其次,这里知道了基础流程后就是说明这里文件夹中的具体内容
首先是USER中的内容,这里基本上都是自动生成的一些文件,需要加的就是主函数.c文件,这里名为text.c文件。还有下面这两个也要:
具体在哪里,怎么命的名就要看自己的资源是什么了,这里是根据正点原子参考资料进行的。
这里的test.c代码是:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
LED_Init();
while(1)
{
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
}
其次是SYSTEM中的内容,这里要添加的先是三个文件夹(大多数是只用这三个的)。如下图:
delay文件夹中:
这里的delay.c代码是:
sys文件夹中:
其中的sys.c内容:
uart文件夹中:
uart.c中的代码:
OBJ文件夹比较特殊,这里必须要先在文件资源管理器中创建该文件夹,之后就是进行下图操作:
这里要注意的是必须是本项目中的OBJ文件夹点开后添加,刚开是建立的时候什么都没有,当你进行一次次编译时他才会自动添加所有东西,当后续所有程序运行成功后就可以通过相应软件上传整体程序,这里就要用到OBJ中的.hex文件上传到STM32板中。
HARDWARE文件夹中要还要创建文件夹,可以将文件夹命名为你要用的的硬件英文名,这里由于时跑马灯,只有一个硬件内容,故命名为LED,该文件中包含led.c和led.h文件。
led.c包含代码为:
#include "sys.h"
#include "led.h"
#include "stm32f10x.h"void LED_Init(void)
{
RCC->APB2ENR |= 1 << 3;
RCC->APB2ENR |= 1 << 2;
GPIOB->CRL &= 0xFF0FFFFF;
GPIOB->CRL |= 0x00300000;
GPIOB->ODR |= 1 << 5;
GPIOA->CRL &= 0xFF0FFFFF;
GPIOA->CRL |= 0x00300000;
GPIOA->ODR |= 1 << 5;
}
led.h中代码:
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PAout(8) // PA8
#define LED1 PDout(2) // PD2void LED_Init(void);
#endif
上述的内容是正点原子教程中的基础代码,在B站上就有教学视频,以下是运行视频展示:
利用STM32自带的两个LED灯实现跑马灯
3.最后,我将修改test.c中的代码以及led.c和led.h中的代码实现外接两个led灯进行跑马灯实现
首先是硬件连接,两个LED灯较长端都接3.3V(左侧三个都是3.3V,右边三个都是GND,共六个引脚),较短边分别接PA5和PB5引脚。如图:
test.c
//两个外接的LED灯同时亮起和熄灭。
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"int main(void)
{
delay_init(72);
LED_Init();
while(1)
{
GPIOB->ODR |= 1 << 5;
GPIOA->ODR |= 1 << 5;
delay_ms(50);
GPIOB->ODR &= ~(1 << 5); //...11011111
GPIOA->ODR &= ~(1 << 5);
delay_ms(50);
}
}//两个LED灯换着亮起和熄灭
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"int main(void)
{
delay_init(72);
LED_Init();
while(1)
{
GPIOB->ODR |= 1 << 5; // Turn on LED on GPIOB
delay_ms(50);
GPIOB->ODR &= ~(1 << 5); // Turn off LED on GPIOB
GPIOA->ODR |= 1 << 5; // Turn on LED on GPIOA
delay_ms(50);
GPIOA->ODR &= ~(1 << 5); // Turn off LED on GPIOA
}
}
led.c
#include "sys.h"
#include "led.h"
#include "stm32f10x.h"void LED_Init(void)
{
RCC->APB2ENR |= 1 << 3;
RCC->APB2ENR |= 1 << 2;
GPIOB->CRL &= 0xFF0FFFFF;
GPIOB->CRL |= 0x00300000;
GPIOB->ODR |= 1 << 5;
GPIOA->CRL &= 0xFF0FFFFF;
GPIOA->CRL |= 0x00300000;
GPIOA->ODR |= 1 << 5;
}
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"void LED_Init(void);
#endif
实现视频如下(这里只看轮流亮灯的):
使用外接两个LED灯的方法实现跑马灯程序