首先是安装软件html
这一节用Kei来实现,须要安装MDK4.7这个软件,怎么安装,本身百度哈.都学习32的人了,不会连个软件都不会安装吧....仍是那句话函数
没有百度一下解决不了的事情,若是有那就是百度两下(除了科研和探索人类未知领域)post
建个文件夹学习
我用的是STM32F103C8t6 你们根据本身的选择url
建一个主函数的 .c文件spa
编译一下htm
启动文件里面有个执行 SystemInit函数的调用,由于咱没有这个函数,因此报错了,其实寄存器开发用不到,实际上这是官方提供的库开发的时候须要的blog
能够看一下官方提供的库开发里面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下载模式的端口)
对应接上
而后
好了这一节就说到这里,本身去消化消化
若是这样开发哈,是最直接了当的,并且是执行速度最快的,可是呢,就是麻烦....