这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+NUCLEO-U5A5ZJ-Q GPIO操作

共2条 1/1 1 跳转至

【换取手持数字示波器】+NUCLEO-U5A5ZJ-Q GPIO操作

菜鸟
2024-04-25 17:21:04     打赏

NUCLEO-U5A5ZJ-Q开发板搭载的STM32U5微控制器确实提供了丰富的GPIO和其他外设功能,这些功能使得开发板在多种应用场景下都非常灵活和强大。以下是关于NUCLEO-U5A5ZJ-Q的GPIO性能的重新整理信息:

GPIO端口性能

  • 端口数量:STM32U5微控制器具有多达144个GPIO端口,提供了大量的连接选项,可以满足各种复杂应用的需求。

  • 引脚分配:GPIO端口分布在多个封装引脚上,可以根据具体的应用需求进行配置和连接。

  • 可配置性:GPIO端口可以灵活地配置为输入、输出或复用功能,这使得用户可以根据需要设置端口的工作模式。

  • 驱动能力:GPIO端口具有强大的驱动能力,可以输出和接收低电平和高电平信号,从而控制外部设备的状态。

  • 中断支持:GPIO端口支持中断功能,当外部设备的状态发生变化时,可以及时向处理器发送中断信号,实现实时响应。

  • 速度:STM32U5的GPIO端口支持高达18MHz的工作频率,这使得数据传输更加迅速和高效。

  • 耐压耐流能力:GPIO端口具有较高的耐压和耐流能力,可以连接各种外部设备而不会损坏芯片本身。

其他外设接口

STM32U5微控制器还提供了丰富的通信接口,包括I2C、SPI、USART、UART、SAI、DCMI、SDMMC、FDCAN、USB OTG等。这些接口使得NUCLEO-U5A5ZJ-Q开发板能够轻松地与其他设备和系统进行通信和数据交换。

u5a5的开发工具有很多,下面是介绍他的工具链:


blob.png


1、原理图:

  blob.png


  

通过三极管驱动点亮LED是一种常见的电子电路设计方法。当单片机的IO口输出高电平时,三极管的基极得到足够的电压,使三极管进入饱和状态。

在饱和状态下,三极管的集电极和发射极之间的电阻变得很小,允许较大的电流流过LED。

LED因此得到足够的电流而点亮。

当单片机的IO口输出低电平时,三极管的基极电压不足以使其导通,LED熄灭。

2、架构:

blob.png

3、点亮效果:

  blob.png

4、相关核心代码:

在STM32CubeIDE中打开工程,主程序文件(通常是main.c)。
在主程序文件中,首先包含必要的头文件,并定义LED灯对应的GPIO端口和引脚。

#include "stm32u5xx_hal.h"      
#define LED_PIN GPIO_PIN_0      
#define LED_PORT GPIOA    
初始化GPIO端口,并将LED灯对应的引脚配置为输出模式。
void GPIO_Init(void) {__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟  GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = LED_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出  GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);}
在主函数中,调用GPIO初始化函数,并循环控制LED灯的点亮和熄灭。

int main(void) {    
HAL_Init(); // 初始化HAL库      
SystemClock_Config(); // 配置系统时钟(这个函数通常在STM32CubeMX生成的代码中提供)      
GPIO_Init(); // 初始化GPIO      
while (1) {    
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET); // 点亮LED灯      
HAL_Delay(1000); // 延时1秒      
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET); // 熄灭LED灯      
HAL_Delay(1000); // 延时1秒      
}    
}
Thread One"、"Thread Two"完成之后,"Main Thread"将会删除这2个任务。然后将用户的绿灯1秒闪烁一次。
void MainThread_Entry(ULONG thread_input)  
{  
    /* USER CODE BEGIN MainThread_Entry */  
      
    // 定义变量,用于存储ThreadOne和ThreadTwo的旧优先级和旧抢占阈值  
    UINT old_prio = 0;  
    UINT old_pre_threshold = 0;  
      
    // 用于存储获取到的事件标志的实际值  
    ULONG actual_flags = 0;  
      
    // 用于控制循环次数的计数器  
    uint8_t count = 0;  
      
    // 忽略传入的thread_input参数,这里不使用它  
    (void) thread_input;  
      
    // 循环执行3次  
    while (count < 3)  
    {  
        count++;  
          
        // 尝试获取事件标志,如果成功则清除标志,否则等待直到标志可用  
        if (tx_event_flags_get(&EventFlag, THREAD_ONE_EVT, TX_OR_CLEAR,  
                               &actual_flags, TX_WAIT_FOREVER) != TX_SUCCESS)  
        {  
            // 如果获取事件标志失败,则调用错误处理函数  
            Error_Handler();  
        }  
        else  
        {  
            // 更新ThreadTwo的优先级和抢占阈值,以允许ThreadOne被抢占  
            tx_thread_priority_change(&ThreadTwo, NEW_THREAD_TWO_PRIO, &old_prio);  
            tx_thread_preemption_change(&ThreadTwo, NEW_THREAD_TWO_PREEMPTION_THRESHOLD, &old_pre_threshold);  
              
            // 再次尝试获取事件标志,如果成功则清除标志,否则等待直到标志可用  
            if (tx_event_flags_get(&EventFlag, THREAD_TWO_EVT, TX_OR_CLEAR,  
                                 &actual_flags, TX_WAIT_FOREVER) != TX_SUCCESS)  
            {  
                // 如果获取事件标志失败,则调用错误处理函数  
                Error_Handler();  
            }  
            else  
            {  
                // 重置ThreadTwo的优先级和抢占阈值  
                tx_thread_priority_change(&ThreadTwo, THREAD_TWO_PRIO, &old_prio);  
                tx_thread_preemption_change(&ThreadTwo, THREAD_TWO_PREEMPTION_THRESHOLD, &old_pre_threshold);  
            }  
        }  
    }  
      
    // 销毁ThreadOne和ThreadTwo  
    tx_thread_terminate(&ThreadOne);  
    tx_thread_terminate(&ThreadTwo);  
      
    // 无限循环,用于LED闪烁和线程休眠  
    while(1)  
    {  
        // 切换LED1的状态  
        HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);  
          
        // 线程休眠100个tick(假设这相当于1秒)  
        /* Thread sleep for 1s */  
        tx_thread_sleep(100);  
    }  
      
    /* USER CODE END MainThread_Entry */  
}

5、配置:

 blob.png


blob.png


KEIL生成文件:

blob.png


点亮LED的核心代码KEIL截图:

blob.png


NUCLEO-U5A5ZJ-Q是一款基于STM32U5A5ZJ微控制器的开发板,其中STM32U5A5系列是STMicroelectronics推出的超低功耗微控制器系列。该系列芯片基于高性能的Arm Cortex-M33 32位RISC内核,并且具有高达160MHz的工作频率。此外,它还具有大容量的存储器,包括4Mbytes的Flash和2.5Mbytes的SRAM,是STM32系列中首款提供4MB Flash的MCU。

关于NUCLEO-U5A5ZJ-Q开发板的点灯测评,主要涉及到使用ThreadX这一实时操作系统(RTOS)来控制开发板上的LED灯。ThreadX是Microsoft提供的高级工业级RTOS,专为深度嵌入式实时IoT应用程序设计。通过编程,可以实现LED灯的点亮、熄灭以及可能的闪烁效果。

NUCLEO-U5A5ZJ-Q开发板还提供了丰富的扩展能力,通过ST Zio连接器(兼容Arduino Uno V3)和ST morpho接头,可以方便地扩展开发板的功能,连接各种定制的扩展板。同时,该开发板集成了STLINK-V3E调试/编程器,无需额外的调试器。





菜鸟
2024-05-02 12:37:05     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]