[STM32H5] 【STM32 Nucleo-64测评】+以滴答器方式点亮LED

[复制链接]
1233|9
 楼主| suncat0504 发表于 2024-7-21 20:14 | 显示全部楼层 |阅读模式
本帖最后由 suncat0504 于 2024-7-21 20:15 编辑

感谢二姨家的开发板评测活动,让我接触STM32H533这个高性能芯片。STM32H533的超大闪存和内存,是最令我心仪的地方,另外还包括两个I3C接口、一个带PD的USB全速控制器和一个SDMMC接口;两个I3C接口意味着可以在自身做I3C方面的测试,而不需要外购I3C部件。另外市场上I3C的设备还不是很多,I3C的特点,我感觉以后会完全替代I2C。从I2C到I3C的过渡,个人觉得以后软件方面的处理会原来越重要,在某些方面的工作已经可以替代硬件了。

按照一直以来的习惯,开发板拿到手里后的第一步,一定是建立开发环境和测试GPIO口。不过这一次没有使用传统的GPIO_Toggle工程测试,而是使用的GPIO_EXTI工程,兼顾输入输出操作。IDE使用的是CubeIDE。最近在使用Keil IDE的时候,经常会出现无法通过定义查找函数的声明、定义点,导致读代码的时候非常吃力。现在更喜欢使用Eclipse这样的开发环境。当然Eclipse在导入工程的时候,也经常会犯一个毛病,就是以拷贝模式导入工程的时候,会引起和工程路径上的参考有关的问题,所以我都是尽可能使用非拷贝模式导入。

在这个外部中断例程中,由设置可知,
  1. <font face="Tahoma" size="4">static void EXTI13_IRQHandler_Config(void)

  2. {

  3. GPIO_InitTypeDef GPIO_InitStructure;



  4. /* Enable GPIOC clock */

  5. __HAL_RCC_GPIOC_CLK_ENABLE();



  6. /* Configure PC.13 pin as input floating */

  7. GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;



  8. GPIO_InitStructure.Pull = GPIO_NOPULL;

  9. GPIO_InitStructure.Pin = BUTTON_USER_PIN;

  10. HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);





  11. /* Enable and set line 13 Interrupt to the lowest priority */

  12. HAL_NVIC_SetPriority(EXTI13_IRQn, 2, 0);

  13. HAL_NVIC_EnableIRQ(EXTI13_IRQn);

  14. }



  15. void EXTI13_IRQHandler(void) {

  16. HAL_GPIO_EXTI_IRQHandler(BUTTON_USER_PIN);

  17. }

  18. </font>


这里设置的是在用户按钮所在的GPIO口上产生下降沿的时候,会产生中断。通过下列函数:

  1. <font face="Tahoma" size="4">void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) {

  2. /* EXTI line interrupt detected */

  3. if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_Pin) != 0U) {

  4. __HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);

  5. HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);

  6. }



  7. if (__HAL_GPIO_EXTI_GET_FALLING_IT(GPIO_Pin) != 0U) {

  8. __HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);

  9. HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);

  10. }

  11. }

  12. 最终调用下面的回调函数,

  13. void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {

  14. if (GPIO_Pin == BUTTON_USER_PIN)

  15. {

  16. /* Toggle LED2 */

  17. BSP_LED_Toggle(LED2);

  18. }

  19. }</font>


也就是说,在用户按下用户按钮的时候,会引起LED(绿色)的反转显示。以上程序已经通过验证。开发板的原理图如下:

原理图1.png

原理图2.png



在这个程序的基础上,我记着做了以下实验:利用系统滴答器,使绿色LED周期亮灭。方法也很简单,只需要在滴答处理代码里追加“BSP_LED_Toggle(LED2);”代码就行。

例程的中断处理函数SysTick_Handler:,
  1. <font face="Tahoma" size="4">void SysTick_Handler(void) {

  2. /* USER CODE BEGIN SysTick_IRQn 0 */

  3. BSP_LED_Toggle(LED2);

  4. /* USER CODE END SysTick_IRQn 0 */

  5. HAL_IncTick();

  6. /* USER CODE BEGIN SysTick_IRQn 1 */



  7. /* USER CODE END SysTick_IRQn 1 */

  8. }</font>

相关设置:
  1. <font face="Tahoma" size="4">/** @defgroup HAL_TICK_FREQ Tick Frequency

  2. * @{

  3. */

  4. typedef enum {

  5. HAL_TICK_FREQ_10HZ = 100U,

  6. HAL_TICK_FREQ_100HZ = 10U,

  7. HAL_TICK_FREQ_1KHZ = 1U,

  8. HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ

  9. } HAL_TickFreqTypeDef;



  10. HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */

  11. __weak void HAL_IncTick(void) {

  12. uwTick += (uint32_t) uwTickFreq;

  13. }</font>

因此滴答器产生的周期使1ms。
实际运行中,也确认了这个结果:
图片1.png
在某些场景下,利用系统的系统滴答器暂时替代时钟,应该也不会有太大的问题。
后面的测试中,我还会体验其它外设。

kqh11a 发表于 2024-7-29 14:28 | 显示全部楼层
你提到的使用I3C接口、超大闪存和内存、以及集成的多种外设特性,无疑为各种应用提供了强大的支持。
kqh11a 发表于 2024-7-29 14:29 | 显示全部楼层
STM32H533 是一款功能强大的微控制器,尤其适合需要高性能和多功能接口的应用场景
kqh11a 发表于 2024-7-29 14:38 | 显示全部楼层
STM32CubeIDE 会生成基础代码,可以在 main.c 文件中添加处理外部中断的逻辑。
申小林一号 发表于 2024-7-29 22:54 | 显示全部楼层
感谢分享
纠结的那些年 发表于 2024-7-31 11:56 | 显示全部楼层
I3C 是 I2C 的升级版,提供了更高的数据传输速度和更低的功耗。虽然目前市场上 I3C 设备不多,但它的优势使得它在未来可能会逐步取代 I2C。学习和理解 I3C 技术将对未来的开发工作非常有帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

158

主题

4507

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部