当前位置:首页 期刊杂志

基于STM32CubeMX的串口控制研究

时间:2024-05-04

潘苏皖,杨凯

(常州信息职业技术学院,江苏常州,213164)

0 简介

现如今,智能家电、智能手机等一系列智能设备的出现方便了人们的活动。尤其是将串口和蓝牙连接,可实现无线数据之间的信息交流。这样可以实现一台设备控制另一台设备。本文通过使用STM32CubeMX[1]软件,利用串口中断实现对LED的控制。

1 硬件平台

本文使用低功耗蓝牙开发板Cannon[2](如图1),以STM32F401RET6[3]为微控制器。为了清楚地知道LED是否由串口接收到的数据控制,因此需要看到数据的发送与接收。由于开发板没有USB转TTL模块,因此需要添加一个独立外接的USB转TTL模块。而本文使用的是CH340模块(如图2)。表1为串口和LED的芯片引脚连接图。

图1 Cannon开发板正面图

图2 CH340模块

表1 芯片串口和LED的芯片引脚连接图

2 应用开发设计

本文使用STM32CubeMX工具软件对串口进行基础配置。在打开的IRA环境中实现串口接收的数据对LED控制并发送信息确认是否真确。

■2.1 STM32CuBeMx配置

打开STM32CubeMx软件,选择STM32F401RET6芯片。然后在Pinout&Configuartion->SystemCore,选择 SYS中Debug的SerialWire进行下载配置;在Con nectivity,选择USART1,在MODE以及Parameter Settings选择Asynchronous,波特率为115200,字长为8位,无奇偶校验位,Date Direction为Receive and Tran smit模式并选择NVIC Settings中断使能实现串口串口模式以及中断配置;在NVIC中对中断优先级进行配置;在Pin out view下,选择PB3引脚为GPIO_Output模式,在SystemCore下选择GPIO进行初始化,将GPIO Output level下设置为高电平,其他为默认,GPIO配置如图3所示。

图3

最终引脚的效果图如图4所示。

选择EWSRM工具,生成工程文件。打开工程文件。

■2.2 软件设计

由于数据寄存器每次只能接收和发送9位,而一个字符为8位,因此串口每次接收和发送一个字符。但是在现实生活中正常情况是发送一串字符来进行设备的控制。因此在这里本文不使用STM32中HAL库中的封装函数。

这里需要设置一个flag标志,1为数据接收完毕,0为数据未接收或者是接收完毕。并且flag为哪种标志值时还要判断。本文使用' '为判断flag标志。在接收过程中,将每次接收到的一个字符放入数组SBUF_RX中,直到' '出现,将flag置1,并关闭接收中断使能。在flag=1下,进行对接收到的字符串进行判断,然后对LED进行控制,最后再次打开串口中断使能。步骤如下:

图4 芯片串口配置完成图

(1)进入中断,判断是否为接收中断;

(2)接收字符,将字符放入SUBF_RX数组中;

(3)判断是否为' '标志,是则置1,否则不执行;

(4)计数接收到字符的个数;

(5)如果flag=1,判断接收到的数据是否为LED控制;

(6)发送数据,回应是否控制LED。

■2.3 代码实现

(1)在main.c中设置全局变量:

uint16_t USART_RX_STA = 0 ;

uint8_t SBUF_RX[0x3FFF];

uint8_t flag = 0;

(2)在主函数里添加中断使能:

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);

(3)将stm32f1xx_it.c文 件 中void USART1_IRQHandler(void)放入main.c文件下,在中断函数中实现代码如下:

uint8_t ch ;

if(__HAL_UART_GET_FLAG( &huart1,UART_FLAG_RXNE ) != RESET)

{

ch=( uint16_t)READ_REG(huart1.Instance->DR);

SBUF_RX[RX_COUNT&0X3FFF]=ch;//接收到的字符保存在 USART_RX_BUF 数组中

if(SBUF_RX[RX_COUNT]== 0X0A && SBUF_RX[RX_COUNT-1]== 0X0D)//判断是否为' '

{

fl ag = 1; //置1

__HAL_UART_DISABLE_IT(&huart1,UART_IT_RXNE);//关闭接收中断

}

RX_COUNT++; //计数接收到的字符的个数

}

(4)在main.c 里while(1)中实现代码如下:

if(flag) //如果flag为1

{

flag = 0;//flag为0

if(StrCompare(SBUF_RX,“openL1”,RX_COUNT))//判断接收字符是否为打开LED

{

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET); //打开LED

HAL_UART_Transmit(&huart1,"L1 open",8,1000);//发送字符,查询方式

}

if(StrCompare(SBUF_RX,“closeL1”,RX_COUNT))

{

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET);//关闭LED

HAL_UART_Transmit(&huart1,"L1 close",9,1000);//发送字符,查询方式

}

HAL_UART_Transmit(&huart1,"USART1 ok",10,1000);//发送字符,查询方式

for(uint16_t i = 0; i

{

SBUF_RX[i]= 0;

}

RX_COUNT = 0; //计数为0

__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);//打开接收中断

}

StrCompare为字符串比较,用来判断接收到的字符是否和自己指定的字符相等,不相同返回0,相同返回1。代码如下:

uint8_t StrCompare(uint8_t *t,uint8_t *s,uint8_t m)

{

uint8_t i;

for(i = 0 ; i < m-2 ; i++)

{

if(t[i]!=s[i]) return 0;

}

return 1;

}

■2.4 运行程序

将程序下载开发板中,CH340模块与开发板相连插入电脑。打开串口助手。当发送“openL1 ”时,开发板L1灯将会点亮,开发板这时会发送数据到串口助手提示已点亮L1灯;当发送“closeL1 ”时,开发板L1将会关闭,开发板会发送数据到串口助手提示已熄灭L1灯。如图5所示,为串口助手运行的结果。

3 结论

通过实现串口对设备的控制,对STM32F4的串口有了进一步了解。实现字符串的串口接收和发送,需要对指针、数组、字符串等知识的灵活运用。而采用STM32CubeMX工具软件,则加速了实现项目的工作效率。

图5 串口调试结果

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!