stm32点亮led灯

  • stm32点灯原理
    • 建立工程文件
      • 接下来进行硬件连接和代码编写
  • 硬件连接
    • 烧录利用FlyMcu 串口烧录工具
      • 总结

stm32点灯原理

通过设置相应端口的时钟,在配置相应端口寄存器,最后配置端口模式,即可点亮led灯,(记住所有工程文件要用全英文不能有中文)

建立工程文件

首先我们要明白,利用stm32点灯一等要有相关的启动文件,和寄存器配置文件
[点灯相关文件]
(https://pan.baidu.com/s/14K3Xz5KyCv-5iLk0U2iP3w)
提取码:936q
所有现在开始建立工程
建立新工程Light2,弹出界面选择stm32c8就行,后面弹出的库文件不用加直接取消


这里分析一下启动文件
ST 公司提供了分别用于不同容量的 STM32 芯片,这三个文件是:
startup_stm32f10x_ld.s,startup_stm32f10x_md.s,startup_stm32f10x_hd.s
其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd 适用于大容量产品;
这里的容量是指 FLASH 的大小.判断方法如下:
小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH
可以查一下c8t6的flash大小
这里我们用的是startup_stm32f10x_md.s
之后下载相关文件将启动文件加入到source group 1(收索文件时下面选项改为.s)

然后这个工程会生成许多的文件夹和相关文件,我们对它进行规划
创建两个文件夹OBJ,USER
里面分别存放下列文件


有个文件会自动生成
然后将网盘链接的文件里面SYSTEM文件夹复制到工程目录下

后面打开工程,会跳到keil里面,此时我们对此进行操作
在右键点击target里点击manage project

在对话框里groups里点击新建两个组,将USER,SYSTEM加入,在点击add files
添加system里面的三个文件,delay.c sys.c usart.c(都是分别添加达到下面图片效果)

点击ok后会发现已经创立好工程下面的组,以及组下面的相关文件

后面在USER里面添加test.c文件

之后整体框架已经大概建立完成
为了生成文件方便,不将其放在Listings,objects文件里面,全放在OBJ文件夹里面,因此我们要改变其路径
如果我们此时编译的话,生成的中间文件,还是会存放在 Listings 和 Objects 文件夹下,所以,我们先设置输出路径,再编译。

点击魔法棒,弹出 Options for Target’Target 1’对话框,选择 Output 选项卡→选中 Create Hex File(用于生成 Hex 文件,后面会用到)→点击 Select Folder for Objects→找到 OBJ 文件夹→点击 OK

接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 SelectFolder for Listings→找到 OBJ 文件夹→点击 OK

之后加入sys delay usart路径:点击c/c++,修改define,勾选ELF section per function,在include paths里面点击…(省略号)后面点击新建,将其路径添加在路径下,效果图如下

将三个文件都添加
现在整个模板已经添加完成,

接下来进行硬件连接和代码编写

我们选用相关引脚,PA1 PB0 PB5,对此我们要设置相关时钟和推免输出,
为了代码编写的方便我们在Light里面新建一个文件夹HARDWARE 里面在建一个LED文件夹,
回到keil里面点击target,添加新组,将HARDWARE命名为新组,在新组下面添加加入两个文件,led.c led.h
注意此时还没有将组加入到工程里面,接下来将HARDWARE加入到工程里面,进行之前的操作加入路径

将文件加入后,在把整个新组加入到工程里面
点击魔法棒/c,c++/include paths后面的省略号/点击新建将HARDWARE里面的LED路径加入,效果图如下;

接下来编写文件led.c

#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{RCC->APB2ENR|=1<<2; //使能 PORTA 时钟 RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
//  RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
//  RCC->APB2ENR|=1<<5; //使能 PORTD 时钟 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽输出 GPIOB->ODR|=1<<5; //PB.5 输出高 GPIOB->CRL&=0XFFFFFFF0; GPIOB->CRL|=0X00000003;//PB.0 推挽输出 GPIOB->ODR|=1<<0; //PB.0 输出高GPIOA->CRL&=0XFFFFFF0F; GPIOA->CRL|=0X00000030;//PA.1 推挽输出 GPIOA->ODR|=1<<1; //PA.1 输出高
}

首先要理解相关配置,查表之后,将相关时钟设置,在设置相关推免输出

编写led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化
#endif

在编写USER里面的test.c

#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{ Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化LED_Init(); //初始化与 LED 连接的硬件接口while(1){LED0=0;LED1=1;LED2=1;delay_ms(1000);LED0=1;LED1=0;LED2=1;delay_ms(1000);LED0=1;LED1=1;LED2=0;delay_ms(1000);}
}

编译之后会发现有的电脑会报错,此时点击报错,会弹到相关地方,此处可以通过百度解决,这样有助于知识的增长,也可参考我的改错

在STM32中的sys.c文件编译报出这个错误时:__ASM void MSR_MSP(u32 addr)
{MSR MSP, r0 //set Main Stack value
BX r14
}如果你上上面那种写法的话,那就修改成下面这种应该就没事了void MSR_MSP(u32 addr)
{__ASM volatile("MSR MSP, r0");
__ASM volatile("BX r14");
}

第二种

不使用微库,采用ARM Compiler 6 报错:
报错::’#pragma import’ is an ARM Compiler 5 extension, and is not supported by ARM Compiler 6
点击报错,会弹到相关区域
修改:删掉2个下划线struct __FILE

这些之后还有错可以修改keil相关配置


之后就可以烧录了

硬件连接

PA9–RX
PA10–TXD
GND–GND
3.3–3.3
usb串口与stm32连接
要将boot0设为1,boot1设为0
之后就可以烧录了

烧录利用FlyMcu 串口烧录工具

将生成的hex文件加入到目录中,调制DTR为低电平复位,RTS高电平进BootLoader
开始烧录,效果图如下(要连接网络)

之后进行连接面包板和灯,将输出端口接到led灯的低电平部分,led灯另一端接到高电平3.3V一遍,接通stm32电源即可此时boot1,boot0都要置0
下面是效果图

总结

通过本次实验我了解了很多了
知道使能时钟的开启要查询地址
了解到GPIOB->CRL是8为到15的寄存操作指令,GPIOB->CRH是0到7的寄存操作指令
GPIOB->ODR是输出相关指令
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
要查询相关地址
需要设置运作模式

stm32点亮三个led灯相关推荐

  1. 采用STM32外部中断模式控制LED灯亮灭

    文章目录 实验工具 一.STMCube配置项目 1.配置引脚 2.配置EXIT 3.配置SYS 4.配置GPIO 5.创建代码 二.使用KEil配置代码 1.打开生成的项目,找到stm32f1xx_i ...

  2. 记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯

    文章目录 前言 一.准备工作 二.点亮一盏LED灯 1.配置工程 2.代码实现 3.程序烧录注意 三.按键控制LED灯 1.配置工程 2.代码实现 按键控制 按键进阶1: 按键进阶2 3.基于自己理解 ...

  3. 使用HAL库、STM32CubeMX和Keil 5开发入门教程(一):点亮一盏LED灯(NUCLEO-F411RE)

    转载自:http://blog.csdn.net/charmingsun/article/details/50802267?readlog#t1 本教程以点亮一盏LED灯为目的为大家演示用STM32C ...

  4. linux 心跳灯_Linux下点亮第一个LED灯

    第一步:  在window下编写汇编代码,点亮第一颗led灯: .text .global _start _start: /* * */ /*设置GPF4 输出*/ ldr r1, =0x560000 ...

  5. 单片机两个IO口控制三个LED灯

    在项目中经常会遇到单片机IO口资源不够用的情况,那么如何让单片机的IO口利用最大化呢,这里分享一下用单片机两个IO口控制三个LED灯的几种方法. 方法一:      S1和S2分别接单片机两个IO口, ...

  6. STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯

    STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程(HAL库)-开发环境配置 STM32F103C8T6基础开发教程(HAL库)-Keil添加注释的快捷键 STM32F ...

  7. 瑞萨开发记录01:点亮一颗LED灯(R5F104FEA芯片)

    01.点亮一颗LED灯 一.创建工程 二.查看原理图 三.工程配置 1.引脚复用 2.时钟配置 3.debug设置 4.fix settings完成配置 5.配置各个引脚功能 6.生成代码 四.编写代 ...

  8. Esp8266进阶之路11 企业者的福音之8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  9. Esp8266进阶之路10 【小实战下篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

最新文章

  1. 重写(override / overwrite)
  2. 提取javadoc_使用JavaParser从源文件中提取JavaDoc文档
  3. ecshop 标签使用 非常好的例子
  4. 虚拟服务器新建桌面池,VMware vSphere 服务器虚拟化之二十三 桌面虚拟化之建立手动虚拟桌面池...
  5. apk、ipa包size优化晋级手段
  6. 完全二叉树的判断java,判断二叉树是否为完全二叉树的实例
  7. Educational Codeforces Round 53: E. Segment Sum(数位DP)
  8. Nginx_PHP缓存设置的整理对比
  9. 如何获取EasyCVR平台设备通道的RTMP视频流地址?
  10. 带大家认识下Kvaser CAN总线协议
  11. XTU OJ String game
  12. 速成应用免费教你如何制作开发预约类型的美容美发行业微信小程序「教程」
  13. 3ds Max Taper、Twist和Bend的运用——衣架的制作
  14. zblog php 点赞,zblog文章下面添加点赞等表情的方法(使用畅言实验室)
  15. Qt 菜单背景设置颜色 菜单设置颜色
  16. 如何求指定数字在数组中第一次出现的位置
  17. MTK tpd驱动框架
  18. 基于LTC1068的程控滤波器
  19. windows 7 RDP 增强
  20. 彩虹自助下单系统官方免费版

热门文章

  1. Android:三星指纹解锁SDK
  2. 为统一规划思想、知识、事情而设计的笔记软件
  3. 开发人工智能项目编程语言的选择
  4. 工作流审批业务代码详解(三)
  5. 安全数据资产统一管理
  6. 2022年注册安全工程师安全生产专业实务(建设施工安全)考试模拟试题卷及答案
  7. 用matplotlib画复杂的二维数学函数坐标图像
  8. 数据库基础知识介绍(一)
  9. 分类指数及对应的ETF
  10. 解决Git中打开gitk图形界面时中文部分乱码