STM32基础知识入门

我用的是正点原子系列的,此文章仅作个人笔记使用。

接电源和下载器给他供电,下载器往图上那个JTAG/SWD口插,对应引脚在板子背面,一般的程序的话,一个接下载器通电,一个接USBSLAVE,这俩口一起用就可以使用了,有的像是显示屏还需外加电源,这个到时候自己看具体怎么整吧

C 语言基础复习

位操作

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

        先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作

GPIOA->CRL&=0XFFFFFF0F; //将第 4-7 位清 0 然后再与需要设置的值进行|或运算

GPIOA->CRL|=0X00000040; //设置相应位的值,不改变其他位的值

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

GPIOA->ODR|=1<<5; //PA.5 输出高,不改变其他位 这样我们一目了然,5 告诉我们是第 5 位也就是第 6 个端口,1 告诉我们是设置为 1 了

3.~取反操作使用技巧

SR 寄存器的每一位都代表一个状态,某个时刻我们希望去设置某一位的值为 0,同时 其他位都保留为 1,简单的作法是直接给寄存器设置一个值: TIMx->SR=0xFFF7; 这样的作法设置第 3 位为 0,但是这样的作法同样不好看,并且可读性很差。看看库函数 代码中怎样使用的:

TIMx->SR = (uint16_t)~TIM_FLAG; 而 TIM_FLAG 是通过宏定义定义的值:

#define TIM_FLAG_Update ((uint16_t)0x0001)

#define TIM_FLAG_CC1 ((uint16_t)0x0002) 看这个应该很容易明白,可以直接从宏定义中看出 TIM_FLAG_Update 就是设置的第 0 位了

define 宏定义

define 是 C 语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供 方便。常见的格式: #define 标识符 字符串 “标识符”为所定义的宏名。

“字符串”可以是常数、表达式、格式串等。

例如: #define SYSCLK_FREQ_72MHz 72000000 定义标识符 SYSCLK_FREQ_72MHz 的值为 72000000。

ifdef 条件编译

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

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

#ifdef 标识符 程序段 1

#else 程序段 2

#endif

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

#ifdef 程序段 1 #endif

extern 变量

 C 语言中 extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编 译器遇到此变量和函数时在其他模块中寻找其定义。这里面要注意,对于 extern 申明变量可以多 次,但定义只有一次。在我们的代码中你会看到看到这样的语句: extern u16 USART_RX_STA; 这个语句是申明 USART_RX_STA 变量在其他文件中已经定义了,在这里要使用到。所以,你肯定 可以找到在某个地方有变量定义的语句: u16 USART_RX_STA; 的出现。下面通过一个例子说明一下使用方法。

typedef

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

struct _GPIO { __IO uint32_t CRL; __IO uint32_t CRH; … }; 定义了一个结构体 GPIO,这样我们定义变量的方式为:

struct _GPIO GPIOA;//定义结构体变量 GPIOA 但是这样很繁琐,MDK 中有很多这样的结构体变量需要定义。

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

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

GPIO_TypeDef _GPIOA,_GPIOB

结构体

声明结构体类型:

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

例如: Struct U_TYPE { Int BaudRate Int WordLength; }usart1,usart2;

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

方法是: Struct 结构体名字 结构体变量列表

结构体成员变量的引用方法是: 结构体变量名字.成员名 比如要引用 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 )但是如果我们这个函数的入口参数是随着开发不断的增多,我们可以在不改变入口参数的情况下, 只需要改变结构体的成员变量,就可以达到上面改变入口参数的目的。

开发工具

(基本的编译一般都会,但是这个仿真的我不太会用)

在开始软件仿真之前,先检查一下配置是不是正确,在 IDE 里面点击 那个魔术棒的东西,确定 Target 内容如图 (主要检查芯片型号和晶振频率,其他的一般默认就可以):

确认了芯片以及外部晶振频率(8.0Mhz)之后,基本上就确定了 MDK5.14 软件仿真的硬 件环境了,接下来,我们再点击 Debug 选项卡,设置为如图 3.4.1.2 所示:

选择:Use Simulator,即使用软件仿真。选择:Run to main(),即跳过汇 编代码,直接跳转到 main 函数开始仿真。设置下方的:Dialog DLL 分别为:DARMSTM.DLL 和 TARMSTM.DLL,Parameter 均为:-pSTM32F103ZE,用于设置支持 STM32F103ZE 的软硬件仿真(即可以通过 Peripherals 选择对应外设的对话框观察仿真结果)。最后点击 OK,完成设置。 接下来,我们点击 (开始/停止仿真按钮),开始仿真,

可以发现,多出了一个工具条,这就是 Debug 工具条,这个工具条在我们仿真的时候是非 常有用的,下面简单介绍一下 Debug 工具条相关按钮的功能。

复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代 码会重新从头开始执行。

执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的, 而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查 看的地方设置了断点。

挂起:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来, 进入到单步调试状态。

执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同 于执行过去按钮的。

执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个 函数单步执行。

执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩 余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位 置。

执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功 能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。

汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。

观看变量/堆栈窗口:该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想 要看的变量值,也是很常用的一个调试窗口。

串口打印窗口:该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口 打印出来的内容。

内存查看窗口:该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存 地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口

性能分析窗口:按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用 来分析函数的性能是比较有用的。

逻辑分析窗口:按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口, 就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。 Debug 工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常 用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西, 来决定要不要看。 这样,我们在上面的仿真界面里面选内存查看窗口、串口打印窗口。然后调节一下这两个 窗口的位置,

我们把光标放到 main.c 的 12 行的空白处,然后双击鼠标左键,可以看到在 12 行的左边出 现了一个红框,即表示设置了一个断点(也可以通过鼠标右键弹出菜单来加入),再次双击则取 消)。 然后我们点击 ,执行到该断点处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值