当前位置: 首页 > article >正文

STM32F1 - 标准外设库_规范

STM32F10x_StdPeriph_Lib_V3.6.0

  • 1> 头文件包含关系
  • 2> .c文件内部结构
  • 3> 宏定义位置
  • 4> 位掩码bit mask
  • 5> .c文件中定义私有变量
  • 6> 枚举类型定义


1> 头文件包含关系

3

1个头文件stm32f10x.h 就把整个MCU以及标准外设库,就管理了;


2> .c文件内部结构

/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c 
  * @author  MCD Application Team
  * @version V3.6.0
  * @date    20-September-2021
  * @brief   Main Interrupt Service Routines.
  *         
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */
【段】文件头注释


/* Includes -------------------------------*/
【段】包含头文件
/* Private typedef ------------------------*/
【段】内部类型重命名
/* Private define -------------------------*/
【段】内部宏定义
/* Private macro --------------------------*/
【段】内部预处理,宏函数
/* Private variables ----------------------*/
【段】内部变量定义
/* Private function prototypes ------------*/
【段】内部函数声明
/* Private functions ----------------------*/
【段】函数实现


3> 宏定义位置

有些宏定义在.c文件中,有些在 .h文件中,没规律吗?

例如:

// stm32f10xx_gpio.c:
#define MAPR_OFFSET   (AFIO_OFFSET + 0x04)
// stm32f10xx_gpio.h:
#define GPIO_Pin_0      ((uint16_t)0x0001)

如果宏定义只用在自己的.c文件中,定义到.c文件中,
如果要被其他文件用,就定义在.h文件中;


4> 位掩码bit mask

4

时钟控制寄存器RCC_CR的bit18【HSEBYP】

// 文件 stm32f10x_rcc.c
// 位掩码定义
#define CR_HSEBYP_Reset           ((uint32_t)0xFFFBFFFF) // bit18 == 0;
#define CR_HSEBYP_Set             ((uint32_t)0x00040000) // bit18 == 1;	

位掩码使用:

 /* Set HSEBYP */
 RCC->CR |= CR_HSEBYP_Set;
  
 /* Reset HSEBYP bit */
 RCC->CR &= CR_HSEBYP_Reset;

ST公司工程师为了不进行移位操作,定义好位掩码;
比如,

想要让CR寄存器的bit18等于1,就 |= 0x00040000;
想要让CR寄存器的bit18等于0,就&= FFFBFFFF;

往后,咱也用用这招;


5> .c文件中定义私有变量

文件 stm32f10x_rcc.c
/** @defgroup RCC_Private_Variables
  * @{
  */ 
static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};
static __I uint8_t ADCPrescTable[4] = {2, 4, 6, 8};

static原来这样使啊!Private /ˈpraɪvət/


6> 枚举类型定义

typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

ErrorStatus RCC_WaitForHSEStartUp(void)
{
  __IO uint32_t StartUpCounter = 0;
  ErrorStatus status = ERROR;
  FlagStatus HSEStatus = RESET;
  
  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC_GetFlagStatus(RCC_FLAG_HSERDY);
    StartUpCounter++;  
  } while((StartUpCounter != HSE_STARTUP_TIMEOUT) && (HSEStatus == RESET));
  
  if (RCC_GetFlagStatus(RCC_FLAG_HSERDY) != RESET)
  {
    status = SUCCESS;
  }
  else
  {
    status = ERROR;
  }  
  return (status);
}

枚举类型,就是给参数画个圈,固定几个数;
最大的好处就是,传递的参数明确,如果传错,编译时就会报错,
让你及时发现错误


http://www.kler.cn/a/233427.html

相关文章:

  • Elasticsearch可视化工具Elasticvue插件用法
  • 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程
  • Systemd: disable和mask的区别
  • 免费HTML模板和CSS样式网站汇总
  • 【AI换装整合包及教程】CatVTON与其他虚拟试衣技术的详细对比
  • 如何理解DDoS安全防护在企业安全防护中的作用
  • Python包管理:如何将本地目录变为可引用的模块
  • OLAP技术的发展及趋势简述
  • React18原理: 渲染与更新时的重点关注事项
  • Java基础常见面试题总结-并发(一)
  • 深入理解WebSocket协议:实现实时通信的利器
  • 【GO语言卵细胞级别教程】03.条件与循环语句
  • 【MySQL】数据库基础 -- 详解
  • vue-cli引入本地json数据:封装为js文件,无需请求直接读取
  • c++学习:命名空间
  • C++ 中的模型预测控制(01/2)
  • python 动态数据 展示 ,数据是由51单片机发送过来的,温度传感器。
  • 【QT+QGIS跨平台编译】之三十二:【MiniZip+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 【前后端接口AES+RSA混合加解密详解(vue+SpringBoot)附完整源码】
  • [软件工具]文档页数统计工具软件pdf统计页数word统计页数ppt统计页数图文打印店快速报价工具
  • K8S容器挂了后重启状态正常,但应用无法访问排查处理
  • TELNET 远程终端协议
  • “OLED屏幕,色彩绚丽,画面清晰,让每一帧都生动无比。“#IIC协议【上】
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件
  • CentOS 7安装Nodejs
  • 微信小程序上传代码教程