本帖最后由 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。 实际运行中,也确认了这个结果: 在某些场景下,利用系统的系统滴答器暂时替代时钟,应该也不会有太大的问题。 后面的测试中,我还会体验其它外设。
|