前言
很感谢ST中文社区让我体验H7A3ZI-Q这块开发板,但是由于个人原因拖到现在才开始编写这篇体验报告,也很感谢ST中文社区的耐心和支持!!!
本文不是入门教程,更多是个人体验笔记和交流,如果有不懂的地方,可以自行查阅资料或者上B站看视频学习哦。
由于作者技术水平有限,本文可能会有错误的地方,感谢大家热情指出和交流。
介绍:
一般来说,单片机学习都是从点亮一个灯开始的,也是一个熟悉编译环境和入门的过程。所以第一个小试验就是点灯,但是单纯的亮一个灯又比较无趣,所以我们可以让灯无序的亮起,然后亮随机的时间,我简称这个为“皮皮灯”。
使用单片机实现上面的功能可能会经过以下流程:
- 查看原理图,确定单片机引脚,引脚输入还是输出,输出按哪种模式;
- 使用cubeMX工具自动配置时钟和引脚,并生成代码工程;
- 规划程序流程图,确定需要现实的函数功能;
- 编写自己的应用代码,实现“皮皮灯”的功能。
本次实验按照以上步骤来编写。
硬件设计
如图所示,PB0,PE1,PB14对应不同颜色的LED灯,故确定本次实验需要配置这三个IO。再者此三个IO是通过NPN三极管控制LED灯的,当IO输出高电平,三极管即导通,电流能通过三极管ec二级流入地,LED导通,并点亮,故也能确定输出高电平点亮LED灯,反之输出低电平熄灭LED灯。
使用CubeMX创建工程并生成代码
因为是基于nucleo-H7A3ZI-Q开发板开发的,所以可以直接选择板来创建工程
创建完工程看视图,可以发现其实软件已经帮我们配置好LED灯和SWD等的引脚,因为本开发板是使用板载的ST-LINK V3来实现调试和串口共同一个USB口,十分方便,所以本实验无需修改既可选择直接生成代码,当然你可以自行修改看看有啥不同,比如调整时钟频率,IO速度等,看看会不会和本实验有不同的现象。
确定好时钟频率,和IO配置等后,选择IDE,并按生成代码【GENERATE CODE】
程序流程图
程序的流程比较简单,硬件和时钟初始化后(实际上,CubeMX已经帮你配置好了),在while循环里面,产生1-3范围内的随机数,点亮LED1~3(即R\G\B,按你的想法来定义),确定LED等后就翻转LED电平,延时随机数,我的代码为了好观察现象已经配置一个较短的时间了,延时结束后,再翻转LED电平。
应用代码
具体的应用需要读者自行编写,这里给出关键代码作为参考。
在给出代码前,读者需要了解stdlib库的srand() , rand()函数,这里给出参考文章:
https://c.biancheng.net/view/2043.html
产生1~3范围内的随机数:
/**
* @brief Create a random number of LED Port
* @note generate 1~3 number
* @retval random number
*/
int Get_Random_LED_Port(void)
{
uint8_t mode;
srand(HAL_GetTick());
mode=rand()%3+1;
mode=create_random_number();
if((mode>0)&&(mode<4))
{
return mode;
}
else
{
return 0;
}
}
可以看到以上代码是利用systick的来"播种"的,故可以通过改变""播种"来源,产生不同的“种子”。
产生随机数:
/**
* @brief Create a random number,range
* @note generate random number
* @retval random number
*/
int create_random_number(void)
{
uint32_t number = 0;
srand((unsigned)HAL_GetTick());
number=rand();
return number;
}
LED随机延时后翻转
/**
* @brief Create a random number of LED Port
* @note generate 1~3 number
* @retval random number
*/
void Random_Delay_LED_Toggle(GPIO_TypeDef *GPIO,uint16_t pin)
{
HAL_GPIO_TogglePin(GPIO,pin);
HAL_Delay(create_random_number()%401+150);
HAL_GPIO_TogglePin(GPIO,pin);
}
主函数:
while (1)
{
switch(Get_Random_LED_Port())
{
case 1:
Random_Delay_LED_Toggle(LD1_GPIO_Port,LD1_Pin);
break;
case 2:
Random_Delay_LED_Toggle(LD2_GPIO_Port,LD2_Pin);
break;
case 3:
Random_Delay_LED_Toggle(LD3_GPIO_Port,LD3_Pin);
break;
}
}
实验现象
编译工程烧录下载后,可以看到主板上三盏灯会随机的亮起
代码参考
有需要的话,可以在git上克隆工程下来看看实验现象
https://github.com/ALanStewart47/Project-H7A3ZI-Q/tree/main/Software/1.Led_Control
后续也附上csdn的下载链接(必须免积分):
自我修改
- 看看还有没其他方法产生随机数(H7系列有产生随机数的外设哦~)
- 用其他“播种”源来产生种子,看看会有什么不同。