以前跑跑马灯的时候已经生成了一次keil工程,只是单纯编译了下载,这次仔细看看工程里有什么。
顺便体验一下快捷的串口设置。
与之前类似,这次需要配置一下串口
模式就用异步,毕竟我们懒得提供额外的同步时钟。
波特率115200,字长8位。
ok,闲话不多说,打开keil!
认识keil工程
工程目录
在keil的project树中可以看到有四大目录
其中Application/MDK-ARM目录下的文件为启动文件(其在资源管理器的目录就是工程目录下的MDK-ARM),打开后可以发现全是晦涩的汇编代码。我们只需要知道它负责我们单片机的启动,进行堆栈指针、程序计数器指针、堆栈大小、异常向量表、C的分支入口等初始化的工作,有兴趣可以针对stm32启动文件深入了解。
Application/User/Core目录下的内容则是用户的源代码,是我们要操作的地方,其在资源管理器下的路径就是工程目录下的Core。
Driver路径下的HAL类似于标准外设库,是Hardware Abstraction Layer(硬件抽象层),不过比标准库的集成度还要再高一些。这是STMcube帮助我们生成的,目前来讲不要随便修改它
另外一股CMSIS则是CMSIS微控制器软件接口标准,我们也不会动它。
代码内容
我们现在应该主要研究的就是User/Core目录下的内容
首先是main.c
开头生成了一段简介,以及他们ST的版权声明
USER CODE BEGIN Header和USER CODE END Header
意味着我们可以把自己的说明插入到这一块。
在几个头文件引用之后,又出现了很多段的ben和end
理论上来讲,我们这些全局变量的定义啊,宏的定义啊什么的其实怎么来都行,你觉得舒服然后能跑起来不报错就没问题。但是对于工程产出而言,能够条理规范地写清楚代码也十分的重要,因此不妨按照人家的模板分门别类的把自己的代码安放到合适的地方。
接下来看Main函数,在无限while循环之前有几个初始化函数
此处的HAL_Init()对所有外设进行初始化,包括flash接口和systick
在进行系统时钟配置后开始初始化我们配置的外设
这里就和Cube工程里面的设置有关了,比如说我打开了GPIO和USART1,那么这里就会有对应的初始化函数。
串口程序
咱们来分析一下串口的相关代码
go to definition可以找到串口初始化代码的原型
其内容就是给一个叫huart1的结构体的成员进行赋值,从这些命名看大概就可以知道分别是实例、波特率、字长等等
在初始化赋值后查询一下初始化是否成功,失败就进入错误处理。
huart1是这样的一个结构体类型,也可以具体地查看结构体的定义。
好像没了,那要怎么实现串口的通信呢?
在中有一段IO 操作函数
注释里面已经大概告诉了我们不同的模式要使用什么样的api
阻塞模式
以阻塞模式为例,我们使用 HAL_UART_Transmit()发送消息
找到发送函数的定义
其输入参量需要*huart(这个已经定义好了,就是我们初始化时做的事情),然后是一个指向发送数据的uint8指针,以及数据的大小,最后是超时
我们先定义一个变量作为发送的消息
那么调用函数就应该把这几个参数传进去,注意需要取地址的地方
接受函数与之类似
我们可以稍微调整一下,把message改成数组,并且添加一个status标志位
在while循环中,我们查询status的状态,如果搞定了,就把消息transmit出去。
下载程序
然后把它丢到串口调试助手上,可以看到单片机能把我们发过去的内容发回来
但缺点有两个,一是我接收到的字符内容得把缓冲区填满了才会执行下一步操作
另一个就是由于是阻塞通信,在没有接受完所有消息时,它就会一直卡在串口接受的位置。
1.《如何初始化接口?总结很全面速看!STM32单片机从零开始使用教程(三) 阻塞模式串口的简单应用》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《如何初始化接口?总结很全面速看!STM32单片机从零开始使用教程(三) 阻塞模式串口的简单应用》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2252964.html