【windows下基于Eclipse和GCC搭建stm32开发环境(5)】基于HAl库函数点亮led

新建工程文件夹:

新建文件夹的目的时存放我们自己编写的程序代码,因为要放C文件代码,所以我们要选择Source Folder而不能选择Folder,只是在工程 根目录 新建文件夹时需要选择Source Folder,子目录不需要

若根目录创建的文件夹只是存放.h头文件,则创建文件夹时选Source Folder或Folder都行

在这里插入图片描述

新建两个文件:led.h, led.c

可以在新建文件时选择路径,也可以新建到默认路径后拖拽到目标(app)路径下

在这里插入图片描述
在这里插入图片描述

led驱动代码:

在这里插入图片描述

#include "stm32f1xx.h"

void led_init(void)
{
    __HAL_RCC_GPIOB_CLK_ENABLE(); //开时钟

    GPIO_InitTypeDef  GPIO_InitStructure; //初始化结构体
    GPIO_InitStructure.Pin = GPIO_PIN_0; //LED驱动引脚
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出模式
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; //高速50M
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); //端口置1,先关个灯!

}

void delay_us(uint32_t time) //低端垃圾延时函数
{
    uint32_t i = 8 * time;
    while(i--);
}

void led_open(void) //LED灯闪烁程序
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
	delay_us(1000000);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
	delay_us(1000000);
}

为什么引用头文件stm32f1xx.h?

看下图,看一些HAL环境下的STM32头文件包含情况
在这里插入图片描述

led.h文件中声明led相关的函数:
在这里插入图片描述

在main.c中包含led.h头文件:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码写好开始编译:
在这里插入图片描述

编译错误分析:

发现有错误,提示找不到led.h,主要是因为led.h文件的路径没有包含到工程中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

下载程序到单片机中:

在这里插入图片描述
下载完成:
在这里插入图片描述
到这里并没有完成!!!虽然程序下载进去,LED灯也点亮了,但是是不是发现闪烁的频率很慢?

我代码里定的延时是1秒,然后实际7、8才闪烁一次,这是为啥呢?

这时候我们想到一个东西:时钟初始化!

在我们用Eclipse+GCC+GUN ARM插件创建STM32工程的时候,并没有关注时钟初始化的部分,既然用了HAL库,那么时钟初始化自动帮我们做了么?

答案是没有! 看下图:
在这里插入图片描述

找到硬件初始化:
在这里插入图片描述
在这里插入图片描述

找到系统时钟配置:
在这里插入图片描述
但是在这里我们看到一句注释://TODO:add clock inits !!

哦,明白了,原来时钟初始化函数是要自己实现了,原来我们一直用的内部时钟!是不是很扯淡!

系统时钟初始化:

好吧,那就上时钟初始化的代码:

/* 结构体初始化 */
	RCC_OscInitTypeDef RCC_OscInitStruct = {0};
	RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

	/** Initializes the CPU, AHB and APB busses clocks
	*/
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	/* RCC_OSCILLATORTYPE_HSI; //时钟源为HSI内部高速时钟  //RCC_OSCILLATORTYPE_HSE   高速外部时钟 */
	RCC_OscInitStruct.HSEState = RCC_HSE_ON;/* 打开HES */
	RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;/*  */
	RCC_OscInitStruct.HSIState = RCC_HSI_ON;/* 打开HSI */
	RCC_OscInitStruct.LSIState = RCC_LSI_ON;/* 打开LSI */
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;/* 打开PLL */
	RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;/* 设置PLL时钟源 */
	RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;/* PLL VCO输入时钟的倍频系数 */ // 9倍频,外部晶振8M, 8*9 = 72Mhz
	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)/* 初始化 */
	{
		//Error_Handler();
	}
	/** Initializes the CPU, AHB and APB busses clocks
	*/
	/* 选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2 */
	RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
							  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
	/* 设置系统时钟源 */
	RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	/* AHB分频系数 */
	RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB不分频,72MHz
	/* APB1分频系数 */
	RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; //APB1二分频 36MHz
	/* APB2分频系数 */
	RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //AHB不分频,72MHz
	/* 初始化并同时设置FLASH 的延迟周期 */
	if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
	{
		//Error_Handler();
	}

直接拷贝过去就好啦!!! 具体每一行代码,各位看注释吧,也好理解!

关于jlink如何配置下载程序到单片机,请移步:【windows下基于Eclipse和GCC搭建stm32开发环境(2)】hex和bin文件下载到单片机

结语:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a2529280665/article/details/121616897
————————————————

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flash张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值