学习MinSTM32F103的V3版本(已停产)—— 跑马灯(寄存器版本)

ops/2024/10/19 11:49:12/

实现过程:

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)    // PD2    

void 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灯的方法实现跑马灯程序


http://www.ppmy.cn/ops/15736.html

相关文章

Confluence 快捷键大揭秘:提高效率的小窍门

使用 Confluence 快捷键的好处有&#xff1a; 1.提高工作效率&#xff1b; 2.更流畅地进行编辑、导航和管理操作&#xff1b; 3.减少误操作&#xff1b; 4.展现专业水平。 更多精彩内容&#xff1a; 成为 Jira 大师&#xff1a;效率达人的必备秘诀 Jira Cloud 项目管理专栏 PMO…

网络协议深度解析:SSL、 TLS、HTTP和 DNS(C/C++代码实现)

在数字化时代&#xff0c;网络协议构成了互联网通信的基石。SSL、TLS、HTTP和DNS是其中最关键的几种&#xff0c;它们确保了我们的数据安全传输、网页的正确显示以及域名的正常解析。 要理解这些协议&#xff0c;首先需要了解网络分层模型。SSL和TLS位于传输层之上&#xff0c…

C# 通过阿里云 API 实现企业营业执照OCR识别

目录 应用场景 关于阿里云企业营业执照OCR识别 开发运行环境 类设计 类属性 类方法 实现代码 创建 Company 类 调用举例 小结 应用场景 企业营业执照犹如个人的身份证一样&#xff0c;是​​​​​​​工商管理机关发给企业、个体经营者的准许从事某项生产活动的凭…

三维点云处理-KDTree和Octree

点云数据主要是表征目标表面的海量点集合&#xff0c;并不具备传统实体网格数据的集合拓扑信息。因此&#xff0c;如何建立离散点间的拓扑关系&#xff0c;实现基于邻域关系的快速查找也是点云数据处理中比较核心的问题。对于一维数据来说&#xff0c;典型的树形存储结构如Bina…

探索常见经典目标检测算法:从YOLO到Faster R-CNN

目标检测是计算机视觉领域中的重要任务之一&#xff0c;它旨在从图像或视频中检测出目标的位置和类别。随着深度学习技术的发展&#xff0c;许多经典的目标检测算法相继出现&#xff0c;其中包括YOLO&#xff08;You Only Look Once&#xff09;、Faster R-CNN&#xff08;Regi…

教授 Avi Wigderson荣获2023年图灵奖

2023年图灵奖&#xff0c;最近刚刚颁给普林斯顿数学教授 Avi Wigderson&#xff01;作为理论计算机科学领域的领军人物&#xff0c;他对于理解计算中的随机性和伪随机性的作用&#xff0c;作出了开创性贡献。 Avi Wigderson因其在计算复杂性理论、随机性与算法等领域的开创性贡…

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

C++11单例模式

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…