打印
[STM32H5]

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

[复制链接]
289|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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在导入工程的时候,也经常会犯一个毛病,就是以拷贝模式导入工程的时候,会引起和工程路径上的参考有关的问题,所以我都是尽可能使用非拷贝模式导入。

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

{

GPIO_InitTypeDef GPIO_InitStructure;



/* Enable GPIOC clock */

__HAL_RCC_GPIOC_CLK_ENABLE();



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

GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;



GPIO_InitStructure.Pull = GPIO_NOPULL;

GPIO_InitStructure.Pin = BUTTON_USER_PIN;

HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);





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

HAL_NVIC_SetPriority(EXTI13_IRQn, 2, 0);

HAL_NVIC_EnableIRQ(EXTI13_IRQn);

}



void EXTI13_IRQHandler(void) {

HAL_GPIO_EXTI_IRQHandler(BUTTON_USER_PIN);

}

</font>


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

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

/* EXTI line interrupt detected */

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

__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_Pin);

HAL_GPIO_EXTI_Rising_Callback(GPIO_Pin);

}



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

__HAL_GPIO_EXTI_CLEAR_FALLING_IT(GPIO_Pin);

HAL_GPIO_EXTI_Falling_Callback(GPIO_Pin);

}

}

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

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {

if (GPIO_Pin == BUTTON_USER_PIN)

{

/* Toggle LED2 */

BSP_LED_Toggle(LED2);

}

}</font>


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



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

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

/* USER CODE BEGIN SysTick_IRQn 0 */

BSP_LED_Toggle(LED2);

/* USER CODE END SysTick_IRQn 0 */

HAL_IncTick();

/* USER CODE BEGIN SysTick_IRQn 1 */



/* USER CODE END SysTick_IRQn 1 */

}</font>

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

* @{

*/

typedef enum {

HAL_TICK_FREQ_10HZ = 100U,

HAL_TICK_FREQ_100HZ = 10U,

HAL_TICK_FREQ_1KHZ = 1U,

HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ

} HAL_TickFreqTypeDef;



HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */

__weak void HAL_IncTick(void) {

uwTick += (uint32_t) uwTickFreq;

}</font>

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

使用特权

评论回复
沙发
kqh11a| | 2024-7-29 14:28 | 只看该作者
你提到的使用I3C接口、超大闪存和内存、以及集成的多种外设特性,无疑为各种应用提供了强大的支持。

使用特权

评论回复
板凳
kqh11a| | 2024-7-29 14:29 | 只看该作者
STM32H533 是一款功能强大的微控制器,尤其适合需要高性能和多功能接口的应用场景

使用特权

评论回复
地板
kqh11a| | 2024-7-29 14:38 | 只看该作者
STM32CubeIDE 会生成基础代码,可以在 main.c 文件中添加处理外部中断的逻辑。

使用特权

评论回复
5
申小林一号| | 2024-7-29 22:54 | 只看该作者
感谢分享

使用特权

评论回复
6
纠结的那些年| | 2024-7-31 11:56 | 只看该作者
I3C 是 I2C 的升级版,提供了更高的数据传输速度和更低的功耗。虽然目前市场上 I3C 设备不多,但它的优势使得它在未来可能会逐步取代 I2C。学习和理解 I3C 技术将对未来的开发工作非常有帮助。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

106

主题

3208

帖子

5

粉丝