系列文章目录
前言
一、stdint.h简介
stdint.h是从C99中引进的标准C库文件,路径在MDK安装文件夹中:C:\Keil_v5\ARM\ARMCC\include
定义了已有数据类型别名:
/* 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魔术棒中C/C++勾选C99Mode进行配置
二、位操作
按位与&
0&0=0;
0&1=0;
1&1=1
按位或|
0|0=0;
0|1=1;
1|1=1;
按位异或^
0^0=0
0^1=1
1^1=0
按位取反~
~11110000=00001111
左移右移
左移相当于*2^N
11100111<<2=11/10011100
右移相当于/2^N
11100111>>2=00111001
应用:
//清0:
value&=0xFFFE; //末位清零
value&=~(1<<5) //bit5清零
//置1
value|=0x0001; //末位置一
value|=1<<5; //bit5置一
value|=3<<5; //bit5、6置一
//位翻转
value^=1<<5 //bit5翻转
三、宏定义
宏定义的核心是替换
#define 标识符 字符串(标识符建议大写;字符串可以是数字,表达式,格式串等)
#define PI 3.14
//表达式宏定义
#define REG_START_ADDR 0x4000
#define MEM_MAX_ADDR (MEM_START_ADDR + 0x1000)
// 寄存器操作
#define WRITE_REG(RegAddr,Value) *(volatile Uint16 *)((Uint32) (REG_START_ADDR | ((Uint32)(RegAddr) & 0x1F))) = Value
#define READ_REG(RegAddr) *(volatile Uint16 *)((Uint32) (REG_START_ADDR | ((Uint32)(RegAddr) & 0x1F)))
//格式串宏定义
#define LED1(x) do{x?\
HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1GPIO_Pin,GPIO_Pin_SET):\
HAL_GPIO_WritePin(LED1_GPIO_PORT,LED1GPIO_Pin,GPIO_Pin_RESET);\
}while(0) //三目运算符
/*
建议复杂语句使用do{}while(0)来构造宏定义
do能确保大括号里的逻辑能被执行,而while(0)能确保该逻辑只被执行一次,即与没有循环时一样。
四、条件编译
让满足条件的编译,不满足条件的不编译。
用法1:防止头文件重复包含。
#ifndef _GPIO_H_
#define _GPIO_H_
//code
#endif
用法2:代码条件编译
#if ECANB
code
#endif
五、extern声明
放在函数或者变量之前,表示此函数在其他文件中以及定义,方便本函数引用。
extern uint16_t a;
extern f1();
六、类型别名
为已有的数据类型起别名
typedef 现有类型 新名字
//简单应用
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
//类型别名
1. 2.
struct GPIO_TypeDef typedef struct
{ {
Uint16 A; Uint16 A;
Uint8 B; Uint8 B;
}; }GPIO_TypeDef;
struct GPIO_TypeDef PAB; GPIO_TypeDef PAB;
七、结构体、指针
应用:寄存器赋值
补充:寄存器地址=总线基地址(BUS_BASE_ADDR)+外设偏移地址(PEHIPH_OFFSET)+寄存器偏移地址(REG_OFFSET)
//映射方式1
*(unsigned int *)(0x4001080c)=0xffff
#define GPIOA_ODR *(unsigned int *)(0x4001080c)
GPIOA_ODR=0XFFFF;
//映射方式2
#define GPIOA_BASE 0X40010800
typedef struct
{
uint32_t CRL;
uint32_t CRH;
uint32_t IDR;
uint32_t ODR;
uint32_t BSRR;
uint32_t BRR;
uint32_t LCKR;
}GPIO_TypeDef;
#define GPIOA ((GPIO_TypeDef*)(GPIOA_BASE))
//&GPIOA->CRL:0X40010800
GPIOA->ODR=0XFFFF;
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。