OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: xiatianyun

学习正点原子精英STM32版的学习笔记

  [复制链接]

0

主题

9

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-8-31
在线时间
6 小时
发表于 2018-9-5 11:10:43 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

32

主题

1941

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4312
金钱
4312
注册时间
2018-5-11
在线时间
898 小时
发表于 2018-9-5 18:48:17 | 显示全部楼层
xiatianyun 发表于 2018-9-4 22:54
已经点赞了。
我是初学,谢谢你提供程序供我学习。
这是我的程序,只实现了双击、长按、键盘缓冲区的常 ...

哈哈,看到尊容并点赞了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

32

主题

1941

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4312
金钱
4312
注册时间
2018-5-11
在线时间
898 小时
发表于 2018-9-5 19:47:22 | 显示全部楼层
xiatianyun 发表于 2018-8-14 20:49
使用上位机软件把PC当前时间同步到RTC,RTC开始自动计时,由于通讯传输的延迟,观测到的RTC实时时间比PC上 ...

RTC时间不准是可以调校的。
参见https://wenku.baidu.com/view/d2654a0b767f5acfa1c7cdbc.html
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-9-6 10:49:51 | 显示全部楼层
C语言中如何实现函数缺省参数?
C中不支持直接的函数参数缺省,这点不同于C++和Python,这给实际开发中带来不便。
不过也可以用折中处理方法,就是使用宏定义。
如果希望的函数是:
void funcA(int ia, int ib, float rc = 2.34);
则:
void funcA(int ia, int ib, float rc);
#define funcA_Macro(ia, ib)    func_A(ia, ib, 2.34)
其后的用户程序使用funcA_Macro来调用缺省参数的程序就可以了。
当然,这种方法确实不能带来更多的便利。特别是宏符号和函数名本身是不同的这点就让人放弃。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-9-18 17:32:48 | 显示全部楼层
本帖最后由 xiatianyun 于 2018-9-18 19:16 编辑

继续学习,这次是用串口助手来调试程序的usmart试验,使用到了一些C语言的指针高级用法。以前没有学过这方面的内容,这次补习。
C语言中的数组名可以被当作数组地址来使用,这在数组上的一些操作中使用很普遍。
C语言中的字符串没有专门的类型,这导致了C语言对字符串的操作有一些其他语言没有的坑。
字符串常量是储存在字符数组中的,不过字符数组的末了使用空字符结尾,这样储存的字符数组长度比字符串本身长度多1.
而数组名可以被作为数组地址使用,所以字符串常量是被作为字符指针表示的(其实是不可修改的数组地址)。
e.g:
void func1(char * s);
调用:func1("foooooo");
-------------------------------------------------
指向函数的指针和数组名类似,其实C语言中指向函数的指针是被当作指向数据的指针来对待的。
声明指向函数的指针需要声明参数类型和返回值类型,至于名字则无所谓,满足普通变量命名规则即可。这样这个指针就可指向任何满足该参数类型和返回值类型的函数了。
e.g:
double func1(int a, double b);
double (*pf)(int a, double b);
事实上,形参名可以不用,这样可以:double (*pf)(int, double);
(*pf)的语法是关键,这样才能说明pf是个指向函数的指针,而不是返回double *的函数。
如何调用呢?
首先使pf指向需要的函数:
pf = func1;
这里类似与数组名的使用,不用取址符号&.
调用:(*pf)(34, 34.34);
也可以是: pf(34, 34.34);推荐使用前一种,能够让我们知道pf是个函数指针。
------------------------------------------------
指向函数的指针让我想起来多年前学习过的虚构类的虚构方法来了,有点像哦。
既然指向函数的指针是作为指向数据的指针来对待的,那么就可以被用来作为数组的元素和结构成员来存储了。
比如,设计一个数组,数组元素是指向同一类型声明的函数指针,初始化一般和声明一起编写:
int (*pf[])(int, double) = { func1, func2, func3};
同样,func1、func2、func3表示函数地址。

指向函数的指针在msmart试验中用在结构成员中。



回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-9-18 22:41:32 | 显示全部楼层
初步了解了下usmart试验,这个试验给我们以后独立调试函数带来很多方便,值得好好使用。
这个试验也有很多实现方法值得研究。
回复 支持 反对

使用道具 举报

8

主题

570

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2018-9-19 05:21:55 | 显示全部楼层
不错,Mark一下
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-9-21 16:32:54 | 显示全部楼层
本帖最后由 xiatianyun 于 2018-9-21 16:57 编辑

一直没看明白void*指针如何调用一个函数,这几天看了一些资料,简单来说函数指针虽然有类型,但可以直接从函数入口地址来执行。
void* pt;
void func(void)
{
...
}
//通过pt来执行这个void返回值void参数的函数func.
pt = func;  //可以写作pt = (void*)func;
(*(unsigned int(*)())pt)();
比较烧脑的写法。
大体来看其实和(*pt)()的调用写法一样,只不过pt是个void*类型,需要进行类型转换。
(unsigned int (*)())pt是个强制类型转换,把void*类型的pt强制转换为函数指针。
unsigned int(*)是取得指针内容,即地址,把这个地址值作为unsigned int看待。
unsigned int(*)()其实和func()一样。func也是个地址,是个32位unsigned int值。这样  ((unsigned int(*)()) pt  完成了void*到函数指针的转换。
那么这个转换后的表达式值是个什么类型的函数指针呢?是个通用类型的函数指针,可以用于任何类型的函数(返回值不限,参数不限)。
这样 (* (unsigned int(*)())pt) () 就执行所指函数了。
---------------------------------------
如果函数指针不是通用类型,则需要匹配实际指向的函数:返回值一样,参数类型顺序个数一样。
但实际试验发现可以不匹配,不会出现编译错误,但实际是不是所需要的执行结果就需要设计者自己把握了。
分几种情况分析:
1、返回值一致,参数比实际指向的函数多。
指针赋值时需要把实际函数地址进行转换为指针一致才能通过编译。
void (*pt)(int);  //pt是个返回void,参数为一个int型。
void func1(void);
//指针赋值指向func1,进行类型强制转换才能赋值。
pt = (void(*)(int)) func1;
//通过pt调用func1.
(*pt)(34);   //34是为了配合pt,实际函数并不需要,这里随意,但不能没有。
------------------------
2、返回值一致,指针比实际函数参数少
void (*pt)(void);
void func2(int a);
//指针赋值指向func2
pt = (void(*)(void)) func2;
//通过pt调用func2。由于func2需要一个参数,而pt又不能有参数,所以实际调用func2的参数值就是个不定数。
//这种调用其实没有实际价值。
(*pt)();   //但能够执行,只不过执行并不能实现要求。
-------------------------------------
其他种情况进行了试验,比如返回值的差异。
结论:函数指针可以执行任何类型的函数,只不过需要设计者自己把关,只要符合语法编译是不能检测出问题的。
所以,usmart利用了这点,保证函数入口地址正确,只需要有正确的函数参数就可以正确执行并得到所需结果。
至于返回值问题,可以定义通用指针void *即可经过前述过程实现函数调用并返回值。

回复 支持 反对

使用道具 举报

32

主题

1941

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4312
金钱
4312
注册时间
2018-5-11
在线时间
898 小时
发表于 2018-9-21 20:32:35 | 显示全部楼层
xiatianyun 发表于 2018-9-21 16:32
一直没看明白void*指针如何调用一个函数,这几天看了一些资料,简单来说函数指针虽然有类型,但可以直接从 ...

不错,学习了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-9-22
在线时间
0 小时
发表于 2018-9-22 23:07:17 | 显示全部楼层
xiatianyun 发表于 2018-6-5 17:13
继续。
如果论坛编辑器支持markdown就好了。
知道了一点C对STM32的封装后基本可以对库里面的很多语法上的 ...

学习精神可嘉
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-10-3 09:53:34 | 显示全部楼层
趁着国庆在家无事学着自己动手实现了uSmart,我的就取名叫uMoon吧,因为,前几天刚刚中秋。
实现的过程难度其实在于对字符串的解读上,通过这次试验我明白了什么叫“适合”,要避免所谓的通用。
一开始我想把函数参数适配类型扩展到浮点数,但遇到问题,不能和整数类型通用一个临时数组。
当然,方法还是有的,就是读出配置的函数参数的数据类型,根据这个类型来转换,但一方面比较麻烦了,另一方面我觉得可能在调试中很少会用到浮点数的函数。
----------------------------------------------------------
以下记录几个遇到的值得记录的知识点:
C语言之所以合适与嵌入式底层这类的开发是因为提供了指针这个法宝,不过同样对程序员要求比较高。这个高就是C提供指针后对于指针操作就撒手不管了,一切由你去折腾。
这个对于开发效率来说的确有好处,也有坏处,你必须时时注意这点。
比如一个字符串,C本身没有字符串类型,字符数组只需末尾加0也可以作为字符串用,字符串常量也是字符串。
如果忘记加末尾结束符就糟了,一般做字符串遍历采用while(*st)这种方式,只有遇到0才终止,如果没有加结束符就会越过边界到其他地方了。
而糟糕的是结束符需要手工添加。
----------------------------------------------------------
底层数据如何按字节复制呢?
如果只是把值复制到另一处储存,可能不会遇到太多问题,最差是数值精度损失。
如果要把一个浮点数储存到一个字节数组中如何实现?首先,这里的字节数组是没有值的,仅仅提供存储的地方,所以将来解读需要知道里面存储的是什么类型的数据才行。
float在stm32中测试发现是4字节,int和long都是4字节。
float f = 3.14159;
uint8_t stack[MAXNUM][MAXLEN];

float* pt ;
//假设现在f需要存储在stack[i]中。
pt = (float*)stack[i];
*pt = f;   //完成了4字节浮点数的另存。
//如何读取存储的数据为一个浮点数?
float f1;
f1 = *(float*)stack[i];




回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-10-11 08:32:21 | 显示全部楼层
这几天在学习C++编程,已经在Keil MDK中用C++实现了之前作的Modbus-RTU通讯的从站部分程序并调试通过。完成后有时间把学到的在Keil中编写C++的心得体会写出来总结下。
回复 支持 反对

使用道具 举报

5

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2018-1-15
在线时间
34 小时
发表于 2018-10-11 14:52:43 | 显示全部楼层
:@
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-6-22
在线时间
13 小时
发表于 2018-10-18 10:26:02 | 显示全部楼层
楼主好厉害,持续关注
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-10-23 15:31:29 | 显示全部楼层
本帖最后由 xiatianyun 于 2018-10-23 19:52 编辑

有关定时器更新中断初始化过程中会立即出现一次中断现象的解决。
这几天很郁闷,本以为差不多懂了的中断成了拦路虎。
按照例程初始化TIM6,由于一些原因我想看看中断为什么会达不到要求,所以我只设计了中断一次,在中断处理函数中最好关闭的定时器。并打印进入中断的信息方便调试。
下载后从串口看出现了两次中断信息提示。......这个有问题了。
我想即使第一次也应该在最后关闭了定时器呀,怎么还会又出现一次呢?
过程太乱,检重点。
原来当初始化定时器到TIM_TimeBaseInit(TIM6, &TIM_InitStrut);时出现了一次中断,这个连定时器中断优先级都还没有设置,也还没有允许更新中断。
只好各种搜索了,还是得看手册,手册没有实际案例,所以是搜索加手册看。
原因查到了,是因为:TIM6的EGR寄存器bit0位UG其实可以软件置位来产生一次更新事件。一旦置位UG就会硬件置位SR的bit0 UIF,也就是更新中断标识位,一旦UIF为1就会进入中断服务函数去执行。
而TIM_TimeBaseInit(TIM6, &TIM_InitStrut);恰恰最后一条语句是置位UG。TIMx->EGR = TIM_PSCReloadMode_Immediate;   

所以就在执行完TIM_TimeBaseInit()后进入了中断服务函数。
这个连中断源都没有工作就执行了一次中断服务处理,这是一个库函数BUG吗?

我又不能随便改写TIM_TimeBaseInit()函数,这个真没把握。
------------------------------
UG置位一定会进入中断服务吗?未必。查手册,这个由CR1的bit2 URS决定,为0可以由UG产生一次更新事件,为1就只能由溢出产生。
------------------------------
解决的方案当然就是:及时清除UIF标识,所以应该在TIM_TimeBaseInit之后立即执行TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
这个也许不科学,因为立即执行中断服务函数是否会在此前就执行呢?不得而知。所以,如果可靠的话还是应该删除TIM_TimeBaseInit()的最后一句置位UG的语句。

感谢一下帖子的帮助:
http://www.openedv.com/forum.php ... 6%F7%2B%D6%D0%B6%CF
不过帖子中是执行NVIC后会出现进入中断服务。
--------------------------------------------------------------------------
FIXME:关于执行TIM_TimeBaseInit()会产生UG置位并导致进入一次中断服务函数的结论不正确。
我试着注释掉TIM_TimeBaseInit()中的最后一句并注释掉初始化之后的清除标识,还是会引发一次执行服务函数。
我接着注释掉TIM_TimeBaseInit()改为直接赋值给PSC和ARR,还是会引发进入一次服务函数。
---------------------------------------
补充:产生UG会自动使UIF置位,但需要等NVIC配置后才会自动进入中断函数一次,并不需要等待定时器使能。
如果不使UG置位,不会自动使UIF置位,到NVIC配置后也不会立刻进入中断函数,需要使能定时器后立刻进入中断服务函数(不经过定时)。



回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-10-23 17:12:51 | 显示全部楼层
有关中断服务函数中何时应该清除中断标识位。
以TIM6的更新中断为例说明。
如果发生了中断事件会由硬件置位UIF,从而进入中断服务函数处理。进入中断处理中如果中断源还在工作则可能还会出现中断,不过是否执行中断服务则要看情况了。
一般来说同一个中断无法再中断自己,这是因为是同一优先级别,无法自我打断,只能等执行完中断处理后才有可能再次中断处理。
是否执行中断处理看UIF位,所以,如果中断服务没有复位UIF,在处理完毕后会立即又进入中断服务。
-------------------------------
那么,如果中断处理程序中清除了中断标识位UIF是否就不会在返回后立刻再次进入中断服务函数呢?也未必。
这要看中断服务过程中中断源是否中断以及清除UIF的时机。
比如说定时5s,中断处理耗时6s,进入中断就清除了UIF,则处理过程会发生中断使UIF再次置位,只不过不会立刻再次进入处理,而是等返回后立刻再次进入中断处理,原因就是UIF此时是置位的。
如果返回前清除了UIF呢?有一个帖子专门讨论过这种情况,我没法重现。http://www.openedv.com/forum.php ... 6%CF%2B%B6%E0%B4%CE
大体意思是返回前清除UIF在返回后系统的判断可能会有时钟差,返回后可能还没有实际写入UIF。(这个可以算是一个BUG了)
所以最好写入后软件读取一次并赋值:A= 0;A=A;这样可以保证写入可靠。
我现在的做法是进入中断就清除一次,结束再清除一次。
不过这样做要和系统实际需要配合才行,如果确实需要就不用清除。
总之,中断服务函数的程序最好是简短高效地处理并快速结束为妙。







回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-10-29 10:01:38 | 显示全部楼层
目前Modbus-RTU通讯已经比较理想了,唯一的不足是使用C++编程导致程序代码比较大,足足有20k了。
C++编程有许多优点,比较利于管理庞杂的函数。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-11-5 09:56:32 | 显示全部楼层
停电了,刚才的内容只好重写。
昨天发现以前写的TimeON()函数存在重大问题:如果该函数执行时间周期大于1ms则会出现漏检,导致定时延长。
现在经过重写已经比较合理了,我把统计脉冲放到了SysTick中断里面处理,这样可以最大限度地避免漏检,而且SysTick中断优先级调到最高。
在SysTick中断里面来处理的做法给我一个提示,中断函数虽然要做到精炼,但是如果需要还是可以突破的,只要保证不会出现较大的耗时就可以了。
过程中还发现定时器定时到达后到读取到这个变化其实还是有段时间的,更何况从读取-复位-重启定时器仍然需要时间,所以我又重设计了TimeON(),增加了复位功能,这样至少读取后能及时复位重启定时器,而不是等待下一个执行周期才能复位-重启。
为了避免给读我帖子的各位造成误会,我提醒:我所讲的TimeON()定时器是自定义的定时器,和STM32本身的定时器无关,可以理解为软定时器。
设计了5个软定时器,可以根据需要增加,不过太多会增加SysTick中断处理时间。



回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-11-5
在线时间
0 小时
发表于 2018-11-5 23:59:25 | 显示全部楼层
笔记很强,萌新学习一下
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-11-8 23:39:26 | 显示全部楼层
本帖最后由 xiatianyun 于 2018-11-8 23:58 编辑

学习矩阵键盘,还真不容小视,意为小菜一碟,没想到还有许多东西没有掌握。
一开始行输出采样电平设为高电平,列输入采样端口设为下拉输入,1有效。
开始没有任何问题,可以正常读取键盘值,但当我采用类封装矩阵键盘取消了行输出延时后发现出现了偶发的读取错误,本来应该读出0x0a值的,但却读回了0x0e。
其他列没问题。很奇怪。
回忆以前看到过的一篇关于上升沿需要时间的内容我明白了,是因为如果列采样电平为高电平时,从发出指令到高电平稳定是需要时间的,而我又取消了延时,所以会读取错误。
这回改为输出低电平为采样电平,列端口配置为上拉输入,0有效。
仍然没有延时,但一切正常了。
--------------------------
后记:
其实如果采样电平为高电平的话也可以不使用delay_ms()延时,执行几次for循环即可,我测试for(int i = 0; i < 1; i++);只执行一次就可以正常采样。甚至for(int i = 0; i < 0; i++);也可以。
如果改为执行int i = 0;这样的无言赋值语句不能达到目的。
如果是汇编,使用NOP我想是可以的(执行空语句耗时一个周期)。
但C空语句是不能编译为NOP 的。

回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-11-9 10:26:42 | 显示全部楼层
支持 UP UP UP!!!
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2019-1-7 09:33:37 | 显示全部楼层
很久没有更新帖子了,虽然每天还是习惯登录打卡,不过最近在打算考注册消防工程师,已经没有时间继续学习了。
双十一买的LORA模块也没有时间学习,只能作为一个爱好了。
回复 支持 反对

使用道具 举报

4

主题

68

帖子

0

精华

高级会员

Rank: 4

积分
722
金钱
722
注册时间
2016-7-21
在线时间
280 小时
发表于 2019-2-15 17:41:24 | 显示全部楼层
看到你的更新我很佩服你的意志力,很不错,值得学习,不管在哪个岗位都是要学习的,活到老学到老
回复 支持 反对

使用道具 举报

10

主题

134

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1548
金钱
1548
注册时间
2019-5-2
在线时间
157 小时
发表于 2019-8-2 09:35:15 | 显示全部楼层
迫不及待的收藏了。通俗易懂
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
初级入门者,不懂,帮顶
回复 支持 反对

使用道具 举报

0

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,大家来帮忙解答一下。。
回复 支持 反对

使用道具 举报

0

主题

80

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,大家来帮忙解答一下。。
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,大家来帮忙解答一下。。
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
原子哥,快来帮楼主解答吧,等不及了
回复 支持 反对

使用道具 举报

0

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2020-5-3
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
初级入门者,不懂,帮顶
回复 支持 反对

使用道具 举报

0

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2020-4-29
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮楼主顶一下......
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶!!!!!!
回复 支持 反对

使用道具 举报

0

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,相信大家会帮您解答的
回复 支持 反对

使用道具 举报

0

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-8-3
在线时间
8 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,谢谢支持开源电子网,支持正点原子。
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,谢谢支持开源电子网,支持正点原子。
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,大家来帮忙解答一下。。
回复 支持 反对

使用道具 举报

0

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
只可惜水平比较弱,只能帮楼主顶一下,尽绵薄之力。
回复 支持 反对

使用道具 举报

0

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2020-4-29
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
不懂,帮顶,勇于提问总是好的!!
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,懂的坛友可以帮忙解答一下
回复 支持 反对

使用道具 举报

0

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
默默的路过,帮顶
回复 支持 反对

使用道具 举报

0

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2019-7-11
在线时间
1 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,相信大家会帮您解答的
回复 支持 反对

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2020-5-4
在线时间
0 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮楼主顶一下......
回复 支持 反对

使用道具 举报

0

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-8-3
在线时间
8 小时
发表于 2020-5-7 20:51:26 | 显示全部楼层
帮顶,谢谢支持开源电子网,支持正点原子。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2020-9-23
在线时间
3 小时
发表于 2020-9-24 14:28:12 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-10-26
在线时间
0 小时
发表于 2020-10-26 16:25:54 | 显示全部楼层
收藏一下。
回复 支持 反对

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2020-11-24
在线时间
32 小时
发表于 2020-12-11 08:58:27 | 显示全部楼层
mark  
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2021-1-28
在线时间
6 小时
发表于 2021-2-2 10:53:07 | 显示全部楼层
很棒最起码我看着这个stm32常识部分看着很舒服,顶一下。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-10-10
在线时间
6 小时
发表于 2021-3-29 11:04:16 | 显示全部楼层
牛逼的人
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2021-7-13
在线时间
6 小时
发表于 2021-7-15 16:03:46 | 显示全部楼层
冒泡


回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-9-27
在线时间
2 小时
发表于 2021-12-1 09:24:05 | 显示全部楼层
写的很棒,抄笔记来了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 16:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表