赞
踩
哎,就说实话,就因为这几天一直在写那个课堂作业嘛,那个通过串口来控制电机调速的,给我学麻了(小声BB,proteus太难用啦),这不,趁热打铁一波,拿STM32的野火的MINI开发板来一波串口通信
咋串口通信呢?一发二收嘛,发是PC端进行发送吧?当然,STM32一样可以通过串口发送数据到我们的树莓派上
为了实现收发的功能那必然要有一条渠道吧,一般串口分为线接和无线串口,我们就不搞这么高级了,先TTL转串口试试,首先就是硬件的连接了
捞一下这个树莓派这一排排针都是些啥脚,这不,一眼望去就看见了TXD0和RXD0这两个玩意,分别为GPIO14和GPIO15,等等我们就是要用到这两个脚。
那STM32呢?先不着急怎么去接线..
在这之前我们先复习一下STM32的与PC端进行串口通信的操作(我这里使用的是野火的STM32F103RC的MINI板,HD版本)
STM32的与PC端进行串口通信的操作
关于STM32F103RCT6的TXD和RXD引脚汇总如下(共5路USART串口通信)
我们这里主要用到挂载在APB2总线上的USART1串口,分别为PA9和PA10两个io口
STM32F103RCT6芯片的串口GPIO 引脚 APB2总线 USART1 USART2 USART3 USART4 USART5 TX PA9 PA2 PB10 PC10 PC12 RX PA10 PA3 PB11 PC11 PD2
我们在这里用到的是USART1串口,可从系统结构图上看出USART1挂载在APB2总线上
(野火的代码风格确实很不错,但就是不太适合新手去看,宏有点多
/**
* @brief 主函数
* @param 无
* @retval 无
*/int main(void)
{
char ch;
/* LED GPIO 初始化 */
LED_GPIO_Config();
/* 初始化USART 配置模式为 115200 8-N-1 */
USART_Config();
while(1)
{
/* 获取字符指令 */
ch=getchar();
/* 根据字符指令控制RGB彩灯颜色 */
switch(ch)
{
case '1':
/*PC2口置低电平点亮LED*/
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
break;
case '2':
/*PC3口置低电平点亮LED*/
GPIO_ResetBits(GPIOC,GPIO_Pin_3);
break;
case '3':
/*PC2,PC3口置高电平熄灭LED*/
GPIO_SetBits(GPIOC,GPIO_Pin_2);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
break;
default:
break;
}
}
}
void USART_Config(void)
{
// 定义GPIO总线结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
// 定义串口初始化结构体变量
USART_InitTypeDef USART_InitStructure;// 打开串口GPIO的时钟(APB2总线上的GPIOA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 打开串口外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);// 将USART Tx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);// 将USART Rx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
// 配置串口的工作参数
// 配置波特率
USART_InitStructure.USART_BaudRate = 115200;
// 配置 针数据字长
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
// 配置停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
// 配置校验位
USART_InitStructure.USART_Parity = USART_Parity_No ;
// 配置硬件流控制
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
// 配置工作模式,收发一起
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
// 完成串口的初始化配置
USART_Init(USART1, &USART_InitStructure);
// 使能串口
USART_Cmd(USART1, ENABLE);
}
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/*调用库函数,初始化GPIO*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;/*调用库函数,初始化GPIO*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 关闭所有led灯 */
GPIO_SetBits(GPIOC, GPIO_Pin_2);
/* 关闭所有led灯 */
GPIO_SetBits(GPIOC, GPIO_Pin_3);
}烧录进入开发板中,可见左下角蓝色LED1亮起,输入字符2则LED2亮起,输入字符3则LED都熄灭
到此实现PC端与STM32通信控制IO口,讲一下这里面的一些小知识点:
推挽输出:可以输出高,低电平,连接数字器件。
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。
输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式可以把端口作为双向IO使用。
那么现在就来我们最终要实现的目的了
- 首先是硬件的连接
- 关于串口通信的接线,可能你们去看一下我之前的一篇文章会比较清楚:关于51单片机中串口通信的一些小笔记_衾许°的博客-CSDN博客
树莓派我使用的是Linux下的串口调试助手:minicom
打开树莓派终端配置设置sudo raspi-config
interfacing options→Serial→NO→YES→reboot打开/boot/config.txt文件,查找‘enable_uart=1’,若有,使其所在行内容与这一行完全相同。若无,在文档最后添加这一行
在terminal中输入sudo apt-get install minicom安装minicom串口调试助手
使用 minicom -s 指令(如果后续操作权限不足,把本指令改为sudo minicom -s再进行操作)→Serial port setup按下E 调整波特率校验位等与PC上的串口调试助手设置一致(低波特率数据传输受干扰相对小),否则传输的数据混乱(我这里STM32的代码设置波特率为115200)
硬件流控制(F)与软件流控制(我自己也不清楚为啥)(G)均调整为NO
回车保存,返回上一层,选择save setup as dfl(这一步可能出现权限不足,可以sudo为更高权限)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。