stm32需要用到的c语言

stm32需要用到的c语言

1. ifdef条件编译

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

#ifdef 标识符
	程序段1
#else
    程序段2
#endif

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

2. extern变量声明

C语言中extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里面要注意,对于extern申明变量可以多次,但定义只有一次。在我们的代码中你会看到看到这样的语句:

extern u16 USART_RX_STA;

这个语句是申明USART_RX_STA变量在其他文件中已经定义了,在这里要使用到。所以,你肯定可以找到在某个地方有变量定义的语句:

u16 USART_RX_STA;

下面通过一个例子说明一下使用方法。
在Main.c定义的全局变量id,id的初始化都是在Main.c里面进行的。
Main.c文件

u8 id;//定义只允许一次

main()
{
    
    id=1;
    printf("d%",id);//id=1
    
    test();
    printf("d%",id);//id=2
    
}

但是我们希望在main.c的 changeId(void)函数中使用变量id,这个时候我们就需要在main.c里面去申明变量id是外部定义的了,因为如果不申明,变量id的作用域是到不了main.c文件中。看下面main.c中的代码:

extern u8 id;//申明变量id是在外部定义的,申明可以在很多个文件中进行
void test(void)
{
	id=2;
}

在main.c中申明变量id在外部定义,然后在main.c中就可以使用变量id了。

3.typedef类型别名

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

struct _GPIO
{
    __IO uint32_t MODER;
    __IO uint32_t OTYPER;
    ...
};
struct _GPIO GPIOA;//定义结构体变量GPIOA

但是这样很繁琐,MDK中有很多这样的结构体变量需要定义。这里可以为结体定义一个别名GPIO_TypeDef,这样就可以在其他地方通过别名GPIO_TypeDef来定义结构体变量了。方法如下:

typedef struct
{
    __IO uint32_t MODER;
    __IO uint32_t OTYPER;} GPIO_TypeDef;

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

GPIO_TypeDef _GPIOA,_GPIOB;

这里的GPIO_TypeDef就跟struct _GPIO是等同的作用了。

4.结构体

声明结构体类型:

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

例如:

Struct U_TYPE {
    Int BaudRate
    Int WordLength;
}usart1,usart2;

在结构体申明的时候可以定义变量,也可以申明之后定义,方法是:

Struct 结构体名字结构体变量列表;

例如:

struct U_TYPE usart1,usart2;

结构体成员变量的引用方法是:

结构体变量名字.成员名

比如要引用usart1的成员BaudRate,方法是:usart1.BaudRate;
结构体指针变量定义也是一样的,跟其他变量没有啥区别。
例如:struct U_TYPE *usart3;//定义结构体指针变量usart1;
结构体指针成员变量引用方法是通过“->”符号实现,比如要访问usart3结构体指针指向的结构体的成员变量BaudRate,方法是:

Usart3->BaudRate;

在我们单片机程序开发过程中,经常会遇到要初始化一个外设比如串口,它的初始化状态是由几个属性来决定的,比如串口号,波特率,极性,以及模式等。对于这种情况,在没有学习结构体的时候,我们一般的方法是:

void USART_Init(u8 usartx,u32 u32 BaudRate,u8 parity,u8 mode);

这种方式是有效的同时在一定场合是可取的。但是如果希望往这个函数里面再传入一个参数,那么势必需要修改这个函数的定义,重新加入字长这个入口参数。于是定义被修改为:

void USART_Init (u8 usartx,u32 BaudRate, u8 parity,u8 mode,u8 wordlength );

结构体就是将多个变量组合为一个有机的整体。上面的函数,BaudRate,wordlength,
Parity,mode,wordlength这些参数,他们对于串口而言,是一个有机整体,都是来设置串口参数的,所以可以将他们通过定义一个结构体来组合在一个。MDK中是这样定义的:

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* USARTx, USART_InitTypeDef* USART_InitStruct);

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鳌鳌鳌鳌拜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值