STM32_C语言基础

文章介绍了stdint.h头文件在C99标准中的作用,详细讲解了位操作(与、或、异或、取反及位移),宏定义的使用,包括表达式宏和格式串宏,条件编译的作用,extern声明的功能,以及类型别名和结构体、指针在编程中的应用,特别是结构体在寄存器操作中的映射方式。
摘要由CSDN通过智能技术生成

系列文章目录

前言

一、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)能确保该逻辑只被执行一次,即与没有循环时一样。

使用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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值