先点赞,再看博客,顺便点个关注鼓励一下。
如果文章看完,觉得不错的话可以点个收藏,日后不迷路。
STM32CubeMX 实战教程 基于正点原子 STM32F1 精英板(STM32F103ZET6)平台,旨在通过对板载资源的使用将各种外设的配置方法讲述清楚。更多教程请订阅 [专栏]STM32CubeMX 。
本教程是 STM32CubeMX 实战教程中的第二篇,主要通过配置 SysTick 定时器实现 ms 级延时函数,将 STM32CubeMX SysTick 的配置方法讲述清楚。
系统版本:Windows 10 专业版 64 位
软件版本:STM32CubeMX V6.0.0 ( STM32CubeMX 下载及安装教程 )
硬件平台:正点原子 STM32F1 精英板
编译环境:MDK_ARM V5.29 ( MDK_ARM 下载及安装教程 )
调试工具:ST-LINK/V2
将上一节的 GPIO_Test 的项目另存作为 SysTick_Test 的项目初始模板。
工程模板修改及项目导入,请参考:STM32CubeMX 实战教程:LED 灯、蜂鸣器、按键输入实验。这里就不重复了,项目目录如下:
SysTick Timer 的时钟默认是系统时钟(即 72MHz),这里我们使用 8 分频(即 72/8 = 9MHz)。
项目管理配置及生成代码请参考:STM32CubeMX 实战教程:新建项目和生成 MDK_ARM 工程、STM32CubeMX 项目配置窗口介绍(一)、STM32CubeMX 项目配置窗口介绍(二)。
点击 GENERATE CODE 生成代码。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* System interrupt init*/
/** NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST
*/
LL_GPIO_AF_Remap_SWJ_NONJTRST();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | // SysTick Timer clock source = HCLK_DIV8 (HCLK/8 = 9MHz)
SysTick_CTRL_TICKINT_Msk; // SysTick Timer ENABLE | SysTick Timer Interrupt ENABLE
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LL_RCC_GetSystemClocksFreq(&get_rcc_clock);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(LL_GPIO_IsInputPinSet(KEY_UP_GPIO_Port, KEY_UP_Pin) == 1 ) // KEY_UP Press
{
LL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); // Toggle BEEP Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); // Toggle BEEP Pin Level OFF 1800ms
LL_mDelay(1800);
}
else
{
LL_GPIO_ResetOutputPin(BEEP_GPIO_Port, BEEP_Pin); // BEEP OFF
}
if(LL_GPIO_IsInputPinSet(KEY0_GPIO_Port, KEY0_Pin) == 1 ) // KEY0 UnPress
{
LL_GPIO_SetOutputPin(DS0_GPIO_Port, DS0_Pin); // DS0 OFF
}
else
{
LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin); // Toggle DS0 Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin); // Toggle DS0 Pin Level OFF 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin); // Toggle DS0 Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS0_GPIO_Port, DS0_Pin); // Toggle DS0 Pin Level OFF 1400ms
LL_mDelay(1400);
}
if(LL_GPIO_IsInputPinSet(KEY1_GPIO_Port, KEY1_Pin) == 1 ) // KEY1 UnPress
{
LL_GPIO_SetOutputPin(DS1_GPIO_Port, DS1_Pin); // DS1 OFF
}
else
{
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level OFF 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level OFF 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level ON 200ms
LL_mDelay(200);
LL_GPIO_TogglePin(DS1_GPIO_Port, DS1_Pin); // Toggle DS1 Pin Level OFF 1000ms
LL_mDelay(1000);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
Steps | 操作 | 正常现象 | 备注 |
---|---|---|---|
1 | 按下 KEY_UP 按键,不放 | 蜂鸣器 2s 响 1 次 | - |
2 | 按下 KEY0 按键,不放 | DS0 LED 2s 亮 2 次 | - |
3 | 按下 KEY1 按键,不放 | DS1 LED 2s 亮 3 次 | - |
可使用示波器测试相关引脚输出波形,检测定时器配置是否正常。
本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途, 禁止商用, 转载或公开使用请联系作者授权。
此教程由本人独立整理,如有不当之处,欢迎指正。
STM32Cube 系列软件教程总目录请参考文章:STM32Cube 生态系统之网站、视频、文档及教程汇总 。
该文章还提供: