STM32使用的相关知识点
一、STM32最小系统
单片机最小系统一般有晶振电路、电源电路、复位电路以及调试电路组成。
以下以STM32F103C8T6举例
1.电源电路:
此时电容分为输入电容和输出电容:
- C5、C7为输入电容:作用是防止断电后出现电压倒置。
- C6、C8为输出电容:作用是抑制自激振荡和稳定输出电压。
2.时钟电路:
时钟电路也称晶振电路,其中有两种晶振电路,区别如下:
3.复位电路:
STM32芯片复位管脚持续为低电平时复位,STM32的NRST引脚在内部已经连接了一个上拉电阻,数据手册建议复位电路需外接一个对地电容,如果认为这个上拉电阻较小,用户也可以在复位电路中外接一个上拉电阻。
一般有两种复为形式:
- 上电复位:在上电瞬间,由于电容来两端电压不能突变,RESET出现短暂低电平,芯片自动复位,之后电容充电,充电时间由电阻和电容共同决定:
- 手动复位:按键SW1按下时,RESET和地连通,产生低电平,实现复位。
4.调试和下载电路:
1.调试接口:
STM32F103系列微控制器内核集成了SWD/JTAG调试端口(缩写为SWJ-DP)。
SWJ-DP引脚名称 |
JTAG-DP |
SW-DP |
引脚号 |
JTMS/SWDIO |
输入:JTAG模式选择 |
输入输出:串行数据输入输出 |
PA13 |
JTCK/SWCLK |
输入:JTAG时钟 |
输入:串行时钟 |
PA14 |
JTDI |
输入:JTAG数据输入 |
PA15 |
|
JTDO/TRACESWO |
输出:JTAG数据输出 |
异步跟踪 |
PB3 |
JNTRST |
输入:JTAG模块复位 |
PB4 |
2.启动方式:
在STM32F103系列微控制器中通过设置BOOT[1:0]引脚电平的高低选择三种不同启动模式,从而将STM32F103微控制器的存储空间起始地址0x00000000映射到不同存储区域的起始地址。
启动模式选择引脚 |
启动模式对应的存储介质 |
说明 |
|
BOOT0 |
BOOT1 |
||
0 |
x |
闪存存储器,即用户闪存Flash |
闪存存储器被选为启动区域 |
1 |
0 |
系统存储器,即系统Flash |
系统存储器被选为启动区域 |
1 |
1 |
内置SRAM |
内置SRAM被选为启动区域 |
CM-3 内核在离开复位状态后的工作过程如下:
1.从地址 0x00000000 处取出栈指针 MSP 的初始值,该值就是栈顶的地址。
2.从地址 0x00000004 处取出程序指针 PC 的初始值,该值指向复位后应执行的第一条指令。
上述过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。
虽然内核是固定访问 0x00000000 和 0x00000004 地址的,但实际上这两个地址可以被重映射到其它地址空间。以 STM32F103 为例,根据芯片引出的 BOOT0 及 BOOT1 引脚的电平情况,这两个地址可以被映射到内部 FLASH、内部 SRAM以及系统存储器中。
BOOT1 |
BOOT2 |
映射到的存储器 |
0x00000000 |
0x00000004 |
地址映射到 | 地址映射到 | |||
x | 0 | 闪存存储器,即用户闪存Flash | 0x08000000 | 0x08000004 |
1 | 0 | 系统存储器,即系统Flash | 0x1FFFB000 | 0x1FFFB004 |
1 | 1 | 内置SRAM | 0x20000000 | 0x20000004 |
二、C语言基础知识
C语言的数据类型 |
STM32对应的数据类型 |
说明 |
unsigned char |
uint8_t |
8位无符号数据(0 ~ 255)字符型 |
unsigned short int |
uint16_t |
16位无符号数据(0 ~ 65535)短整型 |
unsigned int |
uint32_t |
32位无符号数据(0 ~ 232-1)长整型 |
unsigned long long |
uint64_t |
64位无符号数据(0 ~ 264-1)64位整型 |
signed char |
int8_t |
8位有符号数据(-128 ~ +127) |
signed short int |
int16_t |
16位有符号数据(-32768 ~ +32767) |
signed int |
int32_t |
32位有符号数据(-231 ~ 231-1) |
signed long long |
int64_t |
64位有符号数据(-263 ~ 263-1) |
1.const
- const用于定义只读的变量,其值在编译时不能被改变。
- 使用它是为了在编译时防止变量的值被误修改,提高程序的安全性和可靠性。
- 在C99标准中,const定义的变量是全局的。
- const关键词修饰的变量在声明时必须初始化。
const uinit8_t sum = 3.14;
uint8_t abs=0;
...
sum=abs;//非法,sum只能被读取不能被赋值。
abs=sum;
2.static
- 修饰变量或函数。修饰后的变量称为静态变量。
- 在全局变量之前加上关键字static,则该全局变量被定义成为一个静态全局变量。
- 作用范围只在定义该变量的源文件内有效,其他源文件不能引用该全局变量,避免了在其他源文件中因引用相同名字的变量而引发错误,有利于模块化程序设计。
1.static定义函数
模块化的程序设计中,用static声明一个函数,则该函数只能被该模块内的其它函数调用。
#include "stm32f1xx_hal.h"
static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
… …
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
{HAL_StatusTypeDef status = HAL_OK;
… …if(HAL_DMA_STATE_READY == hdma->State){
DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);
… …}
… …
}
DMA_SetConfig()函数是本地函数,只能被stm32f1xx_hal_dma.c的其它函数调用,不能被其它模块的文件使用。
2.static定义局部变量
static除了用于静态全局变量,还用于定义静态局部变量,保证静态局部变量在调用过程中不被重新初始化。
void fun_count( )
{static count_num = 0;// 声明一个静态局部变量,count_num用作计数器,初值为0。count_num ++;printf("%d\n", count_num);
}
int main(void)
{int i=0;for (i = 0;i <= 5;i++){fun_count( );}return 0;
}
在main函数中每调用一次fun_count( )函数,则静态局部变量count_num加1,而不是每次都被初始化为初值0。不加static的结果是1,加static的结果是5。
3.volatile
- 使用volatile关键字定义了一个字符型的变量i,指出i是随时可能发生变化的,每次使用的时候都必须从i的地址中读取。
- 使用volatile就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存中读取或者修改,而不是使用保存在寄存器里的备份。
其可用于以下场合:
- 中断服务程序中修改的供其他程序检测的变量需要使用volatile。
- 多任务环境下各任务间共享的标志应添加volatile。
- 存储器映射的硬件寄存器通常也要加volatile进行说明。
4.extern
指明此函数或变量的定义在别的文件中,提示编译器遇到此函数或变量时去其他模块中寻找其定义。
有一种特殊用法:extern "C"进行链接指定,告知编译器这是采用C语言定义的函数。
#ifdef __cplusplus
extern "C"{
#endif
……
#ifdef __cplusplus
}
#endif
如果定义了__cplusplus(C++编译器中自定义的宏),则执行extern“C”{语句}。在C++环境下使用C函数会出现链接时找不到对应函数的情况,这时需要使用extern “C”进行链接指定,告知编译器使用C语言的命名规则来处理函数。
5.回调函数:
操作系统中的某些函数常需要调用用户定义的函数来实现其功能,由于与常用的用户程序调用系统函数的调用方向相反,因此将这种调用称为“回调”(Callback),而被系统函数调用的函数称为“回调函数”。简单来说就是在一个函数中调用另一个函数。
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);HAL_GPIO_EXTI_Callback(GPIO_Pin);}
}__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{UNUSED(GPIO_Pin);
}
以上代码就是在GPIO中断处理函数中调用HAL_GPIO_EXTI_Callback函数。一般用于通过中断处理函数调用回调函数来实现中断服务功能。
三、HAL库的内存空间
1.内存空间的定义
#ifndef __STM32F1XX_H
#define __STM32F1XX_H#ifdef __cplusplus
extern "C" {#if !defined (STM32F1)
#define STM32F1
#endif /* STM32F1 */
如果没定义STM32F1,则定义STM32F1。
STM32使用的相关知识点相关推荐
- 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
来源:轨道机动算法的C++实现_shirro123的专栏-CSDN博客 卫星轨道推演计算相关基础知识点总结 一.卫星的运动特性 二.卫星的空间坐标系 ...
- 水下机器人_相关知识点
485转232 SP3485的管脚及功能: Pin1.RO 接收器输出 Pin2.RE 接收器输出使能(低电平有效) Pin3.DE 驱动器输出使能(高电平有效) Pin4.DI 驱动器输入 P ...
- js 闭包及其相关知识点理解
本文结合个人学习及实践,对闭包及相关知识点进行总结记录,欢迎读者提出任何不足之处 一.js变量 二.作用域(scope) 三.[[scope]] 和 scope chain 四.作用域(scope)和 ...
- Redis:相关知识点纵观
这篇文章先简单的介绍一下redis有什么相关知识点,然后再从接下去的一些文章对一些重要的知识点进行总结. 一.Redis 是什么 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存 ...
- 网络流量队列优先级相关知识点
网络流量队列优先级相关知识点 Qdisc(quick disconnect)快速分离,断开;是一种排队规则,实现对流量的优先级管理. 涉及随机公平队列,令牌桶过滤器,分层令牌桶,FIFO, /* *C ...
- Linux安装和管理程序的相关知识点
Linux安装和管理程序的相关知识点 一.Linux应用程序基础 1.应用程序与系统命令的关系 2.典型的应用程序结构 3.常见软件包封装类型 二.RPM软件包管理工具 1.RPM包管理工具 2.RP ...
- rem和css3的相关知识点
☆☆☆rem和css3的相关知识点☆☆☆ 一. Web front-end development engineer rem是根据页面的根元素的font-size的一个相对的单位,即 html{ fo ...
- 一次kafka的offset回退事件及相关知识点
一次kafka的offset回退事件及相关知识点 原文链接:https://blog.csdn.net/lkforce/article/details/83384747
- CSS相关知识点:6种清除浮动和BFC
文章目录 CSS相关知识点:6种清除浮动和BFC 一.6种清除浮动 1.场景 2.原因 3.清除浮动 (1).给父级设置对应的高度 (2).给父级增加定位absolute (3).将父级也设计成浮动 ...
最新文章
- arm板telnetd为什么运行不了_Win10 ARM 迎来原生 PS,微软玩 ARM 能赢过苹果吗
- java什么时候新建进程_创建名为“ {java}”的线程(即轻量级进程)是为了什么?...
- 一句话讲清楚IOC容器以及什么时候使用@Autowired
- 怎么把页面按比例缩小_做PPT多图排版千万别套模板了,按这28种版式来,绝对靠谱!...
- Java Socket笔记-udpSocket简单收发包
- 为什么 窗口回调函数要使用静态成员函数
- 【FPGA+BP神经网络】基于FPGA的简易BP神经网络verilog设计
- java删除文件夹部分内容_java 删除文件夹中的所有内容而不删除文件夹本身
- [原创]K8_Delphi源码免杀系列教程
- 蒙提霍尔问题(三门问题)的思考与贝叶斯分析
- matlab如何选局部最大值,如何在MATLAB中的图像中找到局部最大值?
- mac系统安装搭载Windows系统虚拟机方法教程
- opencv 物体尺寸测量
- Python 错误 RuntimeError: CUDA error (10): invalid device ordinal
- 服务器dns劫持修复,电脑DNS被劫持怎么修复 电脑dns被劫持解决方法
- JS day_08(5.17)String 、 Math
- javascript案例16——判断输入的年份是否是闰年、判断闰年
- uniapp:使用百度API提取身份证信息(微信小程序适用)
- 2021.07.07 宇信科技
- 什么是软文, 软文怎么写
热门文章
- Vue教程-day05-2018年12月25日笔记
- ViewFlipper-仿淘宝垂直广告滚动
- 青青子佩(朋友写给我的)
- Warning: mysqli::mysqli(): (HY000/2002): No connection could be made because the target machine acti
- 在html中如何使div在页面中居中显示
- python做相册_动感网页相册 python编写简单文件夹内图片浏览工具
- 怎样调整计算机视角,电脑调节不了CAD极轴角度怎样解决|电脑中调节CAD极轴角度的方法...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):的三种解决方式
- linux下要熟练掌握的常用快捷键和命令
- 华为HCIE 数通认证 基础必学GVRP协议是什么