我们通过以上内容的体验,可以说基本上已经完成了基本作业中的“使用STM32CubeMX图形化配置软件,配置STM32H503RB芯片的内部参数,外设参数,引脚分配等功能;”的任务,当然了这个小任务也是会贯穿在整个开发过程的。接下来我们继续完成基本作业中的“在学习完成全部讲解与实验后,在STM32H503RB开发板成功烧录程序,并编写软件代码实现LED灯周期闪烁,串口打印字符串"Hello EEPW & DigiKey! Hello STM32H503!";”的任务中的最后部分。实现LED的周期闪烁与串口打印功能。
我们分析一下需求,LED的周期闪烁分为阻塞式和非阻塞式两种,我准备通过定时器实现非阻塞式;而串口打印功能准备通过调试器的虚拟串口使用printf打印。
打开之前创建的IOC文件(初始化代码工程),并打开定时器配置模块,本次选用定时器6作为LED周期闪烁的定时器:
在这里我们需要配置两个地方,一个就是定时器的基本参数,一个就是需要打开中断。基本参数主要是通过系统时钟计算Period和Prescaler,闪烁周期暂定为2Hz,主频为144MHz,通过计算选定了(7200-1)和(10000-1)作为这两个参数。中断配置中直接打开就可以了。
串口打印功能,STlink的虚拟串口主要用到的USART3,如下图:
我们在STM32Cube中配置USART3,如下图:
基本作业完整代码如下:
/* USER CODE BEGIN PFP */ #if defined(__ICCARM__) __ATTRIBUTES size_t __write(int, const unsigned char *, size_t); #endif /* __ICCARM__ */ #if defined(__ICCARM__) /* New definition from EWARM V9, compatible with EWARM8 */ int iar_fputc(int ch); #define PUTCHAR_PROTOTYPE int iar_fputc(int ch) #elif defined ( __CC_ARM ) || defined(__ARMCC_VERSION) /* ARM Compiler 5/6*/ #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #elif defined(__GNUC__) #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #endif /* __ICCARM__ */ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM6) { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); } } /* USER CODE END 0 */ /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_TIM_Base_Start_IT(&htim6); HAL_TIM_Base_Start(&htim6); printf("** Hello EEPW & DigiKey! Hello STM32H503! ** \n\r"); /* USER CODE END 2 */ /* USER CODE BEGIN 4 */ PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART3 and Loop until the end of transmission */ HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 0xFFFF); return ch; } /* USER CODE END 4 */
其他自动生成的代码我们都不用动,注意一点我们自己添加的代码一定要放在USER CODE内部,否则重新生成初始化的时候会被覆盖。通过上述我们添加的代码实现了LED以2Hz的频率闪烁(非阻塞方式),并通过串口可以收到串口上传的数据。
至此,基本作业完成。