潘苏皖,杨凯
(常州信息职业技术学院,江苏常州,213164)
现如今,智能家电、智能手机等一系列智能设备的出现方便了人们的活动。尤其是将串口和蓝牙连接,可实现无线数据之间的信息交流。这样可以实现一台设备控制另一台设备。本文通过使用STM32CubeMX[1]软件,利用串口中断实现对LED的控制。
本文使用低功耗蓝牙开发板Cannon[2](如图1),以STM32F401RET6[3]为微控制器。为了清楚地知道LED是否由串口接收到的数据控制,因此需要看到数据的发送与接收。由于开发板没有USB转TTL模块,因此需要添加一个独立外接的USB转TTL模块。而本文使用的是CH340模块(如图2)。表1为串口和LED的芯片引脚连接图。
图1 Cannon开发板正面图
图2 CH340模块
表1 芯片串口和LED的芯片引脚连接图
本文使用STM32CubeMX工具软件对串口进行基础配置。在打开的IRA环境中实现串口接收的数据对LED控制并发送信息确认是否真确。
打开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工具,生成工程文件。打开工程文件。
由于数据寄存器每次只能接收和发送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。
(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; } 将程序下载开发板中,CH340模块与开发板相连插入电脑。打开串口助手。当发送“openL1
”时,开发板L1灯将会点亮,开发板这时会发送数据到串口助手提示已点亮L1灯;当发送“closeL1
”时,开发板L1将会关闭,开发板会发送数据到串口助手提示已熄灭L1灯。如图5所示,为串口助手运行的结果。 通过实现串口对设备的控制,对STM32F4的串口有了进一步了解。实现字符串的串口接收和发送,需要对指针、数组、字符串等知识的灵活运用。而采用STM32CubeMX工具软件,则加速了实现项目的工作效率。 图5 串口调试结果■2.4 运行程序
3 结论