2-STM32带你入坑系列(点亮一个灯--Keil)
1-STM32带你入坑系列(STM32介绍)
首先是安装软件

这一节用Kei来实现,需要安装MDK4.7这个软件,怎么安装,自己百度哈.都学习32的人了,不会连个软件都不会安装吧....还是那句话
没有百度一下解决不了的事情,如果有那就是百度两下(除了科研和探索人类未知领域)
建个文件夹




我用的是STM32F103C8t6 大家根据自己的选择


建一个主函数的 .c文件




编译一下


启动文件里面有个执行 SystemInit函数的调用,因为咱没有这个函数,所以报错了,其实寄存器开发用不到,实际上这是官方提供的库开发的时候需要的
可以看一下官方提供的库开发里面SystemInit实现的什么功能


主要的是配置了一开始的时钟,因为是初学者,所以先不用管哈,以后咱也会去配置外设时钟,,不对,这一节就会去配置时钟
咱就写一个这个函数,然后内部什么都不写


还有个警告,实说最后的代码要多加一个空行

我也不知道为什么有这个规则

我的开发板有个灯是PC13

咱就让PC13输出高电平,然后控制灯亮

然后咱就找控制PC13的寄存器,看看往寄存器里面写几然后控制PC13输出高电平


首先需要明确一件事情哈
每个IO都有 CRL,CRH,IDR,ODR,BSRR,BRR,LCKR 这些寄存器,而这些寄存器都是32位的,占四个字节,(大家可以看图哈),

假设咱的单片机哈有PA口和PB口
然后假设PA的地址是 0x40010800 PB的地址是 0x40010C00 实际上内部的寄存器呢,是这样的

然后再说一下引脚的模式

模拟输入:该引脚就会连接内部的模拟输入模块(使用ADC或者DAC的时候需要设置)
浮空输入模式:引脚状态完全由外部决定(一般串口的RX引脚设置成这种模式)
上拉/下拉:就是内部实现上下拉
通用推挽输出:就是直接输出高低电平,推挽输出还有个速率问题

这样理解:假设SPI传输的速率是9M的,假设我设置了引脚的输出最大是2M,引脚的反转速度根本跟不上哈,所以会传输不正常,所以可以设置输出速率为10M
当然速率越高,功耗越大
通用开漏输出:和51单片机的P0口似的,没有输出能力,需要外部接上拉电阻才可以(可以用来做通信时候的电压匹配,因为咱的32是3,3V供电,假设和5V的芯片通信,咱可以设置为这个模式,然后上拉一个电阻,然后电阻另一边接的是5V)
后面还有复用功能推挽/开漏输出:其实哈所谓复用,就是指引脚的第二功能,就是除了正常的输入输出的其它功能,列如:
PA2还有个功能是串口2的输出,如果要用这个功能,就需要配置PA2为:复用推挽输出
好啦好啦,请清空自己的脑子,这些东西哈,等用到了再说.... 记住哈,用到什么学什么,知识的海洋永远没有尽头的,千万别像学校里面似的先统统学学学,最后来个考试, 咱是学一个知识点,用一个知识点,然后再学一个知识点,再用一个知识点.......
现在假设配置 PA0 输出 高电平 输出速率咱选择 50M 注意:设置输出高电平,那么IO口就是一直是高电平,和输出速率没有关系,唯一的关系就是速率越高响应的越快
举个栗子:
假设哈: 速率是1HZ 那么执行输出高电平操作可能会延时 1S后才执行,然后一直输出高电平
假设用这个速率执行9M SPI通信肯定是不行的,因为这个速率根本跟不上哈.....

配置端口0为推挽输出 50M
那么这个寄存器的值 0x4444 444 3 前面的4444444是用的默认的值, 后面的3就是配置0端口 (0011)
00的意思

11的意思

看一下PA口的地址

起始地址是0x4001 0800

偏移是00h就是说,要配置PA口的CRL这个寄存器,(配置端口0为推挽输出 50M)直接
往0x4001 0800这个地址写入 0x4444 444 3 就可以了
有没有这样想的
0x40010800 = 0x44444443

要告诉编译器0x40010800是一个地址才好,然后我要往这个地址里面写东西
(int *)0x40010800 这样就能告诉编译器0x40010800是一个地址
然后读取这个地址里面的值 aa = *((int *)0x40010800)
给这个地址赋值 *((int *)0x40010800) = XXXXX
所以 就是 *((int *)0x40010800) = 0x44444443;

这个只是配置了PA0的模式,咱还要让他输出高电平(配置了引脚,那个该引脚应该会有变化) 仿真下







控制0端口输出高电平就是让ODR寄存器的值是 0x0000 0001
因为这个寄存器说有个偏移是0c 其实,额,还记得这张图不

说白了就是前面的地址被其它寄存器占了而已,注意这里所说的偏移,都是在0x40010800的基础上需要增加多少才能到那个寄存器
所以要配置PA口 的ODR寄存器 就是需要在原来地址的基础上加上 0x0C
所以控制PA0输出高电平就是
*((int*)(0x40010800+0x0c)) = 0x0000 0001

咱先下载到开发板试一试
生成hex文件然后下载到开发板里面



一,下载STM32程序
1,方式一,串口下载(其他下载方式在最后补充)
①调整拨动开关位置 → 短接BOOT0和3.3V → 复位STM32

②打开下载软件,下载程序






会发现......不可以,,,哈哈哈哈 肯定还有没有配置的地方

需要打开时钟,有人就会想,这么麻烦呀......
嘿嘿,想一个场景,现在很多项目都需要低功耗,STM32呢之所以这些地方需要自己选择性的打开,就是为了低功耗
您想想哈,不打开,不用它,肯定省电
好了,咱就去打开时钟去
感觉到繁琐了没,注意这样寄存器开发哈,以后用库函数就方便的多,很多都封装好了,直接调用就可以
我个人感觉要想学好一个东西,其实最重要的是过程,我要让大家知道一切的一切都是怎么来的,为什么ST的官方要弄库函数,库函数是怎么写的.很少人会讲的这么深,总结起来有几个原因(嫌麻烦,懒的具体研究;怕讲不好,反倒让别人不喜欢自己的教程).
我呢从来不嫌麻烦,而且知识储备和自学能力还可以,所以呢....额,我也不知道该说什么,反正还是那句话:我说讲的东西不会让大家感觉到难,只是会感觉繁琐而已
现在市面上倒卖鱼的太多了,真正教给捕鱼的少之又少,我所希望的是前期自己捕鱼自己吃,后期从卖鱼的那里直接买鱼吃.等到哪一天卖鱼的不再了,你不是还可以自己捕鱼.当然你学会了捕鱼,当然也可以卖鱼,我现在就开始卖鱼了,也卖捕鱼的方法
扯了这么多.........

就是往这个寄存器里面的这个位写1就可以了
然后就是找地址


所以RCC_APB2ENR这个寄存器的地址是
0x4002 1000 + 0x18
*((int*)(0x40021000+0x18)) = 0x00000004
这个4 0100



好了好了咱修改修改,去点亮小灯 PC13
首先是打开时钟

所以是 *((int*)(0x40021000+0x18)) = 0x00000010;
配置为输出50M


说一下哈 CRL是配置0-7引脚号 CRH是配置8-15引脚号 所以选择CRH

*((int *)(0x40011000 + 0x04)) = 0x44344444; 默认的咱就默认是4
配置输出高电平

*((int *)(0x40011000 + 0x0C)) = 0x00002000;

下载进去

现在熄灭


补充:下载STM32程序的其他方式
ST-LINK下载














如果是用Jlink (我没有引出来JATG下载端口,只引出来了SW下载模式的端口)


对应接上
然后





好了这一节就说到这里,自己去消化消化
如果这样开发哈,是最直接了当的,而且是执行速度最快的,但是呢,就是麻烦....
3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
2-STM32带你入坑系列(点亮一个灯--Keil)的更多相关文章
- 1-STM32带你入坑系列(STM32介绍)
由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...
- 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)
2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...
- gulp入坑系列(2)——初试JS代码合并与压缩
在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...
- 入坑第二式 golang入坑系列
史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...
- Docker入坑系列(二)
Docker入坑系列(二) 上一篇我们为Docker创造了一个良好的生活环境,这一篇我们就开始让Docker活起来. 安装Docker ok,原文地址在这里. 当然,我只是自己翻译了一下而已- -跟着 ...
- Docker入坑系列(一)
Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- 维多利亚的秘密 golang入坑系列
原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...
- UVM入坑系列笔记(一)
最近本人在做毕业设计,需要用到UVM搭建验证平台,故在网上查找相关资料,看了一些博客和科普,多少有些收获,记录在这里,以便以后复习查看.以下是本人根据网上学习资料整理的笔记,如果有什么不对的地方欢迎指 ...
随机推荐
- Java提高班(二)深入理解线程池ThreadPool
本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...
- Spring Boot 2.x(四):整合Mybatis的四种方式
前言 目前的大环境下,使用Mybatis作为持久层框架还是占了绝大多数的,下面我们来说一下使用Mybatis的几种姿势. 姿势一:零配置注解开发 第一步:引入依赖 首先,我们需要在pom文件中添加依赖 ...
- 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口
在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...
- JavaScript的事件及异常捕获
事件处理 [onClick]单击事件.[onMouseOver]鼠标经过事件.[onMouseOut]鼠标移出事件.[onChange]文本内容改变事件.[onSelect]文本被框选事件.[onFo ...
- arcgis 10.0中的server报错说工作站服务没有打开
大家好! 写这篇文章其实我也不知道该不该写,感觉问题其实也不是自己解决的,但是这个问题困恼了我2天,我还将arcgis10.0重装了一次. 下面也不多说了,主要是由于公司的需求,将自己的arcgis1 ...
- 使用EMQ搭建MQTT服务器
前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...
- DataTable转换成List集合,传递到HTML页面
public string GetPwd(string str) { var dt= bll.Gets(str); List<string> list = new List<stri ...
- [Go] golang互斥锁mutex
1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码2.Lock()和Unlock()定义临界区 package main import ( " ...
- C#/VB.NET 给Word文档添加/撤销书签
在现代办公环境中,阅读或者编辑较长篇幅的Word文档时,想要在文档中某一处或者几处留下标记,方便日后查找.修改时,需要在相对应的文档位置插入书签.那对于开发者而言,在C#或者VB.NET语言环境中,如 ...
- Java 由浅入深GUI编程实战练习(二)
一,项目简介 1.利用Java GUI 绘制图像界面,设置整体布局 2.编写一个随机数生成1~100的随机数 3.编写一个验证类,用于验证用户输入值与生成随机数是否相等并记录用户猜测次数,当用户猜测成 ...