STM32高效编程
最近参加了一次学校的电子比赛,收获很多,因为之前只是看看32的样例,自己瞎改改代码,并没有去实现一下具体的什么功能,也就是不能自己做出一些东西,所以对于知识的理解并不是很深入,借着这次机会,和小伙伴一起做了一个蓝牙控制的LED灯,当然这个想法也是借鉴了之前一直想做但却没做的一个智能家居的想法。
说实话刚开始做的时候还是充满信心的,先去网上买了蓝牙模块HC-05,看了一下资料,自己试着先用蓝牙模块去控制一个灯看能否实现,结果以失败告终,还是自己对32的学习太肤浅了,用资料里面的例程,但是无奈一直不行,检测不到蓝牙模块,看了一遍关于32串口通信的资料,又去重新试了一下,还是不行。没办法,找学长问问吧!
问过之后才开始懂了一点,32的PA9和PA10 下面的RX和TX是连接在USB上的,接线还是要接在PA9和PA10 上。
此刻想起了学长曾经总结过的一个经验:多问
貌似扯远了!!!
在和小伙伴的代码合并的时候,出现来了很多问题,那时候也是最乱的时候,看不懂对方的代码,还有各种乱七八糟的错误,自己尝试着慢慢去理解,但有的部分还是看不懂,只得找来小伙伴解释一番,勉强知道每个函数所实现的功能。
问题有三:其一,函数命名不够规范,看完函数名不能清楚的知道函数要实现什么功能;其二,main函数里面的东西太多,阅读起来很不方便;其三,缺乏运用宏定义的习惯,这样使得代码看起来比较杂乱。
列举一下我所犯得错误:
void display1(void);
void display2(void);
void display3(void);
void display4(void);
这样的命名方式是最不好的,也是最让人看得一脸懵逼的命名方式,或许这份代码放了一段时间,自己也不知道每个函数实现的功能是什么了。
如果换成这样:
void Dispaly_Year_Month(void);
void Display_Month_Day(void);
void Display_Hour_Minuter(void);
void Display_Minuter_Seconds(void);
这样的话我们的代码看起来就简单易懂很多了,不但给被人看,自己以后看代码也很容易。
main函数里面的代码一定要简,千万不要吧别得函数里面的代码都放在main函数里面,这样写是没什么问题但是阅读起来真的很不舒服。
再说说最后一个问题宏定义,还是举例来说明吧:
GPIO_ResetBits(GPIOB,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
这只是显示1个数字,需要两行代码,这样10个数字操作下来,显得很繁琐。
用一个宏定义:
#define SEG_NUM_PORT GPIOB
#define A GPIO_Pin_1
#define B GPIO_Pin_2
#define C GPIO_Pin_3
#define D GPIO_Pin_7
#define E GPIO_Pin_8
#define F GPIO_Pin_9
#define G GPIO_Pin_12
#define DP GPIO_Pin_13
#define ZERO_NUM (A | B | C | D | E | F)
#define ONE_NUM (B | C)
#define TWO_NUM (A | B | G | E | D)
#define THREE_NUM (A | B | G | C | D)
#define FOUR_NUM (F | G | B | C)
#define FIVE_NUM (A | F | G | C | D)
#define SIX_NUM (A | F | G | E | D | C)
#define SERVER_NUM (A | B | C)
#define EIGHT_NUM (A | B | C | D | E | F | G)
#define NINE_NUM (A | B | C | D | F | G)
u16 seg_on_num[10] = {ZERO_NUM, ONE_NUM, TWO_NUM, THREE_NUM, FOUR_NUM, FIVE_NUM, SIX_NUM, SERVER_NUM, EIGHT_NUM, NINE_NUM};
u16 seg_off_num[10] = {G, A|D|E|F|G, C|F, E|F, A|D|E, B|E, B, D|E|F|G, 0, E};
void DisplayNumber(int x)
{
GPIO_ResetBits(SEG_NUM_PORT, seg_on_num[x]);
GPIO_SetBits(SEG_NUM_PORT, seg_off_num[x]);
}
这样写起来,代码就好看多了,显示数字的函数部分只有两行代码,宏定义+打表,当然宏定义是要写在 .h 文件里面的。
说起收获,还是这些东西教给我的比较多,尤其是大家一起合作写代码的时候,代码规范变得尤为重要,首先你得让别人看的懂你的代码,而不是让你给你的伙伴去解释每个函数都在干什么。当然函数命名规范的话,以后做事情时候后期也是比较容易维护的。
先总结到这里吧,善用打表法,这才是学到的经验,同样的一个现象,代码写的时候就优美很多!