STM32F103

提示:来源正点原子,参考STM32F103 战舰开发指南V1.3PDF资料


前言

提示:这里可以添加本文要记录的大概内容:

开发环境硬件普中科技,接线图在git仓库图片。

参考教程:野火霸道开发板

[野火®]STM32库开发实战指南——基于野火霸道开发板icon-default.png?t=N7T8https://doc.embedfire.com/mcu/stm32/f103badao/std/zh/latest/index.html

开发代码,在git仓库代码和开发板接线图icon-default.png?t=N7T8https://gitee.com/runruntiger/fireproject/tree/master/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/%E6%99%AE%E4%B8%AD%E7%A7%91%E6%8A%80%E5%BC%80%E5%8F%91%E6%9D%BF


提示:以下是本篇文章正文内容,下面案例可供参考

一、工具环境准备

1、git报错

TLS certificate verification has been disabled!

解决办法:CSDNicon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/success/130977680

2、普中科技开发板接线图

接线图icon-default.png?t=N7T8https://gitee.com/runruntiger/fireproject/tree/master/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/%E6%99%AE%E4%B8%AD%E7%A7%91%E6%8A%80%E5%BC%80%E5%8F%91%E6%9D%BF

3、protues

Account
Component Search Engine: Free Symbols, footprints, & 3D modelsProtues123!colour

资源:proteus下载2023最新版-proteus电脑版v8.7-proteus官方正版免费下载-华军软件园

参考 :单片机仿真软件Proteus Pro 8.9版本License过期_proteus license失效了-CSDN博客

教程:Proteus快速入门(最详细教程)-CSDN博客

stm32LED灯:基于Proteus无实物STM32入门自学教程(一)--LED灯点亮闪烁_proteus stm32-CSDN博客

下载元器件库:Proteus添加新的元件库_proteus官网下载元件库-CSDN博客

2、keil安装

安装5.23稳定版本,安装路径I:\安装包\Keil\Keil

keil安装成功后,会弹出下图页面

点确定,点击File——Import,开始导入pack包

导入pack包后会自动弹出下图

依次安装即可。导入pack包即可关闭pack installer界面。

打开keil,拷贝CID

生成liscense

输入lisence成功

二、开发

2.1.设计电路图

三、软件开发

1、标准库工程

1、使用3.5.0库文件库文件。路径F:\野火\STM32F103_MINI开发板\A盘(资料盘)\3-STM32官方资料\STM32F103官方固件库与手册(标准库)

根据教程配置keil教程,选好芯片型号,配置好点击编译。

1、报错1

.\Output\fireProject.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).

解决办法:新建main.c文件,然后增加以下代码

int main(void)
{

}

参考:MDK编译报错Error: L6218E: Undefined symbol main (referred from __rtentry2.o)_l6218e:undefined symbol main.o-CSDN博客

2、报错2

.\Output\fireProject.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_hd.o).

增加以下代码

void SystemInit()
{
	
}

3、报错3

E:\Gitee\fireproject\fireLibraryProject\User\main.c(9): warning:  #1-D: last line of file ends without a newline

main.c文件最后增加一行空行

我的普中开发板是STM32F103ZET6,RAM512Kb,使用hd.s的startup文件。proteus是STM32F103R6的芯片,RAM不确定,所以感觉可能两个代码不能直接替换。

2024年1月9日00:29:34

今天重新打开工程真是见鬼了,编译各种报错。之前正常编译的代码还提交git的,今天就不行了。恶心。

第一个错误就是报找不到system_conf.h文件。后来加入conf.h文件。但是之前为啥没报错?

第二个错误是加了conf.文件报找不到RTC_xxx.h文件。后来发现应该是加入野火的conf.h文件,这个是处理过的文件。

第三个就是之前写了systemInit函数,但是今天不用写了,报system_stmf10x.h文件重定义了。之前可能是工程没包含这个.c文件。

反正着实被恶心到了。竟然过了一天就变了。有文件路径什么的配置全都没了。我还查看了gitee上传记录,竟然确实没有上传keil工程配置的文件。难道我没有配好就上传了?好烦啊!

这次又上传了,下次看看还会出现同样问题不。

现在对比了前后两版代码,主要是下面两处的区别

第一处:

 第二处:

右边的可能是我从其他什么地方拷来的文件。导致工程报错。害!

2、led灯

2023年12月26日10:24:07

昨晚看了led灯相关的野火教程帖子。主要是看了led寄存器点亮led和led库函数版点亮led灯。其中,寄存器版只要使用了ODR和另一个gpio相关的寄存器。其中一个是设置gpio管脚速率,一个是设置电平。另外还有一个寄存器是开启gpio时钟的,教程中是这么说的,单片机上电的时候是默认关闭各个外设的时钟,为了降低功耗。所以在点亮led代码中需要开启对应管脚的时钟。

以上及时关于寄存器用到的三个寄存器的回顾。

在寄存器版本中还介绍了启动文件,即start_up文件。说start_up主要是汇编指令初始化整个单片机,然后最后调用两个主要的函数。一个是system_init函数,一个是_main。文中还着重说明了_main函数并不是指的c语言的main函数,而是从_main开始,就进入了配置c语言运行环境,进入c代码的环境。文中还着重说明了system_init函数,文中是简单处理了,将system_init函数写成空函数。不然不写system_init函数会报错。将system_Init函数写成空函数就不会出现编译器报错。但是这样系统时钟不是没有初始化了吗?文中也介绍了,如果不配置外部时钟,会调用单片机内部时钟HSI,HSI是8M的内部晶振。

以上就基本是寄存器版本的内容了。

不是的,其实还有一部分,就是设置GPIO引脚模式。分为输入和输出。包括上拉下拉输入、浮空输入、模拟输入。

输出包括开漏输出、推挽输出。介绍说推挽输出使用了两个MOS管,像led灯需要设置gpio高低电平的,设置成推挽输出。

像ADC采集的设置成模拟输入。

上面关于引脚模式的记忆不完成。寄存器相关的知识点基本就是以上几点了。

下面回顾一下关于库函数版本的内容。

文中说野火提供了stm32 3.5的固件库文件,可以将这些文件放到工程中。其他的就是调用库函数接口初始化gpio口。这边可以照着教程搞一遍。

现在感觉清晰了些,gpio后面应该就是关于系统时钟的介绍和配置。然后后面就是按键检测,及后面稍微复杂的adc、can等教程了。都需要在这个文章中整理一下。

写完这些,我又去看了下野火的教程,主要是看了goio口几种模式。这次看过后知道了一共有8种模式。分别为浮空输入、上拉输入、下拉输入、模拟输入。输出有开漏输出、推挽输出、复用开漏输出、复用开漏输入。

那么下面就写一下这几种模式的区别。有点要说的是上拉/下拉输入指的单片机内部的上拉/下拉电阻。里面还有一个TTL施密特器件。比如输入时,信号从管脚进来,第一个就是上拉/下拉电阻。然后进入施密特开关。经过施密特开关对信号的处理,存到寄存器中,然后处理器就能读到数据。

那么浮空输入就是上拉下拉都没有,信号直接进入施密特开关,再存储到寄存器中。所以浮空输入的信号在没有外部输入的时候电压值是不确定的。文章中说按键检测可以用浮空输入。

上拉下拉的话就是上拉一个电阻或者下拉一个电阻。

这边插入一个关于8种模式的电路图和解释的帖子:深刻理解GPIO(上拉输入、下拉输入、模拟输入、浮空输入,开漏输出,推挽输出的区别,以STM32为例)-CSDN博客

其中还涉及到上拉电阻接VDD和下拉电阻接VSS。对于VDD和VSS是什么我也是不知道的。百度一下 :一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源。电路中VCC、VDD、VEE和VSS的区别!-电子发烧友网

所以VDD是设备接入电压,可能是5V吧。【实际百度了是3.3V:https://www.baidu.com/link?url=6RKErAJe3kN7-tPzwEpaLK2P8EgHUMdraM6YgpkGVrWjNGRQyDRxalSXLBnU4w-GFw4Tgnh7fp7h1YDtxIxERVjtXOehU22IFD1yj9Ni3yS&wd=&eqid=8d7bbe680031c55200000006658a7101STM32的工作电压(VDD)为2.0~3.6V】。VSS是地电压0V。所以上拉输入是接一个连接3.3V电压的电阻。下拉输入是连接一个连接0V的电阻。比如接上拉电阻。当没有输入的时候,输入时1,当管脚输入0V时,VDD通过电阻导通,施密特获取低电压。单片机读到0V。所以上拉和下拉可以使读取信号更稳定。

复用开漏和推挽和复用推挽的区别就在于当管教复用了就可以设置成复用模式。

刚才突然想到,浮空输入和上拉下拉输入是不可替代的。尤其对于按键检测,只能是浮空输入,不能是上拉下拉,不然只能检测到一个信号。又有了一点深入的理解。

过了好一会,突然发现还有没有陈述到位的知识点。比如startup文件的一小部分汇编语言。
回忆一下汇编语言是啥的:

mov b0 system_Init

BLX b0

mov b0 __main

BL b0

只能想起这么多啦

;Reset handler
Reset_Handler    PROC
                EXPORT  Reset_Handler     [WEAK]
    IMPORT  SystemInit
    IMPORT  __main

        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__main
        BX      R0
        ENDP

实际上还有

1、写一个注释 ;Reset handler

声明一个函数Reset handler。PORC是个伪指令,相当于声明一个函数Reset handler。

EXPORT说明Reset handler可以供外部使用

IMPORT说明systemInit和__main函数再其他文件中,需要去其他文件中找。
LDR表示将SystemInit函数地址加载到R0寄存器中

BLX表示跳转到R0执行程序,及执行SystemInit程序

ENDP表示程序结束。

其中[WEAK]表示弱连接,在其他地方定义了同名函数,就用其他地方定义的函数。

BLX和BL什么区别呢?

看了这个帖子:【ARM学习笔记】ARM汇编指令:B、BL、BX、BLX的区别_blx指令-CSDN博客

也没有看懂,后面可以看看汇编指令啦! 

这个帖子是反编译指令::C语言函数反汇编_c语言反汇编-CSDN博客

2023年12月27日09:31:41

昨晚又看了关于RCC系统的教程,RCC全程reset and clocl control,中文名为复位和时钟控制。

RCC主要控制系统时钟、PCLK1、PCLK2、HCLK、PLLCLK。他们的关系是PCLK1=HCLK=PLLCK=系统时钟=72M,PCLK2=1/2PCLK1=36M。

其中还涉及到一个时钟树的概念,还不是很了解。然后RCC这个教程主要是介绍了startup文件。介绍了中断向量表和汇编指令,野火好像还有一个汇编学习资料。然后startup启动文件中还介绍了堆栈的申请方式,用的是汇编指令。

2023年12月27日10:41:37

刚才又看了一下教程,发现我还忘了想起来HSE晶振的问题,晶振分内部晶振和外部晶振。内部晶振为HSI,HSI=8M。外部晶振为HSE,分为有源晶振和无源晶振。有源晶振只需要接OSE_IN引脚就行了。无源晶振需要接OSE_IN和OSE_OUT,并且需要接一个谐振。

另外野火这个教程还介绍了stm32各个时钟,昨晚没有看完,今天才发现。是个好教程。

对PLLCLK存在疑问,不知道这是什么时钟,这个帖子介绍了,不过我还没看完,记录一下:

单片机stm32之时钟树以及修改系统时钟频率(转) - 知乎

2、存储器

RAM

random access memory

随机读取数据存储器

DRAM

dynamic random access memory

动态随机读取数据存储器

电容动态刷新

SDRAM

synchronize dynamic random access memory

同步动态存储器

DDR SDRAM

double data xxx SDRAM

Double Data Rate Synchronous Dynamic Random Access Memory

双数据率同步动态随机存储器

不仅上升沿读取数据,下降沿也读取数据

DDRII/DDRIII SDRAM

与DDR SDRAM处理一样,同步信号速率增大

SRAM

static random access memory

静态随机读取数据存储器

锁存器作为存储单元

读取速度快,贵

ROM

read only memory

以前只读,沿袭说法、现在可读写

mask ROM

掩膜存取器

掩膜mask,只能读数据

PROM

OTPROM

one time program ROM

一次可编程存储器,只能写入一次

EPROM

ERASE program ROM 可擦除存取器

紫外光照射可重新写入

EEPROM

Electic erase program ROM

电子擦除存储器

FLASH

闪存

NOR FLASH

NAND FLSASH

块擦除写入,一块一个扇区4096个字节

SD卡、

硬盘、固态硬盘

光盘
软盘
机械硬盘

以上就是野火教程存储器章节介绍的内容,基本回顾出来了。

其中有以下几个方面是打结的。

1、DRAM是SDRAM上一层级、DRAM是大类

2、DDR SDRAM没记住,DDR英文全程没写出来

3、SRAM存储单元是什么,没想起来

4、PROM是大类没想起来。EEPROM写成了EEROM

5、FLASH分为NAND FLASH和NOR FLASH完全没想起来。NOR FLASH和NAND FLASH区别没想起来。NOR FLASH可以按字节读取。

6、固态硬盘是那种存储器没想起来

另外以上的存储器对应哪些设备需要补充。


总结

未完待续... ...

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值