目录
一、更新时间
2022.1.23
二、相关器件
stm32f103c8t6最小系统板,CH340。
三、硬件连接
PA9与PA10。
四、现象与事件
接收电脑发送的数据,再发回给电脑。
五、具体操作:
UART(通用异步收发器)为异步通讯(无时钟),所以要双方约定好波特率。需要定义的参数如下:
1.起始位;
2.数据位;
3.奇偶校验位;(可以没有)
4.停止位;
5.波特率。
5.1 常用的串口相关寄存器以及波特率计算
USART_SR状态寄存器:串口传输当前的状态数据。
USART_DR数据寄存器:数据的中转站。
USART_CR1控制寄存器:发送接受使能以及一些中断使能。
USART_BRR波特率寄存器。
其中波特率计算方法如下:
其中PCLK1用于USART2、3、4、5;PCLK2用于USART1。PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。比如需要设置串口1波特率为115200,则:
则DIV_Fraction=16*0.625=1=0x01;
DIV_Mantissa=39=0x27。
所以BRR寄存器的值设置为0x0271。
5.1 串口配置步骤
1.串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2.串口复位(可有可无)
3.GPIO模式设置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空
GPIO_Init(GPIOA, &GPIO_InitStructure);
4.串口参数初始化
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送与接收使能
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
5. 初始化NVIC
看这个(36条消息) 关于STM32F103中断优先级管理NVIC_hus5487的博客-CSDN博客
6.使能串口并开启中断
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送与接收使能
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断,接收数据就跳中断子函数
USART_Cmd(USART1, ENABLE);
7.编写中断处理函数
void USART1_IRQHandler(void) //中断服务函数
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否接收数据
{
Res =USART_ReceiveData(USART1); //读取数据
USART_SendDats(USART1,Res) ; //接受的数据发回去
}
8.串口数据收发
9.串口传输状态获取
版权声明:本文为CSDN博主「小胡同学的学习笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hus5487/article/details/122646002
目录
一、更新时间
2022.1.23
二、相关器件
stm32f103c8t6最小系统板,CH340。
三、硬件连接
PA9与PA10。
四、现象与事件
接收电脑发送的数据,再发回给电脑。
五、具体操作:
UART(通用异步收发器)为异步通讯(无时钟),所以要双方约定好波特率。需要定义的参数如下:
1.起始位;
2.数据位;
3.奇偶校验位;(可以没有)
4.停止位;
5.波特率。
5.1 常用的串口相关寄存器以及波特率计算
USART_SR状态寄存器:串口传输当前的状态数据。
USART_DR数据寄存器:数据的中转站。
USART_CR1控制寄存器:发送接受使能以及一些中断使能。
USART_BRR波特率寄存器。
其中波特率计算方法如下:
其中PCLK1用于USART2、3、4、5;PCLK2用于USART1。PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。比如需要设置串口1波特率为115200,则:
则DIV_Fraction=16*0.625=1=0x01;
DIV_Mantissa=39=0x27。
所以BRR寄存器的值设置为0x0271。
5.1 串口配置步骤
1.串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2.串口复位(可有可无)
3.GPIO模式设置
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空
GPIO_Init(GPIOA, &GPIO_InitStructure);
4.串口参数初始化
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送与接收使能
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
5. 初始化NVIC
看这个(36条消息) 关于STM32F103中断优先级管理NVIC_hus5487的博客-CSDN博客
6.使能串口并开启中断
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送与接收使能
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//位数无奇偶校验8位
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断,接收数据就跳中断子函数
USART_Cmd(USART1, ENABLE);
7.编写中断处理函数
void USART1_IRQHandler(void) //中断服务函数
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否接收数据
{
Res =USART_ReceiveData(USART1); //读取数据
USART_SendDats(USART1,Res) ; //接受的数据发回去
}
8.串口数据收发
9.串口传输状态获取
版权声明:本文为CSDN博主「小胡同学的学习笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hus5487/article/details/122646002
暂无评论