STM32中较为常见的C语言基础知识

发布者:760802csy最新更新时间:2023-10-20 来源: elecfans关键字:STM32  C语言  基础知识 手机看文章 扫描二维码
随时随地手机看文章

C语言是单片机开发中的必备基础知识,本文列举了部分 STM32 学习中比较常见的一些C语言基础知识。


1位操作


下面我们先讲解几种位操作符,然后讲解位操作使用技巧。C语言支持以下六种位操作:

fc50364a-a31d-11ed-92c9-dac502259ad0.png

下面,重点讲解一下位操作在单片机开发中的一些实用技巧。


在不改变其他位的值的状况下,对某几个位进行设值


这个场景在单片机开发中经常使用,方法就是我们先对需要设置的位用&操作符进行清零操作,然后用 | 操作符设值。


比如,我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作:


GPIOA->CRL&=0xFFFFFF0F;/*将第4~7位清零*/

然后再与需要设置的值进行 | 或运算:


GPIOA->CRL¥=0xFFFFFF0F;/*设置相应位的值(4),不改变其他位的值*/

移位操作提高代码的可读性


移位操作在单片机开发中非常重要,下面是delay_init函数的一行代码:


SysTick->CTRL|=1<<1;

这个操作就是将CTRL寄存器的第 1 位(从 0 开始算起)设置为 1,为什么要通过左移而不是直接设置一个固定的值呢?


其实这是为了提高代码的可读性以及可重用性。这行代码可以很直观明了的知道,是将第1位设置为1。如果写成:


SysTick->CTRL|=0X0002;

这个虽然也能实现同样的效果,但是可读性稍差,而且修改也比较麻烦。


~按位取反操作使用技巧


按位取反在设置寄存器的时候经常被使用,常用于清除某一个/某几个位。下面是delay_us函数的一行代码:


SysTick->CTRL&=~(1<<0);/*关闭SYSTICK*/

该代码可以解读为:仅设置CTRL寄存器的第 0 位(最低位)为 0,其他位的值保持不变。


同样我们也不使用按位取反,将代码写成:


SysTick->CTRL&=0XFFFFFFFE;/*关闭SYSTICK*/

可见,前者的可读性及可维护性都要比后者好很多。


^按位异或操作使用技巧


该功能非常适合用于控制某个位翻转,常见的应用场景就是控制 LED 闪烁,如下:


GPIOB->ODR^=1<<5;

执行一次该代码,就会使PB5的输出状态翻转一次,如果我们的 LED 接在 PB5 上,就可以看到 LED 闪烁了。


2define宏定义


define 是 C 语言中的预处理命令,它用于宏定义(定义的是常量),可以提高源代码的可读性,为编程提供方便。常见的格式:


#define标识符字符串

“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。例如:


#defineHSE_VALUE8000000U

定义标识符HSE_VALUE的值为 8000000,数字后的U表示unsigned的意思。至于define宏定义的其他一些知识,比如宏定义带参数,这里就不多讲解了。


3ifdef条件编译


单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。


条件编译命令最常见的形式为:


#ifdef标识符


程序段1


#else


程序段2#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。


其中#else部分也可以没有,即:


#ifdef


程序段1


#endif

条件编译在 HAL 库里面是用得很多,在stm32mp1xx_hal_conf.h这个头文件中经常会看到这样的语句:


#if!defined(HSE_VALUE)


#defineHSE_VALUE24000000U


#endif

如果没有定义HSE_VALUE这个宏,则定义HSE_VALUE宏,并且HSE_VALUE的值为 24000000U。条件编译也是 C 语言的基础知识吧。


这里提一下,24000000U 中的 U 表示无符号整型,常见的,UL 表示无符号长整型,F 表示浮点型。


这里加了 U 以后,系统编译时就不进行类型检查,直接以 U 的形式把值赋给某个对应的内存,如果超出定义变量的范围,则截取。


4extern变量声明


C语言中extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。


这里面要注意,对于extern申明变量可以多次,但定义只有一次。在我们的代码中你会看到看到这样的语句:


externuint16_tg_usart_rx_sta;

这个语句是声明g_usart_rx_sta变量在其他文件中已经定义了,在这里要使用到。


所以,你肯定可以找到在某个地方有变量定义的语句:


uint16_tg_usart_rx_sta;

extern的使用比较简单,但是也会经常用到,需要掌握。


5typedef类型别名


typedef用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。typedef在 HAL 库用得最多的就是定义结构体的类型别名和枚举类型了。


struct_GPIO

{

__IOuint32_tCRL;

__IOuint32_tCRH;

};

定义了一个结构体GPIO,这样我们定义结构体变量的方式为:


struct_GPIOgpiox;/*定义结构体变量gpiox*/

但这样很繁琐,HAL库中有很多这样的结构体变量需要定义。


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


typedefstruct

{

__IOuint32_tCRL;

__IOuint32_tCRH;

}GPIO_TypeDef;

Typedef为结构体定义一个别名GPIO_TypeDef,这样我们可以通过GPIO_TypeDef来定义结构体变量:


GPIO_TypeDefgpiox;

这里的GPIO_TypeDef就跟struct _GPIO是等同的作用了,但是GPIO_TypeDef使用起来方便很多。


审核编辑黄宇


关键字:STM32  C语言  基础知识 引用地址:STM32中较为常见的C语言基础知识

上一篇:stm32f103zet6如何识别flash大小
下一篇:STM32中较为常见的C语言基础知识

推荐阅读最新更新时间:2024-11-13 00:00

stm32教你如何编译出LIB文件
这个是生成LIB的技巧.也许大家在网上看到某些程序会发现,他们用这个方式来包含STM32 的库文件: 而不是像DX32的例程那样一堆C: 那么,本技巧篇例程就是教大家怎么生成那个.LIB 的文件的. 首先打开本程序,大家看到的整个工程就只有库文件: 因为这是把STM32的函数库编译成库的形式,所以你只需要包含函数库就行. 然后注意一点,stm32f10x_conf.h 文件中,所有的include都要开放 #include stm32f10x_adc.h #include stm32f10x_bkp.h #include stm32f10x_can.h #include stm32f10x_crc.h #i
[单片机]
<font color='red'>stm32</font>教你如何编译出LIB文件
STM32基于固件库学习笔记(3)串口的收发功能+WiFi基础配置
串口设置的一般步骤 1) 串口时钟使能,GPIO 时钟使能   注:串口是挂载在 APB2 下面的外设还需要需要挂载复用时钟使能 //挂载时钟(复用PA) 串口时钟使能,GPIO 时钟使能,复用时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); 2) 串口复位 //系统刚开始配置外设的时候,都会先执行复位该外设的操作。 void USART_DeInit(USART_TypeDef* USARTx);//串口复位 3) GPIO 端口模式设置  注意:RXT、TXT输
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(3)串口的收发功能+WiFi基础配置
STM32串口第一个字节丢失问题的分析过程
STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失。错误依旧。 故障排除过程: 1、刚开始怀疑是接收端的错误,我是使用电脑串口,运行串口辅助调试工具接收,换成其他软件后,发现故障依旧,而且电脑软件一直是开启状态,不像和电脑软件有关。 2、使用单步调试,单步运行各个发送指令,都正常。能收到0x01 0
[单片机]
STM32 的I2C 硬使用
/* 操作对象为一24C02 */ #include STM32Lib\\stm32f10x.h #include hal.h //#define AT24C01A //24C01A,I2C时序和往后的24C02一样 #define AT24C01 //24C01,I2C的时序和普通的有点不同 #define EEPROM_ADDR 0xA0 #define I2C_PAGESIZE 4 //24C01/01A页缓冲是4个 void I2C_Configuration(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStruct
[单片机]
<font color='red'>STM32</font> 的I2C 硬使用
stm32 GPIO简单介绍及初始化配置(库函数)
前言: 相信,大部分查找GPIO的人,都是刚刚接触STM32的人,而刚接触STM32的人,大部分是从51上来的人,所以我会由浅入深,从51和STM32的区别入手,通过对比这两个处理器的配置方法,来跟大家慢慢讲解(学知识可不能急于求成)。博主以stm32f1为主控芯片,以下均简称为stm32。 首先,上一张我的理解图(画不好。。。但能看),给个形象的概念 一、讲图之前,先给大家一个stm32的概念:“时钟概念” 1. STM32的时钟是什么? stm32的时钟是由内部或外部振荡器产生的“频率”,而被人们形象的称为“系统时钟”。最大为72MHz换成周期T为:1/72MHz≈13.9ns 2. 为什么要用时钟? 因为耗电量,s
[单片机]
基于STM32的无人售货机系统设计
一、项目背景 随着科技的发展和生活水平的提高,人们对于购物体验的要求越来越高。传统的商场、超市购物方式已经无法满足消费者的需求,因此无人售货机应运而生。本文针对现有售货机存在的缺陷,设计了一款基于STM32的无人售货机系统。该系统采用STM32作为主控芯片,使用液晶屏显示各种商品库存与售价,用户按下对应按键选择购买指定商品,在矩阵键盘输入账号密码付款。若付款成功,对应电机旋转一定角度使商品出库,同时修改库存;若余额不足,则进行声光提示。手机端还可查看消费流水、商品库存情况,并进行补货和充值操作。 二、系统设计 2.1 系统硬件设计 该系统的核心部件是STM32主控芯片,它负责整个售货机的控制和管理。液晶屏用于显示商品信息、价格
[单片机]
基于<font color='red'>STM32</font>的无人售货机系统设计
STM32 TIM触发ADC 定时采样-笔记
用TIM3的update触发adc,只需勾选Internal clock就可以了 ADC设置,关键是选TIM3 TRIGGER OUT TIM3 设置时间间隔然后关键选Update event 程序代码 记得开启TIM3 HAL_ADCEx_Calibration_Start(&hadc1); //STM32F1 HAL_TIM_Base_Start(&htim3); HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,1024); 然后重写callback 函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* h
[单片机]
<font color='red'>STM32</font> TIM触发ADC 定时采样-笔记
智能锁中用到的加解密以及STM32 Cryptolib
STM32加密库 STM32提供了加密库X-Crypto-lib对之前提到的三大类算法的支持,甚至包括一些近几年才出现的算法ChaCha20以及Poly。STM32加密库包括几乎所有的分组模式,例如ECB,CBC,GCM等等。 STM32加密库通过了美国密码算法认证体系认证,在实现上安全性得到了保证,也适合用在一些有认证需求的MCU产品上。 密码技术可以由软件实现,也可以由硬件加速。软件加密库可以运行在所有的STM32平台上。STM32特定型号有常用的算法加速,可以减轻内核负载,降低功耗。 除了STM32加密库,如果用户对认证等级要求不高,也可以采用一些第三方或者开源的加密实现。例如mbedTLS就包含了所有流行的加解
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved