STM32 第6讲 C语言基础知识复习

stdint.h简介

stdint.h是从C99引进的一个标准C库的文件。
需要重点掌握的定义类型别名如下

     /* exact-width signed integer types */
typedef   signed          char int8_t; 
typedef   signed short     int int16_t;
typedef   signed           int int32_t;
typedef   signed       __INT64 int64_t;

    /* exact-width unsigned integer types */
typedef unsigned          char uint8_t;
typedef unsigned short     int uint16_t;
typedef unsigned           int uint32_t;
typedef unsigned       __INT64 uint64_t;

同时需要在MDK中进行配置,在Options for Target选项卡中的C/C++中勾选C99 Mode
STM32 第6讲 C语言基础知识复习_第1张图片

位操作

STM32 第6讲 C语言基础知识复习_第2张图片
STM32 第6讲 C语言基础知识复习_第3张图片
右移时,如果是无符号型直接补零,有符号型根据原有符号补位,正数补0负数补1

假如给uint32_t temp = 0 寄存器的位6赋值为1,有以下几种方式。
STM32 第6讲 C语言基础知识复习_第4张图片

uint32_t temp = 0
/*方法一*/
temp &= 0xFFFFFFBF;
temp |= 0x00000040/*方法二*/
temp &= ~(1<<6);
temp |= 1<<6;
/*方法三*/
temp ^= 1<<6;

宏定义

可以提高代码效率、可读性、易改性

#define 标识符 字符串
/*无参宏定义*/
#define PI			3.1415926
#define HSV_VALUE 	8000000U
/*有参宏定义*/
#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语句定义宏定义避免大括号、分号、运算优先级等的影响。

条件编译

编译器只对满足条件的代码进行编译,不满足条件则不编译

#if		常量/常量表达式		/*编译预处理条件指令,类似if*/
#ifdef	宏名				/*判断某个宏是否已被定义*/
#ifndef	宏名				/*判断某个宏是否未被定义*/
#elif	常量/常量表达式		/*若前面的条件不满足,则判断新的条件,类似else*/
#else						/*若前面的条件不满足,则执行后面的语句,类似else*/
#endif						/*#if,#ifdef,#ifndef的结束标志*/

例如头文件中的条件编译,避免头文件重复引用,减少编译时间。

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

extern声明

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

extern uint16_t g_usart_rx_sta;		/*声明变量*/
extern void delay_us(uint32_t nus);	/*声明函数*/

类型别名(typedef)

为现有数据类型创建一个新的名字,用来简化变量定义

typedef 现有类型 新名字
---------------------------
type unsigned char		uint8_t;
/*类型别名的应用*/
Struct GPIO_TypeDef
{
	__IO uint32_t CRL;
	__IO uint32_t CRH;
	...
};
Struct GPIO_TypeDef gpiox

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

结构体

由若干基本数据类型集合组成一种自定义数据类型,也叫聚合类型

struct 结构体名
{
	成员列表;
} 变量名列表(可选);
------------------------
struct student
{
	char	*name;		/*姓名*/
	int		num;		/*学号*/
	int		age;		/*年龄*/
	char	group;		/*所在小组*/
	float	score;		/*成绩*/
}stu1,stu2;

指针

指针就是内存的地址
指针变量是保存了指针的变量

类型名 *指针变量名

char *p_str = "This is a test!";
/* *p_str: 取指针变量p_str变量的值 */
/* &p_str:  取p_str变量的地址 */
-------------------------------
uint_t buf[5]={1,3,5,7,9};
uint_8 *p_buf = buf;
/**
* *p_buf = 1
*  p_buf[0] = 1
*  p_buf[1] = 3
*  p_buf++;*p_buf = 3;p_buf[0] = 3;
**/

指针使用2大常见问题:

  1. 未分配内存就使用
  2. 越界使用

你可能感兴趣的:(单片机学习笔记,单片机,c语言,嵌入式硬件)