前缀: 之前一直在使用标准库开发F0与F1,收到NUCLEO-L476RG之后,看到好像没有了标准库的支持了,顿时头就大了。因为鹰文不好,每次为了一些小细节查参数,都要很吃力的逐句翻译,挺怕的~~~~前些天F0用到了多个定时器,发现TIM14设置的参数不起作用了,找了2天的错误都找不到。单独测试定时器程序,都是正常运行的,可是加到一个程序中,就运行不正常了。于是~~心里又想试试CUBE产生初始代码,用HAL库开发。虽然之前安装了几遍CUBE,又卸载了几遍,虽然一看因鹰文资料头就大~~~还是要逐渐的转到HAL来开发~~~~这里真的希望STM中国尽快将HAL库使用的中文说明翻译出来~~~~~~~~~~~~~ 首先说明这个系列的帖子是给像我一样不太熟悉鹰文的人并且学的半斤八两的人的一个参考,也欢迎老鸟门和英文高手来指导指导错误哦。 下面开始: CUBE是ST公司新出的代码初始化软件,可以非常方便快速的配置IO和各种外设,使用也非常方便。今天我们利用系统SysTick定时器和系统里自带的延时函数来使用户LED灯精确的每隔1秒闪烁一次,相对比较简单,首先新建项目,就会跳出选型界面,如下: 这里我们如上图一样选择Board Selectore→NUCLEO64→STML4,并在小窗口中选择→NUCLEO64并在小窗口中选择RG,点OK。进入编辑界面: 因为今天我们只要用到用户LED的IO(查Nucleo板用户手册,我们知道PA5控制着LD2--即用户LED,如下图),所以我只要配置上图中的PA5。 配置起来也很简单,只要在Pinout窗口中左键单击PA5,然后在弹出菜单中选择GPIO_Output就好,如下图 接下来具体配置IO的参数。在Configuration窗口,点击右侧GPIO选项,跳出配置界面,按下图配置: 那么今天用到的基本就配置完了,但是还有一个最重要的我们没有配置,那就是系统时钟。这里因为NUCLEO-L476RG板子没有焊接外部晶振,我们只能使用内部晶振,选择高速的HSI,就好了,还可以改变系统运行速度,如下图: 到此就全配置好了。接着我们生成初始代码,点击Project→ Generate Code,弹出保存对话框,按下图填写: 少许等待后,就自动生成了代码。这里我们需要LED每隔1秒闪烁1次,我们利用系统SysTick定时器和系统里自带的延时函数来编程。我们打开stm32l4xx_hal.c,找到如下代码: /** * @brief Provide accurate delay (in milliseconds) based on variable incremented. * @note In the default implementation , SysTick timer is the source of time base. * It is used to generate interrupts at regular time intervals where uwTick * is incremented. * @note This function is declared as __weak to be overwritten in case of other * implementations in user file. * @param Delay: specifies the delay time length, in milliseconds. * @retval None */ __weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = 0; tickstart = HAL_GetTick(); while((HAL_GetTick() - tickstart) < Delay) { } } 上面的大概说明,是说这个延时函数的延时时间是MS,就是说我们要延时一秒,就要1000次。我们填写如下:HAL_Delay(1000); 另外在主函数中我们加入如下代码: /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); //让LED灯亮起来 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); //让LED灯翻转 HAL_Delay(1000); //延时1秒 /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 我们将工程编译后下载到NUCLEO-L476RG板中,发现LED灯按照我们预先的设定,精确的每隔一秒闪烁一次。下面附上代码 |
我其实也是边学边写,后续慢慢来~~