【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。

这篇具有很好参考价值的文章主要介绍了【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.stdint.h简介(了解)

  stdint.h 是从 C99 中引进的一个标准 C 库的文件,可以在MDK5的安装路径:D:\MDK5.34\ARM\ARMCC\include中找到。
  stdint.h 定义了很多类型别名,将有符号的char类型定义别名为int8_t等,使用此套别名有易于移植。
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式
  在MDK中需要配置才能支持使用S99标准,默认是勾选的
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式

2.位操作(掌握)

stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式
  只要相与的两位,有一位是0结果则是0;只要相或的两位,有一位是1结果则是1;只要相异或的两位不同,一位是0一位是1结果则为1;按位取反,0变成1,1变成0;如果左移,右边补0;如果右移,需要分有无符号位,无符号左边直接补0,有符号的话最左边的是符号位,0为正数,1为负数,正数左侧空出的补0,负数左侧空出的补1。
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式

2.1给寄存器某个位赋值

举个例子:uint32_t temp = 0;
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式
  如果将位6赋值1,一种方法就是,先将位6与0相与(&)清0,其余位为1,再用或的方式,将位6置一;方法2是将位6与1左移6位取反的值相与进行清0,然后再与1左移六位进行或运算。按位异或可用于某个位的翻转,将位6与1异或,位6本身为1将变成0,本身为0则变成1。
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式

3.宏定义(掌握)

  宏定义可以:提高效率、可读性、易改性,核心是替换

#define   标识符   字符串

标识符:宏定义的名字,变量一般为小写,为了区分宏定义和变量,标识符中的英文字母建议大写,标识符是一个临时的符号,不占用内存,宏定义属于在预处理过程中需要处理的代码,。
字符串:常数、表达式、格式串等

举例】:

#define     PI           3.14159
#define     HSE_VALUE    8000000U 

3.1带参数的宏定义

  下面的do-while语句中用了一个三目运算符,x?A:B,如果x成立,即非0,则返回A,否则返回B。

#define LED1(x)   do{  x ? \
                      HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) : \
                      HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET); \
                  }while(0)

  建议大家使用 do{ … }while(0) 来 构造宏定义,这样不会受到大括号、分号、运算符优先级等的影响,总是会按你期望的方式调用运行!

4.条件编译(掌握)

  条件编译也属于程序预处理阶段处理的代码,让编译器只对满足条件的代码进行编译,不满足条件的不参与编译!

stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式
举例1】:头文件编译,可以避免头文件被重复引用。

#ifndef 	_LED_H
#define 	_LED_H
#include "./SYSTEM/sys/sys.h"
code
#endif

举例2】:代码条件编译

#if   SYS_SUPPORT_OS
       code
#endif

5.extern声明 (掌握)

  放在函数/变量前,表示此函数/变量在其他文件定义,以便本文件引用。
用法举例

extern uint16_t g_usart_rx_sta;
extern void delay_us(uint32_t nus); 

6.类型别名(typedef)(掌握)

  为现有数据类型创建一个新的名字,或称为类型别名,用来简化变量的定义。
格式】:

typedef   现有类型   新名字

举例】:

typedef   unsigned  char 			uint8_t;
typedef   unsigned  short  int 		uint16_t;
typedef   unsigned  int 			uint32_t;

  以后定义unsigned char数据类型,就可直接用uint8_t来定义数据类型。
类型别名应用】:

Struct GPIO_TypeDef
{
     __IO uint32_t   CRL;
     __IO uint32_t   CRH;};//定义结构体类型
Struct    GPIO_TypeDef    gpiox//定义结构体变量

  没有使用typedef定义结构体变量的格式:Struct+结构体名+变量名。使用typedef struct定义结构体类型,定义结构体变量时不用再写struct。

typedef struct
{
     __IO uint32_t   CRL;
     __IO uint32_t   CRH;} GPIO_TypeDef;
GPIO_TypeDef    gpiox

7.结构体(掌握)

  由若干基本数据类型集合组成的一种自定义数据类型,也叫聚合类型。
【格式】:

struct   结构体名
{
          成员列表;
} 变量名列表(可选)

应用举例1】:

struct student
{
    char  	*name;		/* 姓名 */
    int     num;  		/* 学号 */
    int     age; 		/* 年龄 */
    char	group;  	/* 所在学习小组 */
    float  	score;  	/* 成绩 */
}stu1, stu2;
void main()
{
struct student stu3,stu4;
stu3.name = "张三";
stu3.num = 1; 
stu3.age = 18; 
stu3.group = 'A';
stu3.score = 80.9;
}

应用举例2】:ST源码,使用类型别名(摘自:stm32f1xx_hal_gpio.h

typedef struct
{
  uint32_t 	Pin ;		/* 引脚号 */
  uint32_t 	Mode ;		/* 工作模式 */
  uint32_t 	Pull ;      /* 上下拉 */
  uint32_t 	Speed ;		/* IO速度 */
} GPIO_InitTypeDef;

8.指针(掌握)

  指针就是内存的地址,指针变量是保存了指针的变量。
格式】:

类型名  * 指针变量名

应用举例】:

char * p_str = “This is a test!; 
*p_str:取p_str 变量的值,也就是‘T’
&p_str:取p_str变量本身的地址,而不是‘T’的地址,指针变量的地址是处理器最大位数,比如说32位,和数据类型无关。

应用举例】:
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式

uint8_t  buf[5] = {1, 3, 5, 7, 9}; 
uint8_t  * p_buf = buf;//取数组名首地址0x0002
*p_buf取指针变量地址上的值,也就是1
p_buf[0]将指针变量当数组用下标是0值为1
p_buf[1]值为3
p_buf++;指向的地址0x0002地址加1,变成0x0003,不能buf[++]
*p_buf取指针变量地址上的值,也就是3
p_buf[0]值为3,指针指向的地址第一个元素

  指针使用的2大最常见问题:1,未分配(申请)内存就用;2,越界使用。下面的左图定义指针变量并没有赋初始值,初始值为随机数,指向了一个随机的地址,可能指向一个真实的内存,也可能指向一个不真实存在的内存,指向真实地址可能编译过程中不会报错,运行也不会有问题,也可能指向关键参数地址,重新赋值操作会造成程序运行结果不正常,指向不真实的地址,会报内存错误。右图为越界使用,越界也可能不会报错,可能导致内存冲突。
stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式

9.代码规范(熟悉)

  正点原子做了代码规范,可以在路径:A盘 ->1,入门资料 -> 《嵌入式单片机 C代码规范与风格.pdf》找到。
规范的关键点

  1. 所有函数/变量名字非特殊情况,一般使用小写字母;
  2. 注释风格使用 doxgen 风格,除屏蔽外,一律使用 /* */ 方式进行注释;
  3. TAB 键统一使用 4 个空格对齐,不使用默认的方式进行对齐;
  4. 每两个函数之间,一般有且只有一个空行;
  5. 相对独立的程序块之间,使用一个空行隔开;
  6. 全局变量命名一般用 g_开头,全局指针命名一般用 p_开头;
  7. if、 for、 while、 do、 case、 switch、 default 等语句单独占一行,一般无论有多少行执行语句,都要用加括号: {}。

10.总结(了解)

stdint.h,# STM32-HAL库,stm32,c语言,代码规范,单片机,嵌入式文章来源地址https://www.toymoban.com/news/detail-718423.html

到了这里,关于【05】STM32·HAL库开发-C语言基础知识 | stdint.h介绍 | 位操作 | 宏定义的使用 | 条件编译 | extern声明 | typdef使用 | 结构体、指针、代码规范介绍。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 基础知识(探索者开发板)--135讲 ADC转换

            ADC即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换 ADC采样电压范围0~3.3v 对应的数据是 0~4096 所以对ADC进行数值转电压可以通过公式 电压 = value*3.3/4096 1. HAL_ADC_Init 函数 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); 初始化ADC 形参:AD

    2024年02月20日
    浏览(43)
  • STM32-02-STM32基础知识

    STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片,而 Cortex M内核 使用的是 ARM v7-M架构 ,是为了替代老旧的单片机而量身定做的一个内核,具有低成本、低功耗、实时性好、中断响应快、处理效率高等特点。 架构 、 内核 、 芯片 的关系: 架构 : (ARMv7-M)

    2024年02月03日
    浏览(41)
  • 【STM32】基础知识 第二课 初识 STM32

    ARM 公司: 只做内核设计和 IP 授权, 不参与芯片设计. 对比项 Cortex-A (Application) Cortex-R (Real-time) Cortex-M (Microcontroller) 特点 高时钟频率, 长流水线, 高性能 较高时钟频率, 较长的流水线, 实时性强 时钟频率较低, 通常较短的流水线, 超低功耗 应用场景 移动计算, 智能手机, 平板电脑

    2024年02月02日
    浏览(44)
  • stm32中断的基础知识

    某些事件可能需要CPU暂停目前的程序优先处理 实现CPU暂停当前的程序并优先处理某一事件的机制称作中断 处理这一事件的程序叫做中断服务程序(Interrupt Handler) 中断的硬件实现 内部或外部信号产生中断 —程序跳转到某一特定地址(中断向量) —程序从中断向量跳转到对

    2023年04月24日
    浏览(54)
  • STM32 串口基础知识学习

    串行通信:数据逐位按顺序依次传输。 并行通信:数据各位通过多条线同时传输。 对比 传输速率:串行通信较低,并行通信较高。 抗干扰能力:串行通信较强,并行通信较弱。 通信距离:串行通信较长,并行通信较短。 IO资源占用:串行通信较少,并行通信较多。 成本:

    2024年02月15日
    浏览(49)
  • STM32 ADC基础知识讲解

    在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。 ADC 指的是模数转换器(Analog-to-Digital Converter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。 模拟信号是连续变化的信号,可

    2024年02月09日
    浏览(40)
  • 【STM32】基础知识 第十三课 中断

    今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断的基本概念, 配置和使用方法. 中断在嵌入式系统中扮演着重要角色, 使系统能够快速响应外部事件, 提高系统的实时性和效率. 中断 (Interrupt) 是单片机和其他嵌入式系统中的一种重要机制, 用于在发生特定

    2024年02月17日
    浏览(59)
  • 【STM32】基础知识 第六课 内核 & 架构

    4 个主动单元 + 4 个被动单元 主动单元 被动单元 Cortex M3 内核 DCode 总线 (D-Bus) 内部 FLASH Cortex M3 内核系统总线 (S-Bus) 内部 SRAM 通用 DMA1 FSMC 通用 DMA2 AHB 到 APB 的桥, 它连接的所有 APB 外设 AHB (Advance High-performance Bus): 高级高性能总线 APB (Advance Peripheral Bus): 高级外围总线 ICode 总线

    2023年04月24日
    浏览(67)
  • 【STM32】基础知识 第十课 CubeMx

    CubeMX (全称 STM32CubeMX) 是 ST 公司推出的一款用于 STM32 微控制器配置的图形化工具. 它能帮助开发者通过直观的图像界面快速完成 STM32 微控制器的硬件配置, 外设初始化以及中间件设置等工作. 通过 CubeMX, 开发者可以大幅提高开发效率, 降低开发难度, 尤其是对于刚接触 STM32 的新

    2024年02月05日
    浏览(52)
  • STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识

    0 引言 对于一个项目而言,往往将远程升级作为程序的最后一步(基本所有功能都开发完成之后再考虑)。但是在我看来,我们在写单片机的程序之前,就要规划好FLASH的使用情况,因为code、全局变量等重要信息都是放在FLASH(常说的闪存)中的,SRAM是程序运行时的存放位置

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包