新建工程文件夹:
新建文件夹的目的时存放我们自己编写的程序代码,因为要放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
————————————————