【HAL库】HAL库STM32cubemx快速使用

这篇具有很好参考价值的文章主要介绍了【HAL库】HAL库STM32cubemx快速使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

整体框图

【HAL库】HAL库STM32cubemx快速使用

软件:keil5、STM32Cubemx
硬件:淘宝的STM32F103C8T6最小系统

一、基础工程

1 新建工程

【HAL库】HAL库STM32cubemx快速使用

【HAL库】HAL库STM32cubemx快速使用

2 配置RCC

选择外部时钟源。

【HAL库】HAL库STM32cubemx快速使用

设置外部晶振输入值,我这块板子是8M。
然后手动输入最大时钟频率,然后回车让他自动配置时钟树。我这块板子是72M。

【HAL库】HAL库STM32cubemx快速使用

3 配置SYS

我的下载器是SWD两根线的,所以我选这个。(一定配置完下载模式再进行程序下载,不然单片机变砖,需要从串口下载进行恢复)

【HAL库】HAL库STM32cubemx快速使用

4 工程设置

【HAL库】HAL库STM32cubemx快速使用

【HAL库】HAL库STM32cubemx快速使用

5 生成代码

点击生成代码

【HAL库】HAL库STM32cubemx快速使用

打开keil工程

【HAL库】HAL库STM32cubemx快速使用

6 keil设置下载&复位

选择下载器类型,我用的是DAP。点击后面的Setting。

【HAL库】HAL库STM32cubemx快速使用

进入后勾选自动复位,表现为每次下载程序后单片机自动复位运行程序。
设置完点击OK。

【HAL库】HAL库STM32cubemx快速使用

二、必备外设

1 目录规范

在工程目录下,新建一个ICODE文件夹,用于存放自己写的各种外设文件。

【HAL库】HAL库STM32cubemx快速使用

2 LED

1 导入.c.h文件(就是将.c.h文件导入keil工程,后面不再叙述此环节)

将之前写好的 LED文件夹复制到本工程的ICODE目录下。
里边有led.c led.h文件夹。

【HAL库】HAL库STM32cubemx快速使用

在工程中,创建ICODE文件夹,添加led.c文件。

【HAL库】HAL库STM32cubemx快速使用

在工程中,添加led.h文件。

【HAL库】HAL库STM32cubemx快速使用

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

配置板子LED引脚,推挽输出模式。我这块板子是 PC13。
重新生成代码。

【HAL库】HAL库STM32cubemx快速使用

3 修改 .h 文件

更改为其他引脚,只需更改LED端口号和引脚PIN。我这块板子是PC13。

【HAL库】HAL库STM32cubemx快速使用

4 测试

在main.c中添加 #include “led.h”
在while里添加下面代码。LED灯闪烁。

LED_Contrary();
HAL_Delay(500);//500ms

2 RTC

1 导入.c.h文件(不再赘述,详细见LED部分)

2 Cubemx配置

和PC13冲突,核心板PC13是LED,所以禁用RTC OUT。

【HAL库】HAL库STM32cubemx快速使用

3 修改 .c 文件

在中断.c里,填加led头文件,在RTC中断函数里,加入500ms,LED电平反转函数。

#include "led.h"

static uint16_t rtccnt=0;
rtccnt++;
if(rtccnt>500) rtccnt=0,LED_Contrary();

【HAL库】HAL库STM32cubemx快速使用

4 测试

LED闪烁。

3 USART

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

【HAL库】HAL库STM32cubemx快速使用

勾选使用

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

使用串口1,波特率默认,异步通信。

【HAL库】HAL库STM32cubemx快速使用
开启中断
【HAL库】HAL库STM32cubemx快速使用

3 修改 .h 文件

代码默认使用串口1。添加其他串口可以在.h里,复制,改名。

【HAL库】HAL库STM32cubemx快速使用

4 测试

串口发送/接收函数:

HAL_UART_Transmit();串口发送数据,使用超时管理机制 
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送  
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收

串口中断函数:

HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
HAL_UART_ErrorCallback();串口接收错误函数

常用的发送函数为:HAL_UART_Transmit();

常用的接收函数为:HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

HAL库串口中断调用流程:

【HAL库】HAL库STM32cubemx快速使用

发送:

1 printf重映射:

/* printf重映射 */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    //具体哪个串口可以更改huart1为其它串口
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1 , 0xffff);
    return ch;
}

2 printf发送:

printf("hello \r\n"); //发送字符串

float Data=1.11;
printf("Data=%.2f \r\n",Data);	//发送变量

3 Hal库自带发送函数:

#include <stdio.h>

HAL_UART_Transmit(&huart1,"hello\r\n",sizeof("hello\r\n"),0xffff);//发送字符串

uint8_t Data1[]={"hello\r\n"};
HAL_UART_Transmit(&huart1,Data1,sizeof(Data1),0xffff);//发送字符串

uint8_t Databuffer[20]={0};
float Data=1.11;
sprintf(Databuffer,"Data=%.2f \r\n",Data);
HAL_UART_Transmit(&huart1,Databuffer,strlen(Databuffer),0xffff);//发送变量 用strlen

中断接收:

1 定长

 /*	
		串口接收中断
		定长接收	
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart == &huart1)
		{
			HAL_UART_Transmit(&huart1,(uint8_t *)&Uart1_RxData,1,0xffff);//原样返回
			while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
			HAL_UART_Receive_IT(&huart1,(uint8_t *)&Uart1_RxData, 1); //&取地址
		}
}

2 不定长

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
	
	if(huart == &huart1)
	{
		if(Uart1_Rx_Cnt >= 255)  //溢出判断
		{
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuffer,0x00,sizeof(Uart1_RxBuffer));
			HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); 	
		}
		else
		{
			Uart1_RxBuffer[Uart1_Rx_Cnt++] = Uart1_RxData;   //接收数据转存
		
			if((Uart1_RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位\r\n。0x0D是\r,0x0A是\n
			{
				/*	此处添加用户代码	*/

				HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
				while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束

				/*	此处添加用户代码	*/
				Uart1_Rx_Cnt = 0;
				memset(Uart1_RxBuffer,0x00,sizeof(Uart1_RxBuffer)); //清空数组
			}
		}
		HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1_RxData, 1);   //再开启接收中断
	}
}

4 KEY

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

2 Cubemx配置

3 修改 .h 文件

4 测试

三、其他外设

1 OLED(模拟IIC、模拟SPI)

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。选择IIC的或者SPI的。(模拟IIC和模拟SPI)

【HAL库】HAL库STM32cubemx快速使用

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

任选对应OLED引脚个数的GPIO,设置成推挽输出。设置为高速。

【HAL库】HAL库STM32cubemx快速使用

3 修改 .h 文件

更改为其他引脚,只需更改OLED端口号和引脚PIN

【HAL库】HAL库STM32cubemx快速使用

4 测试

OLED 显示字体大小 16*16 最合适。能放4行:0 16 32 48。

添加头文件

#include "oled.h"

添加初始化

OLED_Init();
OLED_ColorTurn(0);			//0正常显示,1 反色显示
OLED_DisplayTurn(0);		//0正常显示 1 屏幕翻转显示

1 显示字符:

OLED_ShowString(0,0,"hello",16,1); 
OLED_Refresh();//更新0

2 显示变量:

uint8_t Databuffer[20]={0};
float Data=1.11;
sprintf(Databuffer,"Data=%.2f \r\n",Data);//sprintf
OLED_ShowString(0,16,Databuffer,16,1);  
OLED_Refresh();

3 显示中文:


【HAL库】HAL库STM32cubemx快速使用

2 BH1750光强检测

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

2 Cubemx配置

3 修改 .h 文件

4 测试

添加头文件

添加初始化

3 MQ2烟雾检测

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

随意选一个ADC引脚。初始化ADC引脚。

3 修改 .h 文件

4 测试

添加头文件

#include "mq2.h"

采集

uint16_t MQ2_DATA=0;
MQ2_DATA = GetMQ4Value();

3 MQ4甲醛检测

同MQ2,AD读取。

浓度转化函数:

uint16_t GetMQ4Value(void)
{
			uint16_t ADCVal;
			float Voltage;
			uint16_t ppm;
			HAL_ADC_Start(&hadc1);//开始ADC采集
			HAL_ADC_PollForConversion(&hadc1,500);//等待采集结束
			if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
			{
				ADCVal =  HAL_ADC_GetValue(&hadc1);//读出ADC数值
			}
			Voltage = ADCVal * 3.3 / 4096;
	//无天然气的环境下,实测AOUT端的电压为0.5V,当检测到天然气时,电压每升高0.1V,实际被测气体浓度增加200ppm
			ppm = (Voltage - 0.5) / 0.1 * 200;
			return ppm;
			//return ADCVal;
}

4 DHT11温湿度

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4kFUCvSv-1681004471418)(null)]

2 Cubemx配置

任选一个IO口,配置为高速,推挽输出。

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

随意选择一个IO口。配置为推挽输出,高速。

3 修改 .h 文件

定义DHT11总线连接的GPIO端口, 只需要修改下面2行代码即可任意改变DATA的引脚

【HAL库】HAL库STM32cubemx快速使用

4 测试

添加头文件

#include "dht11.h"

添加初始化

DHT11_Init();						//DHT11温湿模块初始化

读取温湿度

uint8_t DHT11_DATA[2]={0};		//用于存放DHT11温湿度数据
DHT11_ReadData(DHT11_BUF);		//读出DHT11传感器数据(参数是存放数据的数组指针)
printf("湿度:%2d% 温度:%2d℃\r\n",DHT11_BUF[0],DHT11_BUF[1]);//串口打印湿度温度

5 SIM900A GSM模块

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

2 Cubemx配置

3 修改 .h 文件

4 测试

添加头文件

添加初始化

6 BMP180气压传感器

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

采用模拟IIC,任意选两个io口设置为推挽输出模式。我这边选B7 B6。

配置串口1,重映射printf。

cubemx基本工程和配置看:【HAL库】HAL库STM32cubemx快速使用

3 修改 .h 文件

只需要修改下面2行代码即可任意改变引脚

【HAL库】HAL库STM32cubemx快速使用

4 测试

添加头文件

#include "bmp1801.h"

添加初始化

BMP_Init();				  //BMP180初始化
BMP_ReadCalibrationData();//BMP180初始化

读取

uint8_t ID = 0;		//BMP180器件号
ID = BMP_ReadOneByte(0xd0);	//读取设备ID
BMP_UncompemstatedToTrue();	//读取气压值
printf("ID = %d\t  temp = %d.%dC\t   Pressure = %.2fkPa\t   Altitude = %.5fm\r\n",ID,bmp180.Temp/10,bmp180.Temp%10,(float)bmp180.p/1000.0,bmp180.altitude);
HAL_Delay(500);

【HAL库】HAL库STM32cubemx快速使用

7 ESP8266+Onenet+HTTP

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

2 Cubemx配置

3 修改 .h 文件

4 测试

添加头文件

添加初始化

8 ESP8266+Onenet+MQTT

1 导入.c.h文件(不再赘述,详细见LED部分)

在keil工程中导入之前写好的.c.h文件。

【HAL库】HAL库STM32cubemx快速使用

2 Cubemx配置

串口1用于调试,串口3用于ESP8266通信,打开中断。

基础的我就不配置了,可以看前面的详细讲解。

3 修改 .c.h 文件

移植时要修改的地方:

1 改所用串口

发送部分:在esp8266.c里,将huart3全部替换为要修改的串口号,比如串口2。

【HAL库】HAL库STM32cubemx快速使用

接收部分:用串口中断接收esp8266发来的消息。随便在哪个文件夹填加串口回调函数,我个人是之前专门建了个uart.c文件放串口相关的所有代码。

加入下面的代码(串口号根据个人情况修改)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart3)//esp8266接收云平台数据
		{
			if(esp8266_cnt >= sizeof(esp8266_buf))
			{            
				esp8266_cnt = 0; //防止串口被刷爆
			}
			esp8266_buf[esp8266_cnt++] = Uart3_RxData;

			HAL_UART_Receive_IT(&huart3,(uint8_t *)&Uart3_RxData, 1); //&取地址
		}
}

2 改wifi名字和密码

【HAL库】HAL库STM32cubemx快速使用

3 改产品ID、设备ID、鉴权信息。

【HAL库】HAL库STM32cubemx快速使用

4 测试

添加头文件

#include "onenet.h"
#include "esp8266.h"

添加初始化

别忘了开串口中断。

HAL_UART_Receive_IT(&huart3,(uint8_t *)&Uart3_RxData, 1);//开启串口中断
/* esp8266连接wifi+连接Onenet */
HAL_Delay(2000);
ESP8266_Init();					//初始化ESP8266,连接wifi
HAL_Delay(2000);
while(OneNet_DevLink())			//连接OneNET
HAL_Delay(2000);

连接成功的话,onenet会显示设备在线。串口也会打印成功。

【HAL库】HAL库STM32cubemx快速使用

【HAL库】HAL库STM32cubemx快速使用

发送数据

OneNet_SendData();	//发送数据
ESP8266_Clear();	//清空数据缓存区
HAL_Delay(3000);	//3s发送一次

【HAL库】HAL库STM32cubemx快速使用

要发什么数据,在这里改:

【HAL库】HAL库STM32cubemx快速使用

接收数据文章来源地址https://www.toymoban.com/news/detail-419731.html

dataPtr = ESP8266_GetIPD(0);//获取平台返回的数据
if(dataPtr != NULL)//如果返回数据不为空
	OneNet_RevPro(dataPtr);//平台返回数据检测

到了这里,关于【HAL库】HAL库STM32cubemx快速使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2018年电赛A题 软件部分 STM32 FFT 时域到频域 STM32cubeMX HAL

    题目要求:任意波信号发生器输出非正弦信号时,基波频率范围为50Hz~200Hz,测量电流信号基波频率,频率测量精度优于1%;测量基波及各次谐波分量的幅度(振幅值),电流谐波测量频率不超过1kHz,测量精度优于5% 。 实现方式:利用STM32单片机内置ADC对待测信号进行采集,

    2024年02月15日
    浏览(90)
  • STM32学习·HAL库·STM32CubeMX系列学习(安装和使用)

    目录 ​编辑 1.  STM32CubeMX简介 2.  STM32CubeMX安装 2.1  STM32CubeMX软件获取 2.1.1  获取Java软件 2.1.2  STM32CubeMX软件获取 2.2  搭建Java运行环境 2.3  安装STM32CubeMX软件 2.4  下载和关联STM32cube固件包         STM32CubeMX 是 ST 微电子公司推出的一款图形化配置工具,用于快速启动

    2024年02月19日
    浏览(53)
  • STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面写了串口通信的理论知识,在这一篇中将讲述串口通信在STM32CubeMx里面的配置,以及在函数里面怎么使用。 对于串口发送信息,分为三种方法: 串口阻塞方式收发 、 串口中断方式收发 、 串口DMA方式收发 。(DMA方式在之后的DMA章节讲解) 关于STM32CubeMx的基

    2024年02月06日
    浏览(74)
  • STM32 CAN/CANFD软件快速配置(HAL库版本)

    控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他

    2024年02月09日
    浏览(40)
  • STM32CubeMX+Keil5新建工程

    STM32CubeMx 软件是 ST 公司为 STM32 系列单片机快速建立工程,并快速初始化使用到的外设、GPIO 等,大大缩短了我们的开发时间。简单地说STM32CubeMX 本身就是一个工具软件,我们只要在上面通过图形化配置就可以生成STM32 功能代码工程,这样节省我们的工作量。在之前没有用这个

    2024年01月19日
    浏览(128)
  • STM32初识---Keil5和CubeMX

    今天开始,学习比52更复杂的STM32系列单片机: 使用之前的Keil4写STM32代码其实也可以,但需要比较复杂的设置,而如果用Keil5会比较方便。 (这里在打开POJIE软件的时候总是会报错“ 无法成功完成操作 因为文件包含病毒或潜在的垃圾软件\\\",因此参考了这篇博文解决Win11“无法

    2024年02月06日
    浏览(44)
  • 基于CubeMX(hal库)stm32中hrtim高分辨率定时器的基本使用(自存)

    1、选通道 单通道输出or双通道输出 2、Timer A~F配置 (Master Timer不用管) 比较值Compare 个人感觉跟CCR差不多的意思, 注意不要大于上面的Period就行 设置上升沿和下降沿时间: 若想让上设Compare=CCR 如图设置 即可 即在 计数到Compare1时拉低,计数溢出时拉高 所以上图输出频率10kHz占

    2024年02月04日
    浏览(56)
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装 | 新建STM32CubeMX工程步骤

      STM32CubeMX是ST开发的一款图形配置工具,可通过配置自动生成 初始化代码 (并不包括逻辑代码)。以下是STM32CubeMX官方宣传图片,适用于Windows和macOS系统,用于生成初始化代码,一个图形配置工具,搭配不同系列的STM32Cube固件包,即可支持不同系列的STM32芯片,初始化代码

    2024年02月17日
    浏览(64)
  • STM32 HAL库 STM32CubeMX -- SPI

    SPI (Serial Peripheral Interface)协议,即串行外围设备接口,是一种高速全双工的通信总线。 它被广泛地使用在ADC、LCD 等设备与MCU 间,要求通讯速率较高的场合。 SPI 通讯使用3 条总线及片选线, 3 条总线分别为SCK、MOSI、MISO,片选线为SS(CS) ,它们的作用介绍如下: (1) SS( Slav

    2024年02月13日
    浏览(53)
  • STM32 HAL库 STM32CubeMx -- 外部中断

    中断,是指处理机处理程序运行中出现的紧急事件的整个过程。程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件,处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序

    2024年02月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包