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. 1-STM32带你入坑系列(STM32介绍)

    由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...

  2. 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)

    2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...

  3. gulp入坑系列(2)——初试JS代码合并与压缩

    在上一篇里成功安装了gulp到项目中,现在来测试一下gulp的合并与压缩功能 gulp入坑系列(1)--安装gulp(传送门):http://www.cnblogs.com/YuuyaRin/p/61 ...

  4. 入坑第二式 golang入坑系列

    史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...

  5. Docker入坑系列(二)

    Docker入坑系列(二) 上一篇我们为Docker创造了一个良好的生活环境,这一篇我们就开始让Docker活起来. 安装Docker ok,原文地址在这里. 当然,我只是自己翻译了一下而已- -跟着 ...

  6. Docker入坑系列(一)

    Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...

  7. 初生牛犊不怕虎 golang入坑系列

    读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...

  8. 维多利亚的秘密 golang入坑系列

    原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...

  9. UVM入坑系列笔记(一)

    最近本人在做毕业设计,需要用到UVM搭建验证平台,故在网上查找相关资料,看了一些博客和科普,多少有些收获,记录在这里,以便以后复习查看.以下是本人根据网上学习资料整理的笔记,如果有什么不对的地方欢迎指 ...

随机推荐

  1. LeetCode专题-Python实现之第28题: Implement strStr()

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  2. Java开发知识之Java的异常处理

    Java开发知识之Java的异常处理 一丶异常概述 在讲解异常之前,我们要搞清楚.什么是异常. 通俗理解就是我们编写的程序出问题了.进行处理的一种手段. 比如我们的QQ.有的时候就崩溃了.比如出现xx ...

  3. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  4. 痞子衡嵌入式:串口调试工具Jays-PyCOM诞生记(6)- 打包发布(PyInstaller3.3.1)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串口调试工具Jays-PyCOM诞生之打包发布. 经过上一篇软件优化之后,Jays-PyCOM已经初长成,该到了出去历练的时候了,只有经 ...

  5. 【Angular专题】 (3)装饰器decorator,一块语法糖

    目录 一. Decorator装饰器 二. Typescript中的装饰器 2.1 类装饰器 2.2 方法装饰器 2.3 访问器装饰器 2.4 属性装饰器 2.5 参数装饰器 三. 用ES5代码模拟装 ...

  6. 委托初级篇——lambda表达式的推导

    public delegate void ConsoleWriteStr(string name,DateTime now); public delegate int DelegateAdd(int ...

  7. c# ?? 和?

    static void Main(string[] args)      {                  double? num1 = null; // ? 说明num1可以为空        ...

  8. JavaScript 脚本运行方式

    引用外部脚本文件 <script src="/path/to/example.js"></script> 页面内联式 <script> aler ...

  9. Go中局部全局变量的区分

    这是可能也许是容易混淆滴,先上1个例子: package main import "fmt" var nickname = "大虾" func main() { ...

  10. Java开发笔记(八)五种算术运算符

    计算机科学起源于数学,早期的计算机也确实多用于数学运算,以至于后来的各路编程语言,仍然保留着古老的加减乘除四则运算.这四则运算在Java语言中有专门的运算符加以表示,像加法符号“+”对应Java的“+ ...