你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[nucleo-H7A3ZI-Q]1-点亮一个皮皮灯

[复制链接]
ALanStewart 发布时间:2024-1-22 00:41

前言

很感谢ST中文社区让我体验H7A3ZI-Q这块开发板,但是由于个人原因拖到现在才开始编写这篇体验报告,也很感谢ST中文社区的耐心和支持!!!

本文不是入门教程,更多是个人体验笔记和交流,如果有不懂的地方,可以自行查阅资料或者上B站看视频学习哦。

由于作者技术水平有限,本文可能会有错误的地方,感谢大家热情指出和交流。

介绍:

一般来说,单片机学习都是从点亮一个灯开始的,也是一个熟悉编译环境和入门的过程。所以第一个小试验就是点灯,但是单纯的亮一个灯又比较无趣,所以我们可以让灯无序的亮起,然后亮随机的时间,我简称这个为“皮皮灯”。

使用单片机实现上面的功能可能会经过以下流程:

  1. 查看原理图,确定单片机引脚,引脚输入还是输出,输出按哪种模式;
  2. 使用cubeMX工具自动配置时钟和引脚,并生成代码工程;
  3. 规划程序流程图,确定需要现实的函数功能;
  4. 编写自己的应用代码,实现“皮皮灯”的功能。

本次实验按照以上步骤来编写。

硬件设计

RGBPORT_PIN.png

如图所示,PB0,PE1,PB14对应不同颜色的LED灯,故确定本次实验需要配置这三个IO。再者此三个IO是通过NPN三极管控制LED灯的,当IO输出高电平,三极管即导通,电流能通过三极管ec二级流入地,LED导通,并点亮,故也能确定输出高电平点亮LED灯,反之输出低电平熄灭LED灯。

使用CubeMX创建工程并生成代码

因为是基于nucleo-H7A3ZI-Q开发板开发的,所以可以直接选择板来创建工程

1705423524948.jpg1705424384386.jpg

创建完工程看视图,可以发现其实软件已经帮我们配置好LED灯和SWD等的引脚,因为本开发板是使用板载的ST-LINK V3来实现调试和串口共同一个USB口,十分方便,所以本实验无需修改既可选择直接生成代码,当然你可以自行修改看看有啥不同,比如调整时钟频率,IO速度等,看看会不会和本实验有不同的现象。

![1705425374101.jpg](data/attachment/forum/202401/22/003355vgb95pbgglzcfv55.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "1705425374101.jpg"

1705425331602.jpg

确定好时钟频率,和IO配置等后,选择IDE,并按生成代码【GENERATE CODE】

1705425374101.jpg

程序流程图

程序的流程比较简单,硬件和时钟初始化后(实际上,CubeMX已经帮你配置好了),在while循环里面,产生1-3范围内的随机数,点亮LED1~3(即R\G\B,按你的想法来定义),确定LED等后就翻转LED电平,延时随机数,我的代码为了好观察现象已经配置一个较短的时间了,延时结束后,再翻转LED电平。

微信截图_20240116234743.png

应用代码

具体的应用需要读者自行编写,这里给出关键代码作为参考。

在给出代码前,读者需要了解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;
}/**
 * @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;
        }

    }

实验现象

编译工程烧录下载后,可以看到主板上三盏灯会随机的亮起

ee1a951a994f2047a12bfc69f9dfa53.jpgb10c0aebbf5a90323e564a9b554d9b8.jpg

代码参考

有需要的话,可以在git上克隆工程下来看看实验现象

https://github.com/ALanStewart47/Project-H7A3ZI-Q/tree/main/Software/1.Led_Control

后续也附上csdn的下载链接(必须免积分):

自我修改

  1. 看看还有没其他方法产生随机数(H7系列有产生随机数的外设哦~)
  2. 用其他“播种”源来产生种子,看看会有什么不同。
1705425331602.jpg
收藏 评论1 发布时间:2024-1-22 00:41

举报

1个回答
STMCU-管管 回答时间:2024-1-22 15:45:44
感谢分享" v2 D# x) ?9 C7 P  g# z3 o& [
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版