STM32学习第二课:STM32c语言基础2

发布者:幸福之舞最新更新时间:2022-07-01 来源: csdn关键字:STM32  c语言  基础 手机看文章 扫描二维码
随时随地手机看文章

1.Typedef

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


如:typedef struct


{

u16 seq_num;

u16 len;

u8 dev_id[GPRS_PRO_DEVICE_ID];

u16 command_id;

u8 *pro_data;

}gprs_pro_cmd_t;


然后我们就可以直接使用gprs_pro_cmd_t定义一个结构体变量。


2.结构体

① 一般形式:Struct 结构体名 { 成员列表; }变量名列表;

② 这样是声明后直接定义,也可以先声明,后定义;

如:

Struct 结构体名字 { 成员列表; };

例如:struct U_TYPE usart1,usart2;

注意:结构体指针成员变量引用方法是通过“->”符号实现;

运用:在我们定义函数的形参时,形参数量较多的情况下,一旦修改就会很麻烦。因此将形参使用结构体进行统一定义,进行组合。


typedef struct{

uint32_t USART_BaudRate;

uint16_t USART_WordLength;

uint16_t USART_StopBits;

uint16_t USART_Parity;

uint16_t USART_Mode;

uint16_t USART_HardwareFlowControl;}USART_InitTypeDef;


于是,我们在初始化串口的时候入口参数就可以是USART_InitTypeDef类型的变量或者指针变量了,MDK中是这样做的:


void USART_Init(USART_TypeDef*USART_InitTypeDef*USART_InitStruct);


这样,任何时候,我们只需要修改结构体成员变量,往结构体中间加入新的成员变量,而不需要修改函数定义就可以达到修改入口参数同样的目的了。


3.宏定义


宏定义是一种预处理命令,便于代码可读性


在C语言的宏定义中,偶尔会碰到#和##符号的使用,如下


#ifndef MKSTR

#define MKSTR(x) #x

#endif

  

#define CAR_SECTION __attribute__((used,section("car")))

#define CAR(__name,__owner,__price)

    static car  car##__name CAR_SECTION = {

     .name= MKSTR(__name),

     .owner = MKSTR(__owner),

     .price = __price,

    }

 

#endif


1、#:表示将宏定义中的参数转换成字符串


例如上面的MKSTR(__name),展开后是#__name, 是将宏参数转换成字符串。这样就可以赋值给.name这个成员变量了。


2、##:表示连接,即将前后书写的字符连接起来。


例如上面的car##__name, 当宏参数宏参数__name为 Elec时,展开的该部分就是 carElec.


##就像个粘合剂,将前后两部分粘合起来。但是“##”不能随意粘合任意字符,必须是合法的C语言标示符。


4.条件编译


条件编译是一种宏定义,故有#,它的目的就是防止函数二次定义

最常用的方式就是

#ifndefine //如果未定义此函数

#define //则定义它

续行符

语法:“”

表示续行符的下一行与续行符所在的代码是连接起来

应用续行符的时候要注意,在“”后面不能有任何字符(包括注释、空格),只能直接回车


实际应用场景:


1、固件库里面有一个很重要的头文件,叫stm32f10x.h,这个头文件实现了外设寄存器的映射,相当于51单片机中的reg51.h


2、这个头文件会被很多文件包含调用,那就意味着stm32f10x.h的头文件会被多次包含,文件里面的那些寄存器结构体声明就会出现重复声明的错误


3、那为了防止头文件被重复包含时出现函数或者变量重复定义的情况,我们可以通过条件编译来解决


#ifndef  __STM32F10X_H


#define __STM32F10X_H


// stm32f10x.h 头文件的真正内容


#endif   /* __STM32F10X_H */


比如,stm32f10x.h被stm32f10x_gpio.h和stm32f10x_usart.h这两个固件库的头文件包含了,那么首次编译的时候就会判断是否定义了__STM32F10X_H,那第一次肯定是没有定义的,那紧接着就定义__STM32F10X_H,


当编译到第二个头文件也包含了stm32f10x.h时,因为__STM32F10X_H 已经被定义过,stm32f10x.h的内容就不会再编译一次。


因此,不管是固件库头文件还是我们自己用户编写头文件的时候,为了养成好的习惯,都必须在头文件上加上条件编译。

关键字:STM32  c语言  基础 引用地址:STM32学习第二课:STM32c语言基础2

上一篇:STM32学习第三课:STM32 c语言学习基础3(内存操作、指针、结构指针)
下一篇:STM32学习第一课:STM32 编程的C语言基础

推荐阅读最新更新时间:2024-11-05 23:06

STM32HAL库定时器中断关闭的方法
本文可以用于解决这个问题:定时器中断上电后莫名其妙开启,或者首先触发一次。 STM32HAL库在定时器初始化并开启以后,也是会默认开启中断。如不需要默认就开启中断可以用一下代码关闭: __HAL_TIM_CLEAR_FLAG(&htim6,TIM_FLAG_UPDATE); 其中htim6是定时器的句柄,按照实际使用的定时器填写; TIM_FLAG_UPDATE是中断的类型,也可以根据实际情况修改
[单片机]
STM32的JTAG和SWD模式的区别
JTAG(Joint Test Action Group,联合 测试 行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线:TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。相关JTAG引脚的定义为: TMS:模式选择,TMS用来设置JTAG接口处于某种特定的测试模式; TCK:时钟输入; TDI:数据输入,数据通过TDI引脚输入JTAG接口; TDO:数据输出,数据通过TDO引脚从JTAG接口输出; SWD接口 串行调试(Serial Wire Debug),应该
[单片机]
STM32单片机实现外部中断的步骤及方法
先从最简单的问题开始,用STM32外部中断的方法实现PB.0按键控制PA.0LED灯: 先总的说下实现中断的步骤: 1,配置NVIC寄存器(函数),设置中断为第几组,占先优先级和次优先级; 函数方法: void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreempTIonPriority=0; NVIC_Init
[单片机]
<font color='red'>STM32</font>单片机实现外部中断的步骤及方法
STM32入门学习笔记之PWM输出实验
9.1 PWM简介 脉冲宽度调制(Pulse Width Modulation)技术,简称PWM调制技术,是一种通过改变脉冲的宽度以及频率来改变输出频率的一种控制方式。采样控制理论中有一个重要结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。PWM控制技术就是以该结论为理论基础,对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。 STM32的定时器除了有计数,定时,输入捕获功能以外,还有PWM输出功能,主要工作原理就是通过在定时器内部设置阈值,当
[单片机]
<font color='red'>STM32</font>入门学习笔记之PWM输出实验
C 语言函数的调用
在一个程序的编写过程中,随着代码量的增加,如果把所有的语句都写到 main 函数中,一方面程序会显得的比较乱,另外一个方面,当同一个功能需要在不同地方执行时,我们就得再重复写一遍相同的语句。此时,如果把一些零碎的功能单独写成一个函数,在需要它们时只需进行一些简单的函数调用,这样既有助于程序结构的清晰条理,又可以避免大块的代码重复。 在实际工程项目中,一个程序通常都是由很多个子程序模块组成的,一个模块实现一个特定的功能,在 C 语言中,这个模块就用函数来表示。一个 C 程序一般由一个主函数和若干个其他函数构成。主函数可以调用其它函数,其它函数也可以相互调用,但其它函数不能调用主函数。在我们的51单片机程序中,还有中断服务函数,是当相
[单片机]
STM32影子寄存器的作用
这表示在物理上这个寄存器对应2个寄存器:一个是我们可以可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器. 数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。 原文如下: The auto-reload register is preloaded. Writing to or reading from the auto-reload register accesses the preload register. The conten
[单片机]
STM32STM32之LED
一、简介 本文介绍如何使用STM32控制LED,含亮、灭、定时亮、亮度取反四种模式。 本文IO口使用PB12。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板 仿真器:JLINK 三、版权声明 博主:甜甜的大香瓜 声明:喝水不忘挖井人,转载请注明出处。 原文地址:http://blog.csdn.NET/feilusia 联系方式:897503845@qq.com 香瓜BLE之CC2541群:127442605 香瓜BLE之CC2640群:557278427 香瓜BLE之
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>之LED
一个女生用C语言写的爱情函数
一个女生用C语言写的爱情函数 result love(boy, girl)   {     if ( boy.有房() and boy.有车() )     {       boy.set(nothing);       return girl.嫁给(boy);     }     else if ( girl.愿意等() )     {       while( ! (boy.赚钱 > 100,000 and girl.感情 > 8 ) )       {         for ( day=1; day <=365; day++)         {           if
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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