【STM32项目】在FreeRtos背景下的实战项目的实现过程(三)

news2024/12/27 13:08:55

在这里插入图片描述
个人主页~

实战项目的实现过程(一)~

实战项目的实现过程(二)~


实战项目的实现过程

  • 五、读例程
    • 1、初始化函数
    • 2、while函数
    • 3、头文件
    • 4、源文件
  • 六、移植程序

五、读例程

将一些特定的模块调试好,就是那些使用别的软件(如汉字取模)或者硬件(USB转TTL)的,就打开资料包里面的例程读一读

像我们这种标准库开发是很有必要将代码读一读的,我们要懂得深层的道理,可能刚开始会有点生涩,但在打好C语言基础的情况下读这些代码虽然也不是很容易但是随着阅读代码量的增多以及遇到不会的知识在网络查找的增多,我们的知识涉及到的底层会越来越深

1、初始化函数

各个模块的初始化函数一般都是对GPIO进行初始化,设置GPIO的各种属性,比如下面这个OLED例程的OLED_Init函数

void OLED_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 	//使能A端口时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA0,1
 	GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA2
 	GPIO_SetBits(GPIOA,GPIO_Pin_2);
	
	OLED_RES_Clr();
	delay_ms(200);
	OLED_RES_Set();
	
	OLED_WR_Byte(0xAE,OLED_CMD);
	//--turn off oled panel
	OLED_WR_Byte(0x00,OLED_CMD);
	//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);
	//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);
	//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WR_Byte(0x81,OLED_CMD);
	//--set contrast control register
	OLED_WR_Byte(0xCF,OLED_CMD);
	// Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);
	//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_WR_Byte(0xC8,OLED_CMD);
	//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
	OLED_WR_Byte(0xA6,OLED_CMD);
	//--set normal display
	OLED_WR_Byte(0xA8,OLED_CMD);
	//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);
	//--1/64 duty
	OLED_WR_Byte(0xD3,OLED_CMD);
	//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);
	//-not offset
	OLED_WR_Byte(0xd5,OLED_CMD);
	//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);
	//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WR_Byte(0xD9,OLED_CMD);
	//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);
	//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WR_Byte(0xDA,OLED_CMD);
	//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	OLED_WR_Byte(0xDB,OLED_CMD);
	//--set vcomh
	OLED_WR_Byte(0x30,OLED_CMD);
	//Set VCOM Deselect Level
	OLED_WR_Byte(0x20,OLED_CMD);
	//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//
	OLED_WR_Byte(0x8D,OLED_CMD);
	//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);
	//--set(0x10) disable
	OLED_Clear();
	OLED_WR_Byte(0xAF,OLED_CMD);
}

稍微解析一下,因为这个函数里面有嵌套的函数还有一些define定义字没有在这里面出现

上方的部分就是GPIO的初始化,先定义一个结构体,然后使能A端的端口时钟,将要初始化的属性填入结构体中,然后用GPIO_Init函数初始化IO口,GPIO_SetBits函数将端口拉高至高电平

中间的三行代码表示将PA2拉低后200ms再拉高,起到一个软件控制的电平变化作用

下面的一大堆相似的代码OLED_WR_Byte就是往OLED的寄存器里面写数据,目的是启动OLED模块,可以跟着英文来看一下它们的功能,它的函数定义就是通过IIC协议发送数据,发送完这些数据后OLED初始化完毕,就可以正常使用了

2、while函数

一般在初始化完成后,裸机开发的例程紧跟着的就是while函数,在单片机系统中的循环一般是死循环while(1),然后在这里面进行一些指令和操作

先将while函数中的功能函数剖析清楚,一直跟到最后一层代码的前一层代码,一般来说,最后一层代码都是类似下图这种的,有英文的功能说明并且解释得很清晰的这种
在这里插入图片描述

while函数中的操作就是函数的主逻辑,一般来讲啊,例程里面就会将大部分的功能给写出来的,但是有部分的用得少的功能就可能没有,这样我们就在所包含的头文件中找到源文件,因为头文件和源文件都是一一对应的,都是头文件声明然后源文件定义,这些用到的头文件在main文件的最上方被包含

3、头文件

头文件最主要的就是两个方面,一个是#define宏定义,另一个就是函数的声明

#define在STM32中可以用来定义端口,定义值,以及定义命令,是很重要的一个关键字,学习过C语言的都知道,#define宏定义的最大的功能就是简洁的替换模式和提高代码复用性,可以在代码多次使用某一个值的情况下,改变该值但不用多次修改多处代码,可以将常用的代码片段封装起来,然后在需要的地方通过宏调用展开这些代码片段,从而避免重复编写相同的代码,提高代码可维护性

一般来说,这些函数的名称都是很标准的英文名称,不会出现什么汉字拼音之类的,并且这些名称一般都言简意赅地将它们的功能表达出来了,遇到不会的直接在网上翻译一下就可以,大概了解这一部分的大概功能以及用其他代码代替的define值,然后就可以追踪到源文件看定义了

4、源文件

在源文件中可以直观地观察函数的实现过程,一般我们大学生学就不要上来就自己写了吧,先把例程读懂,然后会开发就可以了,不说难度比较大,就这个底层的代码量你开发一个项目就要累死了,更别说还学别的了

在这里插入图片描述
这里给到了一个oled.c
厂家给的代码都会有注释的,各部分的功能很清楚,适当地往里跟一下,这里进来了I2C_Start这个函数,把这些代码看一下可以帮助我们更好地理解各个协议

在这里插入图片描述
比如说这里的I2C_Start,把SDA置高电平再把SCL置高电平,然后延时一下把SDA拉低电平,再延时一下把SCL拉低电平,这就跟我们之前博文中总结的IIC通信里的IIC时序基本单元里的起始条件相同:SCL高电平期间,SDA从高电平切换到低电平,然后SCL拉低等待发送数据
这样就可以在实践中掌握理论,对整个知识系统的完善有一个很好的辅助效果

六、移植程序

将每个裸机程序都调试好了,也正常运行了,这样就可以进行向Rtos的移植了,首先要确定好各个模块的某些功能的优先级,当然这个是可以组合着来的,在Rtos上的程序实现是很自由的,一般要将所有初始化模块放到main函数里面,然后开启任务,按照优先级先后来写到任务函数里面

但是要注意,移植过程不要所有模块直接给揉到一起,要一个一个的移植到Rtos中,再次进行调试,调试成功后再向里面加入其他模块,然后重复上述步骤


还想要深入开发一个更复杂的项目的话,深入地学习FreeRtos有很好地效果,前面我们也说过,FreeRtos是一个很自由的平台,我在项目中所使用到的也只是其中的一部分内容,包括内存管理、时间管理、消息队列等等一系列的知识在当中没有使用,但是对于复杂项目的开发是起到一个至关重要的作用的,所以扩充知识储备也是非常重要的


今日分享就到这里了~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2061795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Windows Server上安装typecho博客程序(基于IIS)

Typecho Typecho是由type和echo两个词合成的,来自于开发团队的头脑风暴。Typecho基于PHP5开发,支持多种数据库,是一款内核强健﹑扩展方便﹑体验友好﹑运行流畅的轻量级开源博客程序。 网上大多在Windows下安装Typecho的教程都是基于Apache服…

铁电随机存取存储器(FeRAM):前景黯淡,难以突破

铁电随机存取存储器(FeRAM)是一种快速、非易失性存储器,但它面临着与Optane相似的困境——目前的发展停滞不前。 ### 快速非易失性存储器技术 存在多种快速、非易失性存储器技术,理论上可以填补NAND和NOR与DRAM之间的存储层级空…

ArgoCD 启用Web终端,实现命令行进容器【详细步骤】

文章目录 Terminal 简介启用 Terminal第 1 步:启用 UI第 2 步:设置 Role 或 ClusterRole第 3 步:授权 API扩展知识 - ArgoCD RBACArgoCD 内置用户内置角色匿名/已认证用户 PolicyRBAC 模型结构应用相关 Policy项目级别配置页面配置ArgoCD CLI 配置扩展argocd-cm 示例argocd-…

Vue循环遍历:v-for 指令

1、v-for 指令 在程序设计中,循环控制是变化最丰富的技术。Vue.js 提供了列表渲染的功能,可将数组或对象中的数据循环渲染到 DOM 中。在 Vue.js 中,列表渲染使用的是 v-for 指令,其效果类似于 JavaScript 中的遍历。语法格式如下…

回归预测|基于Transformer-LSTM组合模型的数据回归预测Matlab程序 多特征输入单输出

**回归预测|基于Transformer-LSTM组合模型的数据回归预测Matlab程序 多特征输入单输出 ** 文章目录 前言回归预测|基于Transformer-LSTM组合模型的数据回归预测Matlab程序 多特征输入单输出 Transformer-LSTM 一、Transformer-LSTM模型Transformer-LSTM模型的原理1. Transforme…

Leetcode每日刷题之1658.将x减到0的最小操作数(C++)

1.题目解析 本题的要求是给出一个正整数数组与一个x,要求只从数组两端取数据后x减去取出的数据,求出将x减为0的最小操作数,即找出数组两端的数字保证其和为x并且要求取出的数字个数最少,如果没有符合要求的数字则返回-1 题目来源&…

C语言 | Leetcode C语言题解之第357题统计各位数字都不同的数字个数

题目&#xff1a; 题解&#xff1a; int countNumbersWithUniqueDigits(int n) {if (n 0) {return 1;}if (n 1) {return 10;}int ans 10, cur 9;for (int i 0; i < n - 1; i) {cur * 9 - i;ans cur;}return ans; }

腾讯无界微前端框架介绍

一、无界微前端框架概述 无界微前端框架是由腾讯团队推出的&#xff0c;旨在解决现有微前端方案中存在的问题&#xff0c;如适配成本高、样式隔离困难、运行性能不佳、页面白屏、子应用通信复杂、子应用保活机制缺乏等。 技术实现 无界微前端的核心技术是基于Web Component…

主题模式介绍

1.回顾&#xff1a; 1.在路由模式中&#xff0c;我改进了日志记录系统。我没有使用只能进行随意广播的 fanout 交换机&#xff0c;而是使用了 direct 交换机&#xff0c;从而有能实现有选择性地接收日志。2.尽管使用 direct 交换机改进了我们的系统&#xff0c;但是它仍然存在…

链表pat1032

pat1032 共享 我的思路是hash&#xff0c;然后双指针 上下每次各移动一个 一个不完善的代码&#xff0c;我开了一个10^6数组&#xff0c;devc艹觉得太大了&#xff0c;oj亦 #include<stdio.h> #include <string> const int N100005; int n,first,firstid; usin…

自定义修改tinymce工具栏已有图标,自定义tinymce工具栏图标

需求背景&#xff1a;更新tinymce已有图标能查到的资料比较少&#xff0c;结合官方文档以及其他博主的文章&#xff0c;实现并整理以下内容 修改inymce工具栏图标共有两种方法 第一种&#xff1a;快速使用官方自带DEMO内提供图标&#xff08;不实用&#xff09; 文档链接http…

OD C卷 - 路口最短时间问题

路口最短时间问题 &#xff08;200&#xff09; 街道是棋盘型的&#xff0c;&#xff08;十字路口&#xff09;每格距离相等&#xff0c;车辆通过每格的街道时间均为time_per_road&#xff1b;十字路口有交通灯&#xff0c;此处车辆可直行、左转、右转&#xff0c;直行和左转需…

桌球厅助教陪练系统源码开发和行业市场分析

台球助教陪练系统&#xff1a;引领智能化运动体验 作为一款专为台球爱好者设计的智能陪练系统&#xff0c;我们的目标是通过技术创新&#xff0c;让每位用户都能享受到个性化、高效的学习体验。无论是初学者还是寻求突破的高手&#xff0c;都能在我们的平台上找到适合自己的陪…

使用select

客户端 服务端 1 #include<myhead.h>2 3 #define SER_PORT 6666 //服务器端口4 #define SER_IP "127.0.0.1" //服务器ip5 6 7 int main(int argc, const char *argv[])8 {9 //创建套接字10 int sfdsocket(AF_INET,SOCK_STREAM,0);11 if(sfd-1)12 …

JavaScript(27)——本地存储、数组map和join

介绍 为了满足各种各样的需求&#xff0c;会经常性在本地存储大量的数据&#xff0c;HTML5规范提出了解决方案。 数据存储在用户浏览器中设置、读取方便、甚至页面刷新不丢失数据容量较大&#xff0c;sessionStorage和localStorage约5M左右 localStorage 作用&#xff1a;可…

面临新时代的机遇与挑战,联想凌拓将如何破局?

近年来&#xff0c;IT行业的技术进步日新月异&#xff0c;云计算、大数据、人工智能……各种新兴技术犹如雨后春笋般层出不穷&#xff0c;并且正在给千行百业带来全面的变革甚至重塑。 然而以上提到的所有新兴技术&#xff0c;都离不开数据的存储与管理。那么作为中国乃至全球领…

[CTF]-Reverse:纯逻辑分析题型综合解析

C语言&#xff1a; 字符串爆破&#xff1a; 例题&#xff08;BUUCTF SimpleRev&#xff09;&#xff1a; 查壳 看ida 这里的中心就是两个字符串和一个计算式子&#xff0c;textkillshadow和str2adsfkndcls&#xff0c;计算式子str2[v2] (v1 - 39 - key[v3 % v5] 97) % 26 …

FL Studio24.1.1中文汉化版本下载 附带注册机

嘿&#xff0c;各位音乐制作的小伙伴们&#x1f3a4;&#xff01;今天我要跟大家分享一个超级给力的音乐制作软件——FL Studio24.1.1中文版本。这款软件可是我们这些音乐爱好者的福音啊&#xff01;&#x1f389;&#x1f389;&#x1f389; 让我们来聊聊这款软件的特点吧&…

会声会影剪辑视频收费吗,会声会影最新破解版

会声会影2024&#xff1a;引领视频创作新时代的创新之旅** 在数字时代的浪潮中&#xff0c;视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步&#xff0c;一款名为“会声会影2024”的视频编辑软件横空出世&#xff0c;它不仅继承了前代产品的优秀传统&#xf…

Node-RED的安装

最近对Node-RED比较感兴趣&#xff0c;因为在上OpenHarmony课程的时候&#xff0c;一直想找一个可以通过MQTT控制设备的低代码客户端解决方案。第一次指导Node-RED是在试用聆思开发板的时候&#xff0c;它的云端就是使用的Node-RED。 在安装Node-RED之前&#xff0c;请确保您的…