STM32入门之软件安装、寄存器理解
设备:STM32F103VET6秉火
uVision5安装
安装C51和MDK-ARM共存
激活--点
File
>License Management
>选中一行>复制CID在下面输入序列号-然后点AddLIC
- 先安装C51954a.exe然后进程序点
File
>License Management
激活 - 再安装MDK516a.exe再激活一次(安装路径英文),
- 最后安装Keil.STM32F1xx_DFP.1.1.0.pack芯片包(注意请勿使用高版本的芯片包,不支持)
库文件安装
打开软件>工具栏按钮Pack Install
(魔术棒那排最后的那个)>
关于isp串口下载
软件:mcuisp.exe
- 勾选
校验``编程后执行
选中最下面DTR低电平复位.RTS高电平进Bootloader
然后就可以烧录了
二进制按位操作
&(按位与)、|(按位或)、^(按位异或)、~ (按位取反)
-
&
-"与"操作--都为1时,结果为1,否则结果为0
1010 & 1001 = 1000
-
|
-"或"操作--只要有1个是1的位,结果为1,否则结果为0
1010 | 1001 = 1011
-
^
-"异或"操作--相应拉值相同时结果为 0,不相同的结果为 1
1010 ^ 1001 = 0011
-
~
-"取反"操作--每一位都取反
~1010 = 0101
如上示例:
设置PB0输出为低电平GPIOB_ODR &= ~(1<<0);
设置PB0输出为高电平GPIOB_ODR |= (1<<0);
第一个示例程序
新建工程
Projrct
>New uVision Project
>Device
选项>选择芯片型号STM32F103VE
>
仿真器配置 魔术棒options
Target
选项页>Use MicroLIB
-√
Output
选项页>Create HEX File
-√>select Folder for objects
-选择项目输出的文件夹-Output文件夹
Listing
选项页>select Folder for Listing
-选择汇编的文件清单>Listings文件夹
C/C++
选项页>Define-STM32F10X_HD, USE_STDPERIPH_DRIVER
>include paths>设置目录如下
....\Libraries\CMSIS
....\User
....\Libraries\FWlib\inc
....\User\led
debug
选项页>use
-CMSIS-DAP Debugger
Utilities
选项页>Use Debug Driver
-√
debug
选项页>Settings
>debug
选项页>Max Clock
-5MHz>Flash Download
选项页>选择Erase Seclors-另外三个全勾选
如需要HEX文件请勾选optput>create HEX File
以上设置因太过可以在一个文件里设置好之后,做为模版文件,后面修改这个模版即可https://files.cnblogs.com/files/praybb/SMT32F10%E6%A8%A1%E7%89%88.zip
工程目录说明
- Doc 说明档
- Project 项目的
- Libraries 硬件的头文件等
- USER 源代码目录,主要开发者写的代码
- keilkill.bat 清理编译生成的文件等
IO口八种模式
IO没设置时表现为:高阻态(高阻态不是一个电平状态引脚上的电压不稳定,可能是高电平,也可能是低电平)
有些传感器等元气件,他们的信号输出有效时候会输出一个高电平(或者低电平),无效时候不输出,为开路。对此所以有了下面的上拉输入与下拉输入的模式
-
上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。
-
下拉输入模式:区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)。
-
浮空输入模式:顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号。
-
开漏输出模式:当写1时,输出不被激活,电平无变化,只有外部加个上拉电阻,输出端口才为1
当写0时,输出为0。
所以如果外部有上拉电阻的话,写1就起作用,就输出1。如果没有,写1就无作用。写0什么时候都输出为0。
即只可以输出低电平,高电平得靠外部电阻拉高。
电路方面只有NMOS管工作,多用于I2C与SMBUS总线 -
推挽输出模式:写1就输出1;写0就输出0 电路方面就是二个mos管的开关
-另外有模式输入还有模式输出
TTL与RS232的区别
TTL输出低电平要<0.8V,高电平>2.4V
TTL输入低电平要<1.2V,高电平>2.0V
RS232逻辑0为+3+15V,逻辑1:-3-15V
引脚定义
找到相关的型号的数据手册文档引脚定义
的章节
- 脚位 按封格式找(我的是LQFP144封装)芯片的引脚(圆点逆时钟计算)
- 管脚名称"一般在pcb板上显示的丝印
- 类型-I=输入,O=输出,S=电源, HiZ=高阻
- 电平-FT=可以容忍5V
- 主功能能-
- 复用功能-
- 重定义-
一般表格下面有各标识说明
查看寄存器操作与查看文档
例如:有让管脚GPIOB2输出高电平其它不改
操作步骤
开启端口时钟
>设置端口工作模式
(CRL和CRH)>设置高低电平
(ODR,BRR和BSRR)
以下操作的相关文档都在STM32F10X中文参考手册
中查询(存储器映像表也可在"数据手册"的第4节存储器映像表找到)
- 开启时钟
通过系统框架图可得知GPIOB
在APB2
总线上,所以要打开其总线RCC对应的时钟RCC
才行,因我的设备为大容量,所以应该是在6.章节,而不是7.章节
先查看中的2.3存储器映像
中找到RCC
的基地址0x4002 1000
因为我们要操作寄存器所以找到其章节下的6.3 RCC寄存器描述
>因为我们是要让APB2下的PB端口
的时钟使能所以是6.3.7 APB2外设时钟使能寄存器(RCC_APB2ENR)
>其中得到了其的偏移地址:0x18
然后可以看到其寄存器表的第3位IOPB EN-其描述为0表示IO端口B时钟关闭 1表示IO端口B时钟开启>所以我们只要将其置1即可
可得到其寄存器的地址为:0x4002 1000
+0x18
=0x4002 1018
,
然后让其第3位-置1*(unsigned int*)(0x4002 1018) |= (1<<3);
不影响其它位,设置第3位为1; - 设置端口工作模式
先找到2.3存储器映像
找到GPIO端口B
的基地址0X4001 0C00
注意下面的查询出的偏移值都是在这个基地址上的偏移.其中的寄存器的位数排列可以看下面的笔记C语言的基础-结构体
可以理解
从8.1 GPIO功能描述
的文献中可得出端口配置寄存器有GPIOx_CRL(低位)和GPIOx_CRH(高位)
GPIOX_CRL是用来设置PB0
-PB7
的 其中里的0-4位是设置PB0
的,而GPIOx_CRH是用来设置PB8
-PB16
的,同样也是4位的模式设置
因为我们要操作寄存器所以找到其章节下的8.2.1 端口配置低寄存器(GPIOx_CRL)
其中偏移地址:0x00
即表示为基地址一样
因为是4位为一组,要改变PB2模式,应该要改8-11这4位数我们可以写成*(unsigned int*)(0X4001 0C00) |= ((1)<<(4*2));
其1表示0001通用推挽输出模式 - 设置端口高低电平(这里只先讲ODR)
因为我们要输出高低电平,也就是等于输出数据,所以找到8.2.4 GPIOx_ODR(注意ODR是表示output data register的缩写输出数据寄存器,如要用到别的功能再找别的)得到 地址偏移:0x0C 复位值:0x0000 0000
如上即可得到寄存器地址为:0X4001 0C00
+0x0c
=0x4001 0c0c
然后代码就可以写成*(unsigned int*)(0x4001 0C0C) |= (1<<2);
不影响其它位,设置为1输出高电平
如要输出低电平应写成*(unsigned int*)(0x4001 0C0C) &= ~(1<<2);
因开发板电路低电平点亮LED
这里得出的寄存器内存操作代码为
int main(void)
{
*(unsigned int*)(0x40021018) |= (1<<3);
*(unsigned int*)(0X40010C00) |= ((1)<<(4*1));
*(unsigned int*)(0x40010C0C) &= ~(1<<1);
}
C语言的基础
- 声明(define)
define
- 结构体
typedef unsigned int uint32_t; /*无符号32 位变量*/
typedef unsigned short int uint16_t; /*无符号16 位变量*/
/* GPIO 寄存器列表 */
/* GPIO 寄存器列表 */
typedef struct {
uint32_t CRL; /*GPIO 端口配置低寄存器 地址偏移: 0x00 */
uint32_t CRH; /*GPIO 端口配置高寄存器 地址偏移: 0x04 */
uint32_t IDR; /*GPIO 数据输入寄存器 地址偏移: 0x08 */
uint32_t ODR; /*GPIO 数据输出寄存器 地址偏移: 0x0C */
uint32_t BSRR; /*GPIO 位设置/清除寄存器 地址偏移: 0x10 */
uint32_t BRR; /*GPIO 端口位清除寄存器 地址偏移: 0x14 */
uint16_t LCKR; /*GPIO 端口配置锁定寄存器 地址偏移: 0x18 */
} GPIO_TypeDef;
GPIO_TypeDef * GPIOx;
- 主程序(引用固体库)
#include "stm32f10x.h"
int main(void)
{
}
下一章进入固件库编程