stm32单片机入门c语言解析

发布时间:2024-08-21  

关于学习stm32单片机建议

推荐学习书籍:

《STM32F103xxx参考手册》不需要全部阅读——没有时间的。建议选读,但是前几章必读。存储器和总线架构、电源控制、备份寄存器、复位和时钟控制,通用和复用功能I/O,中断和时间等等前几章一定要花时间阅读。后面章节,讲述的是具体的功能模块设计。如果我们用到哪个模块,就可以去阅读哪个模块。

《STM32固件库使用手册》主要是为了简化编程


学习思路(仅供参考)

步骤一,安装完STM32学习的软件,比如J-Link、Keil for ARM(MDK)、ISP(如果需要从串口下载的话)。

步骤二,挑选部分例程的HEX,比如LED灯的例程HEX文件,下载到芯达STM32开发板中,观察两个LED灯的闪烁情况。

步骤三,准备几个常用的文档,比如《STM32的用户手册》,《STM32固件库使用手册》等文档,用于平时查阅。

步骤四,开始查看例程的编写,看看例程是如何写的,自己可否修改下例程,达到自己想要的效果呢?芯达STM32开发板的光盘中为大家提供

了丰富的例程代码,可以参考。您一定可以修改出更精彩的例程!

步骤五,Ucos-II的移植,是否需要试一下?

恭喜你,至此,你已经可以自如进行独立的开发了。最后一步,给自己一个目标(项目),把它实现出来!


后续的每个模块的编程,请参考神舟I号(103RBT),神舟II号(103vct),神舟III号(103zet),神舟IV号(103vct)中任何一款的入门手册,官方网址armjishu.com上有下载的,大家可以参考参考。

第1步:熟悉调试软件

对初学者来说,我们至少需要安装两个软件:J-Link驱动软件、MDK(就是原来的Keil)软件。这两个软件在安装软件的过程可以查

看神舟开发板用户手册,这里不再重复,大家可以参考我们推出的教程《如何安装J-Link驱动软件》以及《如何安装MDK(Keil)软件》。如何

验证自己已经熟悉调试软件的操作了呢?很简单,神舟STM32开发板光盘里附带了很多HEX格式的文件,可以选择一些HEX文件,来观察运行结

果。比如LED灯的例程HEX文件,下载到神舟STM32开发板中,观察两个LED灯的闪烁情况。灯在闪烁,就说明你刚才的操作已经把HEX文件烧写

到闪存中了。

该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。

第2步:GPIO编程

这是第一次接触固件库的编程,一定要硬着头皮去了解固件库。建议大家尽量去用固件库。而不是避开固件库自己写代码—

—这样只能在学习中才会发生。实际的项目中,代码成百上千个,如何一个一个自己写?调用固件库中的函数来完成,才是王者之道。


GPIO本身的编程实际上很简单:

1、设置GPIO口的引脚为输入或者输出模式。我们在进行点灯代码的时候,一般设置为推挽输出模式。

2、操作寄存器,往寄存器里置1或者清零操作——这个步骤,固件库已经提供了专门的GPIO_SetBits函数和GPIO_ResetBits函数,我们只要去

调用即可实现对IO口的置1和清零。

3、实现多种花样的LED闪动,使得自己熟悉GPIO的编程过程。

该步骤要达到的目标:熟悉调试软件,如烧写HEX出现问题,可简单判别问题所在,并独立解决。

第3步:开始全新的STM32深入研究

经过以上调试软件的熟悉和GPIO口的编程调试后,相信您已经对STM32有一定的了解。至少知道如何利用STM32的固件库去写一

个代码。OK,下面我们将开始全新的STM32深入研究。在这个阶段,将要接触到串口编程、TFT液晶屏驱动编程、定时器编程、串行外设接口

SPI编程、存储器编程、SD卡与文件系统移植、USB读写、UCOS移植等,有精力还可以研究其他外设。

 

为什么使用STM32而不是8051? 是因为51的频率太低,无法满足计算需求?是51的管脚太少,无法满足众多外设的IO? 是51的功耗太大,电池挺不住?是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的内存太小而你要存储的东西太多?


当你需要使用STM32某些功能,而51实现不了的时候, 那STM32自然不需要学习,你会直接去寻找STM32某方面的使用方法。比如要用spi协议的网卡、要使用串口通信、要使用rtos等等。。。

C程序的结构特点和书写格式

1、函数是组成C程序的基本结构

2、一个函数有由个部分组成:

函数说明部分 函数体

函数体:{[说明部分]

执行部分}

3、一个程序总是从main函数开始执行

4、语句以分号“;”结束

5、书写格式自由

6、用/*.。.*/做注释

C语言中的结构体

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。[1]

定义与声明

结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。[1]

struct tag

{

member-list

} variable-list ;

在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。以下为示例:

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

//同时又声明了结构体变量s1

//这个结构体并没有标明其标签

struct

{

int a;

char b;

double c;

} s1;

//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

//结构体的标签被命名为SIMPLE,没有声明变量

struct SIMPLE

{

int a;

char b;

double c;

};

//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3

struct SIMPLE t1, t2[20], *t3;

//也可以用typedef创建新类型

typedef struct

{

int a;

char b;

double c;

} Simple2;

//现在可以用Simple2作为类型声明新的结构体变量

Simple2 u1, u2[20], *u3;

在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令t3=&s1,则是非法的。[1]

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。[1]

//此结构体的声明包含了其他的结构体

struct COMPLEX

{

char string[100];

struct SIMPLE a;

};

//此结构体的声明包含了指向自己类型的指针

struct NODE

{

char string[100];

struct NODE *next_node;

};

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明,如下所示:

struct B;

//对结构体B进行不完整声明

//结构体A中包含指向结构体B的指针

struct A{

struct B *partner;

//other members;

};

//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明

struct B{

struct A *partner;

//other members;};

结构体作用

结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。

在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。

结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

结构体的大小与内存对齐

结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

规则:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

2 C++中的结构体

在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private。

C++控制台输出例子:

#include《cstdlib》

#include《iostream》

//定义结构体

structpoint

{

//包含两个变量成员

intx;

inty;

};

usingnamespacestd;

int main(intargc,char*argv[])

{

pointpt;//加上struct的结构体变量定义是C语言的特征,而C++语言不需要这样

pt.x=1;

pt.y=2;

cout《《pt.x《《endl《《pt.y《《endl;

returnEXIT_SUCCESS;

}

C++中的结构体与类的区别

类与结构体在C++中有三点区别。[1]

(1)class中默认的成员访问权限是private的,而struct中则是public的。

(2)从class继承默认是private继承,而从struct继承默认是public继承。

(3)C++的结构体声明不必有struct关键字,而C语言的结构体声明必须带有关键字(使用typedef别名定义除外)。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    单片机编程怎么入门? 关于单片机编程怎么入门我历史文章里有写,每个环节学到什么程度,都写的很清楚,包含了全部教程和工具。 这里就只给大家大概介绍一下。 单片机编程入门有3个必备知识点: 1. 基础......
    51单片机编程入门用什么单片机比较好?;每个男人心中其实都有一个”钢铁侠”梦。 希望自己拥有像男主一样的技术,通过技术去改变世界。 不过想做到这一步,需要学的东西实在太多太多,可能......
    单片机编程入门基础知识(新手必看);单片机不是一门技术,而是一个工具。 对于工具,我们的目的是会熟练地使用它。 如果你看懂这句话,会少走很多弯路。 下面我来讲一下使用这个工具时,会涉......
    如何学习单片机单片机c语言编程入门教程;我当初是自学单片机的,也用同样的方法带出过月入15K以上的徒弟。 我的方法不能说是最好的,但绝对是靠谱的,毕竟都是曾经自己趟过的路。 如果......
    STM32 微控制器 GPIO 编程入门指南;在 STM32 微控制器中,GPIO (General Purpose Input/Output) 是非常重要的一部分,它可以用来控制外部设备如 LED......
    stm32单片机用什么语言 编程 stm32各种型号;  stm32单片机用什么语言编程   STM32单片机可以使用多种编程语言进行编程,包括C语言、汇编语言以及基于图形化编程的工具,如ST的......
    际工作中基本上用不到,目前绝大数的单片机编程用的都是C语言。 市面上绝大多数C语言教程都是针对纯软件方向,开发环境和开发模式会有差别。 针对单片机的C语言编程入门视频教程可以找无际单片机编程,学完可以无缝过度到单片机......
    一直没有用武之地。其实学习单片机很简单,第一步就是搞清楚编程环境。 入门单片机时,我们常用51型8051单片机STM32单片机。这两种单片机比较典型,因为学校里单片机课程是基于51单片机的,而......
    比较好,又有工作的需要,也可以从STM32入手。 掌握C语言编程技术 C语言是单片机程序开发的工具,不懂C语言,单片机编程开发就无从谈起,就像种地,要会用农具一样。C语言就是我们单片机开发的“农具”。 C语言......
    是这门技术是实战型技术,你花1个小时看书,还不如拿一些例程多去实践一下。 二、学什么单片机最好? 很多人刚开始是通过stm32入门的,我没试过零基础从stm32入门是什么体验。 但是......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>