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

STM32 C语言基础知识

STM32 C语言基础知识

位操作

位操作运算符

运算符含义
&按位与
|按位或
^按位异或相同位为0 相异为0
~按位取反
<<左移二进制位左移n位
>>右移二进制位右移n位

单片机开发中的实用技巧

  1. 不改变其他位的情况下对某几个值进行设值
/* 首先进行清零操作 */
GPIOA->CRL & = 0XFFFFFFBF;              /* 将bit6清0 0xB = 0x1011 从右往左数第6位 */
/* 然后再与需要设置的值进行或运算 */
GPIOA->CRL | = 0xFFFFFF40;              /* 设置bit6的值为1 不改变其他位的值 */
  1. 移位操作提高代码的可读性
SyTick->CTRL |= 1 << 1;                 /* 将CTRL寄存器的第一位(从0开始算起)设置为1 */
  1. 按位取反操作使用技巧
/* 向左移动1位 取反 还是0 */
SysTick->CTRL & = ~(1 << 0);            /*仅将CTRL寄存器的第0位(最低位)设置为0 */
  1. 按位异或操作使用技巧
GPIPB->ODR ^= 1 << 5;                   /* 使PB5的状态翻转一次 */

define宏定义

defineC语言中的预处理命令,用于宏定义,可以提高源代码的可读性

#define         标识符          字符串
#define         HSE_VALUE       8000000U        /* U表示 unsigned */

ifdef条件编译

当满足某条件时对一组语句进行编译,当条件不满足时则编译另一组语句

/* 条件编译命令最常见的形式 */
#ifdef 标识符程序段1
#else程序段2
#endif

当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2,其中#else部分也可以没有

条件编译在MDK里面用的很多,例如在stm32f4xx.h头文件中经常会看到这样的语句:

#if !define(STM32F4)
#define STM32F4
#endif
/* 如果没有定义STM32F4宏 则需要先定义该宏 */

extern 外部声明

C语言中extern可以置于变量或函数前,以表示变量或函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义,注意,对于extern声明变量可以多次,但定义只有一次

该语句用于声明g_usart_rx_sta变量在其他文件中已经定义了,而且这里要用到

extern uint16_t g_usart_rx_sta;

可以找到在某个地方有变量定义的语句

typedef 类型别名

用于简化变量的定义

struct _GPIO
{__IOuint32_t CRL;__IOuint32_t CHR;...
};/* 定义结构体变量gpiox */struct _GPIO gpiox;

为结构体定义一个别名GPIO_TypeDef,这样就可以在其他地方通过别名GPIO_TypeDef来定义结构体变量了

typedef struct
{__IOuint32_t CRL;__IOuint32_t CHR;...
} GPIO_TypeDef;

typedef为结构体定义了一个别名GPIO_TypeDef,这样就可以通过GPIO_TypeDef来定义结构体变量

结构体

声明结构体类型

struct 结构体名
{成员列表;
} 变量名列表;

例如

struct U_TYPE
{int BaudRate;int WordLength;
} usart1, usart2;

结构体声明的时候可以定义变量,也可以声明之后定义

/* 方法 */
struct 结构体名字 结构体变量列表;
/* 例如 */
struct U_TYPE usart1, usart2;/* 结构体成员变量的引用 */
结构体变量名字.成员名
usart1.BaudRate

结构体指针变量的定义

/* 定义结构体指针变量 */
struct U_TYPE *usart3;/* 结构体指针成员变量引用通过 -> 符号实现 */usart->BuadRate;
typedef struct
{uint32_t    BaudRate;uint32_t    WordLength;uint32_t    StopBits;uint32_t    Parity;uint32_t    Mode;uint32_t    HwFlowCtl;uint32_t    OverSampling;
} UART_InitTypeDef;/* 在初始化串口的时候入口参数就可以是 USART_InitTypeDef类型的变量或指针变量了 */
void usart_init(UART_InitTypeDef *huart);

指针

指针是一个指向地址的变量(或常量),其本质是指向一个地址,从而可以访问一片内存区域

/* 声明指针时一般以p开头 */
char * p_str = "This is a test!";

http://www.mrgr.cn/news/57730.html

相关文章:

  • JavaWeb合集22-Apache POI
  • 某游戏的某促销活动,会向玩家推荐一个道具
  • 桂花网蓝牙网关X1000覆盖范围有多少?
  • Java笔试07
  • 1024程序员java纪念
  • 使用Selenium时,如何模拟正常用户行为?
  • 参加了十多个面试,一个offer也没拿到...为什么?
  • Base64编码
  • 真AI遇到招聘管理系统,帮助企业打造新质生产力
  • Vue3:横向滑动导航组件路由跳转保留滚动(条)量
  • HKC双模显示器评测报告 - HKC G27H7Pro
  • 1688API商品详情接口如何获取
  • 解锁PDF权限密码
  • 腾讯地图SDK 手势失效或冲突的解决办法
  • 没有基础,学习HCIE难吗?
  • 【多商户商城适用于哪些行业】
  • (北京餐饮满意度调查公司)餐饮企业顾客满意度调查,赢得口碑的关键
  • Selenium 流程自动化
  • 简单解析WebAPI与WebService的区别
  • 数据连接池的工作机制