STM32入门笔记——串口通信
Posted 若你遇见她
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32入门笔记——串口通信相关的知识,希望对你有一定的参考价值。
通信基础知识
我们常见的单片机常见的通讯方式有:UART、IIC、SPI等等。按照其特点可以做一下分类。(个人理解的方式、若要深究并不一定与其完全一致。)
1、工作方式
单工:只能单向传递信息。如接受端就只能接收,不能发送。
半双工:**可以双向通信,当是不能同时双向通信。**即同一时刻,一段只能接收或者发送。IIC
全双工:可以实现同时双向的通信。UART、ISP
2、通讯方式
串行通信:把一组数据拆分为一位一位的传递,所使用的引脚的数量少、速度慢。(USRT、IIC等)
**并行通信:**一次性发送一组数据,需要的引脚数量多,速度快。
3、内部时钟
**同步方式:**带有时钟 IIC、SPI
**异步方式:**不带时钟 UART
则可以知道UART属于串行通信的异步全双工模式
STM32的UART
1、UART基础知识
stm10系列的串口引脚和配置图如下
经常使用的函数
1、USART_Init() 初始化串口
2、USART_ReceiveData() 读取数据函数
3、USART_SendData() 发送数据函数
。。。。还有很多暂时知道这么多
函数入口参数可以 goto 其定义查看
2、操作步骤
3、实例代码
void USB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue; //声明GPIO结构体
USART_InitTypeDef USART_InitStrue; //声明串口结构体
NVIC_InitTypeDef NVIC_InitStrue; //声明中断结构体 NVIC_InitStrue这部分是自己命名
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIO时钟的使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //串口1的时钟使能
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP; //设置为复用推挽
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_9; //9号IO口
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //输出速率
GPIO_Init(GPIOA,&GPIO_InitStrue); //TX9的配置状态
GPIO_InitStrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_10; //10号IO
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_10MHz; //输出速率
GPIO_Init(GPIOA,&GPIO_InitStrue); //RX10的配置
USART_InitStrue.USART_BaudRate = 115200; //波特率设置为115200
USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制
USART_InitStrue.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //收发模式都使能
USART_InitStrue.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStrue.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStrue.USART_WordLength = USART_WordLength_8b; //字长为8
USART_Init(USART1,&USART_InitStrue); //调用其Init函数
USART_Cmd(USART1,ENABLE ); //中断使能,确定端口,
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
//中断模式。这里是接受中断,其他中断模式查阅其定义和参考手册
NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn; //指出通道 ,这里是串口一的通道
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE; //开启中断通道
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; //设置抢占优先级,注意选择的模式,即抢占优先级最大位
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_Init(&NVIC_InitStrue); //调用NVIC_INIT函数,将我们定义的结构体地址作为入口参数
}
void USART1_IRQHandler(void) **//只能使用这个函数名,具体查看STM32踩坑笔记**:
{
u8 data; //定义变量存储读取到的数据
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)) //判断中断是不是我们之前设置的中断,如果是值为1
{
data = USART_ReceiveData(USART1); //读取串口函数,并将其赋值
USART_SendData(USART1,data); //将读取到的数据发送出去
}
主函数
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //在中断函数前就要调用
//2号分组,两位抢占优先级,两位响应优先级,其他具体分组查看参考手册
USB_Init();
while(1);
}
//关于指明中断的通道,详情见STM32F10x.h文件开头
其他中断服务函数入口参数(如GPIO的中断服务函数),参考以下文件
代码讲解:改代码实现的作用是使用串口与电脑通信,当电脑向发版发送数据就进入中断,让开发板将收到的数据发送回电脑。
敲黑板:1、对其GPIO使能后还需要对其串口使能,即需要使能两次。
2、中断部分,如果没有中断需要就可以不做配置
4、稀碎寄存器知识
1、u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记 在程序末尾必须手动置0
这里可以参考大佬文章:https://blog.csdn.net/JackCrum/article/details/99864683
可以通过USART_RX_BUF来按位读取接收到的字符
eg: s=USART_RX_BUF[0]-‘0’; 末尾减去这个’0‘的用法我还没摸透。百度好多也没有。
个人使用总结如下:
当串口返回值需要提取后再发送到电脑时。若要保证数据正常,正常必须去掉-’0‘
当该值是需要取出来做其他操作:数值运算就必须带上-’0‘,字符比较时就要去掉。
2、len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度
3、USART_GetFlagStatus(USART1,USART_FLAG_TC) TC中断,用于判断寄存器数据是否发送完毕。
以上是关于STM32入门笔记——串口通信的主要内容,如果未能解决你的问题,请参考以下文章
STM32学习笔记 二基于STM32F103C8T6和STM32CubeMX实现UART串口通信数据收发