Update
chore: add 5 5.1 5.2 5.3
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
# 嵌入式是什么?可以吃吗?
|
||||
|
||||
> Author:肖扬
|
||||
> Author:肖扬
|
||||
|
||||
# 概念引入与讲解
|
||||
## 概念引入与讲解
|
||||
|
||||
刚开始接触嵌入式的人,往往会有这样的疑惑:嵌入式到底是什么?
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
还有一个我最近关注的一个博主,我喜欢其富有想法的创造力与强大的执行力。
|
||||
|
||||
# 想说的话
|
||||
## 想说的话
|
||||
|
||||
相信到这里,你对嵌入式或者嵌入式产品已经有了初步的认识。
|
||||
|
||||
|
||||
@@ -16,15 +16,15 @@ Intel 的 STC89C51\C52 系列早在上世纪 80 年代就已经广泛运用,
|
||||
|
||||
以下是比较推荐的学习路线:
|
||||
|
||||
1、购买 51 单片机:[https://m.tb.cn/h.UuGJR5G?tk=kN94dm040JX](https://m.tb.cn/h.UuGJR5G?tk=kN94dm040JX) CZ0001 「普中 51 单片机学习板开发板 stc89c52 单片机实验板 C51 单片机 diy 套件」
|
||||
1、购买 51 单片机:[CZ0001「普中 51 单片机学习板开发板 stc89c52 单片机实验板 C51 单片机 diy 套件」](https://m.tb.cn/h.UuGJR5G?tk=kN94dm040JX)
|
||||
|
||||
2、推荐学习视频:【51 单片机入门教程-2020 版 程序全程纯手打 从零开始入门】[https://b23.tv/KmaWgUK](https://b23.tv/KmaWgUK)
|
||||
2、推荐学习视频:[【51 单片机入门教程 -2020 版 程序全程纯手打 从零开始入门】](https://b23.tv/KmaWgUK)
|
||||
|
||||
3、相关学习资料:
|
||||
|
||||
软件安装包、开发板资料、课件及程序源码百度网盘链接:
|
||||
|
||||
[https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng](https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng) 提取码:gdzf,链接里压缩包的解压密码:51 ,如果打不开请复制链接到浏览器再打开
|
||||
[https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng](https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng) 提取码:gdzf,链接里压缩包的解压密码:51,如果打不开请复制链接到浏览器再打开
|
||||
|
||||
### 一些简单的任务
|
||||
|
||||
@@ -46,7 +46,7 @@ Intel 的 STC89C51\C52 系列早在上世纪 80 年代就已经广泛运用,
|
||||
|
||||
如果我们在图书馆上准备看书,去获取知识,此时我们是 CPU、书则是数据。
|
||||
|
||||
如果我们去图书馆里的书架上拿书并观看,则需要:走到对应书架-拿书(获取数据)-回到书桌,这需要花费相当一部分的时间,此时硬盘相当于书架;如果我们直接拿书桌上的书,则相对速度会快很多,此时书桌相当于主存;如果我们手上就有一本书,那么我们低头就可以看到,手就相当于寄存器。所以,寄存器是 CPU 内部用来存放数据的一些小型的存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行所需要的信息。
|
||||
如果我们去图书馆里的书架上拿书并观看,则需要:走到对应书架 - 拿书(获取数据)- 回到书桌,这需要花费相当一部分的时间,此时硬盘相当于书架;如果我们直接拿书桌上的书,则相对速度会快很多,此时书桌相当于主存;如果我们手上就有一本书,那么我们低头就可以看到,手就相当于寄存器。所以,寄存器是 CPU 内部用来存放数据的一些小型的存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行所需要的信息。
|
||||
|
||||
以我举例而言,<strong>可见寄存器获得数据的速度会快于主存与硬盘,而存储数据的大小将会小于主存与硬盘</strong>,如果这块不清楚的话也可以去看 也许你会用上的基础知识 中的存储器知识部分。
|
||||
|
||||
@@ -87,7 +87,7 @@ ORG 0BH
|
||||
|
||||

|
||||
|
||||
如果我们想做一个简单的实验-驱动一个 LED 灯(假设此 LED 灯以 PB5 为输出驱动口),在对相应的 RCC 时钟等配置之外,最重要的是对相应的 GPIO 口的配置,首先我们查阅其寄存器的物理起始地址:
|
||||
如果我们想做一个简单的实验 - 驱动一个 LED 灯(假设此 LED 灯以 PB5 为输出驱动口),在对相应的 RCC 时钟等配置之外,最重要的是对相应的 GPIO 口的配置,首先我们查阅其寄存器的物理起始地址:
|
||||
|
||||

|
||||
|
||||
@@ -99,19 +99,19 @@ ORG 0BH
|
||||
#define PERIPH_BASE ((uint32_t)0x40000000) //外设基址
|
||||
|
||||
#define APB1PERIPH_BASE PERIPH_BASE
|
||||
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) //APB2基址
|
||||
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) //APB2 基址
|
||||
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
|
||||
|
||||
#define AFIO_BASE (APB2PERIPH_BASE + 0x0000)
|
||||
#define EXTI_BASE (APB2PERIPH_BASE + 0x0400)
|
||||
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
|
||||
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)//GPIOB基址,计算可得0x40010C00
|
||||
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)//GPIOB 基址,计算可得 0x40010C00
|
||||
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
|
||||
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
|
||||
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
|
||||
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
|
||||
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
|
||||
//APB2还有相关定时器的基址,这里就不再展示
|
||||
//APB2 还有相关定时器的基址,这里就不再展示
|
||||
|
||||
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
|
||||
```
|
||||
@@ -121,11 +121,11 @@ ORG 0BH
|
||||
```c
|
||||
void LED_Init(void)
|
||||
{
|
||||
RCC->APB2ENR|=1<<3; //GPIOB的时钟使能,只有使能对应的时钟后GPIO才能正常工作
|
||||
RCC->APB2ENR|=1<<3; //GPIOB 的时钟使能,只有使能对应的时钟后 GPIO 才能正常工作
|
||||
|
||||
GPIOB->CRL&=0XFF0FFFFF; //由图可知,CRL的第20-23位控制5口,此举是对第20-23位清零
|
||||
GPIOB->CRL|=0X00300000; //此举是对第20-23位赋值0011,根据寄存器功能可知此代表50Mhz推挽输出
|
||||
GPIOB->ODR|=1<<5; //设置ODR第5位为1,输出高电平
|
||||
GPIOB->CRL&=0XFF0FFFFF; //由图可知,CRL 的第 20-23 位控制 5 口,此举是对第 20-23 位清零
|
||||
GPIOB->CRL|=0X00300000; //此举是对第 20-23 位赋值 0011,根据寄存器功能可知此代表 50Mhz 推挽输出
|
||||
GPIOB->ODR|=1<<5; //设置 ODR 第 5 位为 1,输出高电平
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
而在此栏目中,我们将讲述相关操作系统在嵌入式上的应用,让你的嵌入式产品更加的智慧!(当然裸机并不一定就比带操作系统的嵌入式产品差,只是应用方向不同或者说有时候需要考虑产品的成本问题)
|
||||
|
||||
Ps:本栏目只例举几个目前开发工程中常见的操作系统的学习与开发,<strong>具体的移植过程可 web 或者自行探索-相信我,出色的移植能力是嵌入式开发者必不可少的。</strong>
|
||||
Ps:本栏目只例举几个目前开发工程中常见的操作系统的学习与开发,<strong>具体的移植过程可 web 或者自行探索 - 相信我,出色的移植能力是嵌入式开发者必不可少的。</strong>
|
||||
|
||||
## RTOS
|
||||
|
||||
@@ -51,7 +51,6 @@ int main(){
|
||||
|
||||
1、b 站正点原子官方 FreeRTOS 教学(在今年有做全面的更新,比之前讲的更为清晰,难得的优秀入门视频)
|
||||
|
||||
|
||||
<Bilibili bvid='BV19g411p7UT'/>
|
||||
|
||||
2、FreeRTOS 官网(官网往往是最适合学习的地方)[www.freertos.org](http://www.freertos.org)
|
||||
@@ -74,13 +73,13 @@ int main(){
|
||||
|
||||
此时应用层则有个很重要的概念-Master(管理者),其负责管理整个系统的正常运行。如果我们需要获得比较成熟的相关领域开源机器人包,按以往的操作必将是进行一次比较复杂的移植(你需要考虑各种因素:比如硬件支持、与其他移植包是否冲突等等)。<strong>但是在 ROS 系统中引入了功能包的概念,你可以在 ROS 社区中下载相关版本(与你的 ROS 版本相匹配)的机器人应用功能包,完成一次非常简单的移植过程(CV),你不需要关注其内部的具体运行机制,只需关注接口的定义与使用规则便可进行相应的二次开发(在 ROS 中你需要关注的是相关节点之间的关系,可以通过 rqt_graph 获取清晰的节点图),相当于给你做好了一个跟机器人开发有关的高集成度</strong><strong>SDK</strong><strong>平台。</strong>(当然如果你感兴趣的话可以做一定的了解,但这将牵扯到相关内容的庞大体系,比如如果你想了解自主导航是如何运行的,你首先需要了解 SLAM 算法的运行机制以及激光雷达或者相关深度摄像机的运用,然后你需要了解什么是深度信息什么是里程计信息,为什么可以表示机器人的位置信息,要如何进行一些相关的位置信息修正,然后 bulabula。<strong>以笔者自身的学习经历而言,学习相关的理论基础体系,将对你的二次开发有极大的帮助,而不会造成盲目使用接口的情况</strong>)
|
||||
|
||||
根据以上我讲述的相关内容可知:<strong>ROS 系统的优点在于,你能将社区里的有关机器人的开发模块集大成于一身,并且通过 ROS 与控制板通讯(此时类似于 STM32 的裸机主控便变成了控制板-用于接收 ROS 的调控完成相应电机、舵机的控制,或者完成一定的例如 oled 显示的简单任务),从而完成 ROS 系统内部开源算法对整个机器人的控制。</strong>
|
||||
根据以上我讲述的相关内容可知:<strong>ROS 系统的优点在于,你能将社区里的有关机器人的开发模块集大成于一身,并且通过 ROS 与控制板通讯(此时类似于 STM32 的裸机主控便变成了控制板 - 用于接收 ROS 的调控完成相应电机、舵机的控制,或者完成一定的例如 oled 显示的简单任务),从而完成 ROS 系统内部开源算法对整个机器人的控制。</strong>
|
||||
|
||||
以下我简单介绍一下 ROS 的基础通讯方式:
|
||||
|
||||
在裸机开发中,我们的通讯(不论是蓝牙、WiFi 还是最基础的串口通讯)本质上都来自于串口中断,也就是说裸机开发引入了 ISR 来处理相应的数据接收。ROS 通讯中同样需要这样的函数来完成对目标数据的处理,而在 ROS 中我们称之为回调函数。
|
||||
|
||||
我们以话题通讯机制来做简要介绍,在此通讯中需要有两个节点,一个 Publisher(发布者)以及一个 Listener(订阅者),他们将发布和订阅同一个来完成相应的通讯-将发布和订阅的内容交给 ROS Master(整体流程类似于 WiFi 中的 mqtt 协议通信,将发布和订阅的内容交给公共服务器,形成一个转接的效果)。
|
||||
我们以话题通讯机制来做简要介绍,在此通讯中需要有两个节点,一个 Publisher(发布者)以及一个 Listener(订阅者),他们将发布和订阅同一个来完成相应的通讯 - 将发布和订阅的内容交给 ROS Master(整体流程类似于 WiFi 中的 mqtt 协议通信,将发布和订阅的内容交给公共服务器,形成一个转接的效果)。
|
||||
|
||||
所以通过这样的一个流程,具体的代码如下(以 C++ 为例):
|
||||
|
||||
@@ -92,14 +91,14 @@ int main(int argc, char **argv)
|
||||
ros::init(argc, argv, "talker");
|
||||
//其次,为了对这个类更好地进行处理,我们需要创建节点句柄
|
||||
ros::NodeHandle n;
|
||||
//创建一个Publisher=> pub,发布名为chat的topic,消息类型为std_msgs::String
|
||||
//创建一个 Publisher=> pub,发布名为 chat 的 topic,消息类型为 std_msgs::String
|
||||
ros::Publisher pub = n.advertise<std_msgs::String>("chat", 1000);
|
||||
//设置循环的频率,对应着sleep延时
|
||||
//设置循环的频率,对应着 sleep 延时
|
||||
ros::Rate loop_rate(10);
|
||||
|
||||
while (ros::ok())
|
||||
{
|
||||
// 初始化std_msgs::String类型的消息
|
||||
// 初始化 std_msgs::String 类型的消息
|
||||
std_msgs::String msg;
|
||||
|
||||
/*
|
||||
@@ -125,7 +124,7 @@ int main(int argc, char **argv)
|
||||
//节点与节点句柄是必不可缺的
|
||||
ros::init(argc, argv, "listener");
|
||||
ros::NodeHandle n;
|
||||
// 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatCallback
|
||||
// 创建一个 Subscriber,订阅名为 chatter 的 topic,注册回调函数 chatCallback
|
||||
ros::Subscriber sub = n.subscribe("chat", 1000, chatCallback);
|
||||
// 循环等待回调函数
|
||||
ros::spin();
|
||||
@@ -133,7 +132,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
```
|
||||
|
||||
而其中,在 Listener 中出现了回调函数,其功能类似于裸机中的中断控制-当接收到对应的订阅消息后,进行对应的数据、逻辑处理,例如如果我只是想把接收到的数据打印出来的话,我可以这么写回调函数 chatCallback:
|
||||
而其中,在 Listener 中出现了回调函数,其功能类似于裸机中的中断控制 - 当接收到对应的订阅消息后,进行对应的数据、逻辑处理,例如如果我只是想把接收到的数据打印出来的话,我可以这么写回调函数 chatCallback:
|
||||
|
||||
```cpp
|
||||
void chatterCallback(const std_msgs::String::ConstPtr& msg)
|
||||
@@ -148,7 +147,7 @@ void chatterCallback(const std_msgs::String::ConstPtr& msg)
|
||||
|
||||
<Bilibili bvid='BV1zt411G7Vn'/>
|
||||
|
||||
<strong>提一嘴:很多人学 ROS 就学一个开头-比如就学了古月居的 21 讲,就认为自己已经了解到了 ROS 的大部分内容了</strong><strong>(不会有人现在还是纯看视频学习吧)</strong><strong>,实际上这是非常错误的想法。当你学完了视频的内容后,你甚至可能不会移植 wiki 上的功能包(x_x),甚至不知道如何去开发一个真实的机器人(因为此 21 讲只是理论上的讲解,去做一个虚拟机器人在 gazebo 上运行)。ROS 的学习上需要我们花大量的心思去学会接触新的东西,你们并不能只局限于我提供的推荐学习资料,因为相应的功能包不是一成不变的,而且也不是只有那么几个功能包,当你感受了 ROS 的自主建图、自主导航、机械臂控制、机器学习开发等等等等等等后,你才会发现 ROS 的世界是如此美妙!</strong>
|
||||
<strong>提一嘴:很多人学 ROS 就学一个开头 - 比如就学了古月居的 21 讲,就认为自己已经了解到了 ROS 的大部分内容了</strong><strong>(不会有人现在还是纯看视频学习吧)</strong><strong>,实际上这是非常错误的想法。当你学完了视频的内容后,你甚至可能不会移植 wiki 上的功能包(x_x),甚至不知道如何去开发一个真实的机器人(因为此 21 讲只是理论上的讲解,去做一个虚拟机器人在 gazebo 上运行)。ROS 的学习上需要我们花大量的心思去学会接触新的东西,你们并不能只局限于我提供的推荐学习资料,因为相应的功能包不是一成不变的,而且也不是只有那么几个功能包,当你感受了 ROS 的自主建图、自主导航、机械臂控制、机器学习开发等等等等等等后,你才会发现 ROS 的世界是如此美妙!</strong>
|
||||
|
||||
2、b 站赵虚左 ROS 课程(讲得细致多了,需要耐心看下去,要是我入门 ROS 的时候有这个视频就好了)
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# 5.富有生命的嵌入式
|
||||
|
||||
Author:肖扬
|
||||
> Author:肖扬
|
||||
|
||||
孵化器实验室 2023 招新群(QQ): 879805955
|
||||
孵化器实验室 2023 招新群 (QQ): 879805955
|
||||
|
||||
预热 OJ 平台:[OJ 平台(C 语言为主)](http://hdufhq.cn/)
|
||||
预热 OJ 平台:[OJ 平台 (C 语言为主)](http://hdufhq.cn/)
|
||||
|
||||
> 实验室不仅有嵌入式方向,还有硬件、网络 web 开发方向!
|
||||
|
||||
@@ -18,4 +18,4 @@ Author:肖扬
|
||||
|
||||

|
||||
|
||||
ps:若对此部分讲义有相关疑问或者建议,欢迎 QQ 联系-1213047454
|
||||
ps:若对此部分讲义有相关疑问或者建议,欢迎 QQ 联系 -1213047454
|
||||
|
||||
Reference in New Issue
Block a user