2024年3月21日发(作者:雪吟怀)
基于
STM32CubeMX
的串口控制研究
潘苏皖
,
杨凯
(常州信息职业技术学院,江苏常州
,
213164)
基金项目
:
2017
年江苏省高等职业院校高水平骨干专业建设项目
(NO.2017GGZY03)
;
2020
年江苏省大学生创新创业训练计划项目
(NO.2Y)
。
摘要
:
本文釆用
STM32
的串口接收中断来对一串以特定字符结束的字符串进行判断并实现控制
,
在开发方式上基于当前最流行的
STM32CubeMX
平台
,
整个实现过程快捷高效
。
关键词
:
STM32CubeMX
;
串口
;
中断
;
字符串
0
简介
现如今
,
智能家电
、
智能手机等一系列智能设备的出现
方便了人们的活动
。
尤其是将串口和蓝牙连接
,
可实现无线
数据之间的信息交流
。
这样可以实现一台设备控制另一台设
备
。
本文通过使用
STM32CubeMX
[1]
软件
,
利用串口中断
并发送信息确认是否真确
。
■
2.1
STM32CuBeMx
配置
打开
STM32CubeMx
软件
,
选择
STM32F401RET6
芯
片
。然后在
Pinout&Configuartion->SystemCore,
选择
SYS
中
Debug
的
SerialWi佗进行下载配置
;
在
Con
nectivity,
实现对
LED
的控制
。
选择
USART1,
在
MODE
以及
Parameter
Settings
选择
Asynchronous,
波特率为
115200,
字长为
8
位,
无奇偶校
验位
,
Date
Direction
为
Receive
and
Tran
smit
模式并选择
1
硬件平台
本文使用低功耗蓝牙开发板
Cannon
121
(如图
1),
以
STM32F401RET6
131为微控制器
。
为了清楚地知道
LED
是否
NVIC
Settings
中断使能实现串口串口模式以及中断配置
;
在NVIC
中对中断优先级进行配置
;在
Pin
out
view
T,
选
择
PB3
引脚为
GPIO_Output模式
,
在
SystemCo
佗下选
由串口接收到的数据控制
,
因此需要看到数据的发送与接
收
。
由于开发板没有USB
转
TTL
模块
,因此需要添加一个
择
GPIO
进行初始化
,
将
GPIO
Output
level
下设置为高电
独立外接的
USB
转
TTL
模块。
而本文使用的是
CH340
模
块
如图
2
o
表
1
为串口和
LED
的芯片引脚连接图
。
平
,
其他为默认
,GPIO
配置如图
3
所示
。
图
3
最终引脚的效果图如图
4
所示
。
选择
EWSRM
工具
,
生成工程文件
。
打开工程文件
。
■
2.2
软件设计
由于数据寄存器每次只能接收和发送
9
位
,
而一个字
图
1
Cannon
开发板正面图
图
2
CH340
模块
符为
8
位
,
因此串口每次接收和发送一个字符
。
但是在现
实生活中正常情况是发送一串字符来进行设备的控制
。
因此
表
1
芯片串口和
LED
的芯片引脚连接图
USART1
LED
PB3
在这里本文不使用
STM32
中
HAL
库中的封装函数
。
这里需要设置一个
flag标志
,
1
为数据接收完毕
,
0
为
PA9
PA10
无
2
应用开发设计
本文使用
STM32CubeMX
工具软件对串口进行基础配
■o
在打开的
IRA
环境中实现串口接收的数据对
LED
控制
数据未接收或者是接收完毕
。
并且
flag
为哪种标志值时还
要判断
。
本文使用
'n'
为判断
flag
标志。
在接收过程中
,
将每次接收到的一个字符放入数组
SBUF_RX
中
,
直到
'n'
出现,
将flag
置
1,
并关闭接收中断使能
。
在
flag=l
T,
15
进行对接收到的字符串进行判断
,
然后对
LED进行控制
,
最后再次打开串口中断使能
。
步骤如下
:
一
亠
a-
-
S¥S_JTMS
»VDO
込
汕
-
-
s
USART1_RX
1
USART1
TX
乩
空
乩
邮
-
壬
弼
-
bl
d
d
d
d
S3
H
S3
3
却
一
图
4
芯片串口配置完成图
(1)
进入中断
,
判断是否为接收中断
;
(2)
接收字符
,
将字符放入
SUBF_RX
数组中
;
⑶判断是否为
'n'
标志
,
是则置
1,
否则不执行
;
(4)
计数接收到字符的个数
;
⑸如果
flag=l,
判断接收到的数据是否为
LED
控制
;
(6)
发送数据
,
回应是否控制
LED
。
■
2.3
代码实现
(1)
在
main.c
中设置全局变量
:
uintl6_t
USART_RX_STA
=
0;
uint8_tSBUF_RX[0x3FFF];
uint8_tflag
=
0;
(2)
在主函数里添加中断使能
:
_HAL_UART_ENABLE_IT(&huartl,UART_IT_RXNE);
(3)
将
stm32flxx_it.c
文件中
void
USART1_
IRQHandler(void)
放入
main.c文件下
,
在中断函数中实现
代码如下
:
uint8_tch
;
if(_HAL_UART_GET_FLAG(
&huartl,
UART_FLAG_
RXNE
)
!=
RESET)
{
ch=(
uintl6_t)READ_REG(ce->DR);
SBUF_RX[RX_COUNT&0X3FFF]=ch;
〃
接收到的字符
保存在
USART_RX_BUF
数组中
if(SBUF_RX[RX_COUNT]
==
OXOA
&&
SBUF_RX[RX_
COUNT-1]
==
OXOD)//
判断是否为
'n'
{
flag
=
l;
〃置
1
16
|
电子制作
2021
年
01
月
__HAL_UART_DISABLE_IT(&huartl,
UART_IT_
RXNE);//
关闭接收中断
}
RX_COUNT++;//
计数接收到的字符的个数
}
(4)
在
main.c
里
while(l)
中实现代码如下
:
if(flag)//
如果
flag
为
1
{
flag
=
O;//flag
为
0
if(StrCompare(SBUF_RX
,
"openLl"
,RX_
COUNT))//
判断接收字符是否为打开
LED
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,
GPIO_
PIN_RESET);
〃打开
LED
HAL_UART_Transmit(&huartl,"Ll
open",8,1000);//
发送字符
,
查询方式
}
if(StrCompa
佗
(SBUF_RX,
“
closeLl
”
,RX_COUNT))
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,
GPIO_
PIN_SET);//
关闭
LED
HAL_UART_Transmit(&huartl,"Ll
close",9,1000);//
发送字符
,
查询方式
}
HAL_UART_Transmit(&huartl,"USARTl
ok",
10,1000);//
发送字符
,
查询方式
for(uintl6_t
i
=
0;
i i++) // 清空数组 { SBUF_RX[i]=0; } RX_COUNT = 0; 〃计数为 0 __HAL_UART_ENABLE_IT(&huartl,UART_IT_ RXNE);// 打开接收中断 } StrCompa 佗为字符串比较 , 用来判断接收到的字符是 否和自己指定的字符相等 , 不相同返回 0, 相同返回 1 。 代 码如下 : uint8_t StrCompare(uint8_t * t , uint8_t * s ,uint8_t m) { uint8_ti; for(i = 0;i< m-2; i++) (下转第 43 页) 快速减少 ,最终在 200 轮左右几乎达到平衡 , 此时模型已 经能够拟合到数据 , 继续训练下去可能会带来过拟合 , 所以 值的不仅仅是房屋居住总面积这一个重量级特征 , 还有街道 名称 , 装修完整度等其他影响特征, 并且有些看起来不是很 重要的特征也能够影响房价 , 例如房屋类型功能等 。 数据帮 最终我们采用了 300 轮作为最终训练轮数 。 助我们筛选出重要的特征 , 排除了一些 “ 想当然 ” 的结果 , o 能够更好的抓住事情的本质 , 这就是大数据辅助我们解决生 UJ S W QC 活中的事情的实际例子 。 L5 二 殳 图 3 全连接训练过程 全连接在最终的预测中 , RMSE 达到了 0.09 。 ■ 3.2 实验结果 本文一共采用了两种方案来做房屋价格预测, 分别是随 机森林回归模型 , 深度学习全连接回归。 最终结果显示 , 使 用RMSE 作为衡量指标时 , 深度学习全连接方案优于随机 森林结果 , 说明全连接预测是一个很好的方案 。 4 研究结论与建议 通过本次房屋预测模型的建立 , 能够得到影响房屋总价 (上接第 16 页) if(t[i]!=s[i]) return 0; } return 1; } ■ 2.4 运行程序 将程序下载开发板中 ,CH340模块与开发板相连插入 电脑 。 打开串口助手 。 当发送 “ openLl'n ” 时 , 开发板 L1 灯将会点亮 , 开发板这时会发送数据到串口助手提示已点亮 L1 灯 ; 当发送 “ closeLl'n ” 时 , 开发板口将会关闭 , 开 发板会发送数据到串口助手提示已熄灭 L1 灯 。 如图 5 所示 , 为串口助手运行的结果 。 3 结论 通过实现串口对设备的控制 , 对 STM32F4 的串口有了 进一步了解 。 实现字符串的串口接收和发送 , 需要对指针 、 数组 、 字符串等知识的灵活运用 。 而采用 STM32CubeMX 工具软件 , 则加速了实现项目的工作效率 。 43 u o q e p 参考文献 * [1] Breiman L. Random forests [J]. Machine learning, 2001, 45(1):5-32. 0 50 100 150 Epochs 200 250 300 * [2] Boutilier C, Patrascu R, Poupart P, et al. Constraint-based optimization and utility elicitation using the minimax decision criterion[J]. Artificial Intelligence, 2006,170(8-9): 686-713. * ⑶李航 . 统计学习方法 [M]. 清华大学出版社 : 中国北京 ,2012:10. * [4] 周志华 . 机器学习 [M], 清华大学出版社:清华大学 ,2017:53. * [5] Thomas M. Cover, JoyA. Thomas. Elements of Infor mation Theory. 2006 * [6] Christopher . Pattern Recognition and Machine Learning. Springer-Verlag. 2006 * [7] Elliott D S, Voss H L. Delinquency and dropout[J]. 1974. 图 5 串口调试结果 参考文献 * [l]STM32Cube 初始化代码生成器 [EB/OL], . c om/zh/development-tools/. * [2] 小钢炮蓝牙开发板电路图 Cannon_V2_SCH[EB/OL], /view/.
2024年3月21日发(作者:雪吟怀)
基于
STM32CubeMX
的串口控制研究
潘苏皖
,
杨凯
(常州信息职业技术学院,江苏常州
,
213164)
基金项目
:
2017
年江苏省高等职业院校高水平骨干专业建设项目
(NO.2017GGZY03)
;
2020
年江苏省大学生创新创业训练计划项目
(NO.2Y)
。
摘要
:
本文釆用
STM32
的串口接收中断来对一串以特定字符结束的字符串进行判断并实现控制
,
在开发方式上基于当前最流行的
STM32CubeMX
平台
,
整个实现过程快捷高效
。
关键词
:
STM32CubeMX
;
串口
;
中断
;
字符串
0
简介
现如今
,
智能家电
、
智能手机等一系列智能设备的出现
方便了人们的活动
。
尤其是将串口和蓝牙连接
,
可实现无线
数据之间的信息交流
。
这样可以实现一台设备控制另一台设
备
。
本文通过使用
STM32CubeMX
[1]
软件
,
利用串口中断
并发送信息确认是否真确
。
■
2.1
STM32CuBeMx
配置
打开
STM32CubeMx
软件
,
选择
STM32F401RET6
芯
片
。然后在
Pinout&Configuartion->SystemCore,
选择
SYS
中
Debug
的
SerialWi佗进行下载配置
;
在
Con
nectivity,
实现对
LED
的控制
。
选择
USART1,
在
MODE
以及
Parameter
Settings
选择
Asynchronous,
波特率为
115200,
字长为
8
位,
无奇偶校
验位
,
Date
Direction
为
Receive
and
Tran
smit
模式并选择
1
硬件平台
本文使用低功耗蓝牙开发板
Cannon
121
(如图
1),
以
STM32F401RET6
131为微控制器
。
为了清楚地知道
LED
是否
NVIC
Settings
中断使能实现串口串口模式以及中断配置
;
在NVIC
中对中断优先级进行配置
;在
Pin
out
view
T,
选
择
PB3
引脚为
GPIO_Output模式
,
在
SystemCo
佗下选
由串口接收到的数据控制
,
因此需要看到数据的发送与接
收
。
由于开发板没有USB
转
TTL
模块
,因此需要添加一个
择
GPIO
进行初始化
,
将
GPIO
Output
level
下设置为高电
独立外接的
USB
转
TTL
模块。
而本文使用的是
CH340
模
块
如图
2
o
表
1
为串口和
LED
的芯片引脚连接图
。
平
,
其他为默认
,GPIO
配置如图
3
所示
。
图
3
最终引脚的效果图如图
4
所示
。
选择
EWSRM
工具
,
生成工程文件
。
打开工程文件
。
■
2.2
软件设计
由于数据寄存器每次只能接收和发送
9
位
,
而一个字
图
1
Cannon
开发板正面图
图
2
CH340
模块
符为
8
位
,
因此串口每次接收和发送一个字符
。
但是在现
实生活中正常情况是发送一串字符来进行设备的控制
。
因此
表
1
芯片串口和
LED
的芯片引脚连接图
USART1
LED
PB3
在这里本文不使用
STM32
中
HAL
库中的封装函数
。
这里需要设置一个
flag标志
,
1
为数据接收完毕
,
0
为
PA9
PA10
无
2
应用开发设计
本文使用
STM32CubeMX
工具软件对串口进行基础配
■o
在打开的
IRA
环境中实现串口接收的数据对
LED
控制
数据未接收或者是接收完毕
。
并且
flag
为哪种标志值时还
要判断
。
本文使用
'n'
为判断
flag
标志。
在接收过程中
,
将每次接收到的一个字符放入数组
SBUF_RX
中
,
直到
'n'
出现,
将flag
置
1,
并关闭接收中断使能
。
在
flag=l
T,
15
进行对接收到的字符串进行判断
,
然后对
LED进行控制
,
最后再次打开串口中断使能
。
步骤如下
:
一
亠
a-
-
S¥S_JTMS
»VDO
込
汕
-
-
s
USART1_RX
1
USART1
TX
乩
空
乩
邮
-
壬
弼
-
bl
d
d
d
d
S3
H
S3
3
却
一
图
4
芯片串口配置完成图
(1)
进入中断
,
判断是否为接收中断
;
(2)
接收字符
,
将字符放入
SUBF_RX
数组中
;
⑶判断是否为
'n'
标志
,
是则置
1,
否则不执行
;
(4)
计数接收到字符的个数
;
⑸如果
flag=l,
判断接收到的数据是否为
LED
控制
;
(6)
发送数据
,
回应是否控制
LED
。
■
2.3
代码实现
(1)
在
main.c
中设置全局变量
:
uintl6_t
USART_RX_STA
=
0;
uint8_tSBUF_RX[0x3FFF];
uint8_tflag
=
0;
(2)
在主函数里添加中断使能
:
_HAL_UART_ENABLE_IT(&huartl,UART_IT_RXNE);
(3)
将
stm32flxx_it.c
文件中
void
USART1_
IRQHandler(void)
放入
main.c文件下
,
在中断函数中实现
代码如下
:
uint8_tch
;
if(_HAL_UART_GET_FLAG(
&huartl,
UART_FLAG_
RXNE
)
!=
RESET)
{
ch=(
uintl6_t)READ_REG(ce->DR);
SBUF_RX[RX_COUNT&0X3FFF]=ch;
〃
接收到的字符
保存在
USART_RX_BUF
数组中
if(SBUF_RX[RX_COUNT]
==
OXOA
&&
SBUF_RX[RX_
COUNT-1]
==
OXOD)//
判断是否为
'n'
{
flag
=
l;
〃置
1
16
|
电子制作
2021
年
01
月
__HAL_UART_DISABLE_IT(&huartl,
UART_IT_
RXNE);//
关闭接收中断
}
RX_COUNT++;//
计数接收到的字符的个数
}
(4)
在
main.c
里
while(l)
中实现代码如下
:
if(flag)//
如果
flag
为
1
{
flag
=
O;//flag
为
0
if(StrCompare(SBUF_RX
,
"openLl"
,RX_
COUNT))//
判断接收字符是否为打开
LED
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,
GPIO_
PIN_RESET);
〃打开
LED
HAL_UART_Transmit(&huartl,"Ll
open",8,1000);//
发送字符
,
查询方式
}
if(StrCompa
佗
(SBUF_RX,
“
closeLl
”
,RX_COUNT))
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,
GPIO_
PIN_SET);//
关闭
LED
HAL_UART_Transmit(&huartl,"Ll
close",9,1000);//
发送字符
,
查询方式
}
HAL_UART_Transmit(&huartl,"USARTl
ok",
10,1000);//
发送字符
,
查询方式
for(uintl6_t
i
=
0;
i i++) // 清空数组 { SBUF_RX[i]=0; } RX_COUNT = 0; 〃计数为 0 __HAL_UART_ENABLE_IT(&huartl,UART_IT_ RXNE);// 打开接收中断 } StrCompa 佗为字符串比较 , 用来判断接收到的字符是 否和自己指定的字符相等 , 不相同返回 0, 相同返回 1 。 代 码如下 : uint8_t StrCompare(uint8_t * t , uint8_t * s ,uint8_t m) { uint8_ti; for(i = 0;i< m-2; i++) (下转第 43 页) 快速减少 ,最终在 200 轮左右几乎达到平衡 , 此时模型已 经能够拟合到数据 , 继续训练下去可能会带来过拟合 , 所以 值的不仅仅是房屋居住总面积这一个重量级特征 , 还有街道 名称 , 装修完整度等其他影响特征, 并且有些看起来不是很 重要的特征也能够影响房价 , 例如房屋类型功能等 。 数据帮 最终我们采用了 300 轮作为最终训练轮数 。 助我们筛选出重要的特征 , 排除了一些 “ 想当然 ” 的结果 , o 能够更好的抓住事情的本质 , 这就是大数据辅助我们解决生 UJ S W QC 活中的事情的实际例子 。 L5 二 殳 图 3 全连接训练过程 全连接在最终的预测中 , RMSE 达到了 0.09 。 ■ 3.2 实验结果 本文一共采用了两种方案来做房屋价格预测, 分别是随 机森林回归模型 , 深度学习全连接回归。 最终结果显示 , 使 用RMSE 作为衡量指标时 , 深度学习全连接方案优于随机 森林结果 , 说明全连接预测是一个很好的方案 。 4 研究结论与建议 通过本次房屋预测模型的建立 , 能够得到影响房屋总价 (上接第 16 页) if(t[i]!=s[i]) return 0; } return 1; } ■ 2.4 运行程序 将程序下载开发板中 ,CH340模块与开发板相连插入 电脑 。 打开串口助手 。 当发送 “ openLl'n ” 时 , 开发板 L1 灯将会点亮 , 开发板这时会发送数据到串口助手提示已点亮 L1 灯 ; 当发送 “ closeLl'n ” 时 , 开发板口将会关闭 , 开 发板会发送数据到串口助手提示已熄灭 L1 灯 。 如图 5 所示 , 为串口助手运行的结果 。 3 结论 通过实现串口对设备的控制 , 对 STM32F4 的串口有了 进一步了解 。 实现字符串的串口接收和发送 , 需要对指针 、 数组 、 字符串等知识的灵活运用 。 而采用 STM32CubeMX 工具软件 , 则加速了实现项目的工作效率 。 43 u o q e p 参考文献 * [1] Breiman L. Random forests [J]. Machine learning, 2001, 45(1):5-32. 0 50 100 150 Epochs 200 250 300 * [2] Boutilier C, Patrascu R, Poupart P, et al. Constraint-based optimization and utility elicitation using the minimax decision criterion[J]. Artificial Intelligence, 2006,170(8-9): 686-713. * ⑶李航 . 统计学习方法 [M]. 清华大学出版社 : 中国北京 ,2012:10. * [4] 周志华 . 机器学习 [M], 清华大学出版社:清华大学 ,2017:53. * [5] Thomas M. Cover, JoyA. Thomas. Elements of Infor mation Theory. 2006 * [6] Christopher . Pattern Recognition and Machine Learning. Springer-Verlag. 2006 * [7] Elliott D S, Voss H L. Delinquency and dropout[J]. 1974. 图 5 串口调试结果 参考文献 * [l]STM32Cube 初始化代码生成器 [EB/OL], . c om/zh/development-tools/. * [2] 小钢炮蓝牙开发板电路图 Cannon_V2_SCH[EB/OL], /view/.