关于串口转换
转换串口的时候注意不同串口的挂载总线,注意把所有串口的名称都换掉
串口寄存器
- USART-SR 状态寄存器:TC发送完成 RXNE 读数据寄存器非空
- USART-DR 数据寄存器 DR[8:0]
- USART- BRR 波特率 bit[15:4] 整数部分 bit[3:0]小数部分,两者和为usartdiv
- 波特率=
f
p
c
k
x
16
/
u
s
a
r
t
d
i
v
\frac{f_{pckx}}{16/usartdiv}
- 比如说设置波特率为115200,PCLK=72M,USARTDIV=72000000/(115200*16)=39.00625
- DIV_Fraction =16*0.0625=0x01
- DIV_Maintissa= 39 =0x27
- 波特率=
串口对应GPIO
串口号 | RXD | TXD |
---|---|---|
1 | PA10 | PA9 |
2 | PA3 | PA2 |
3 | PB11 | PB10 |
4 | PC11 | PC10 |
5 | PD2 | PC12 |
串口GPIO配置
USARTx-TX | 全双工 | 推挽复用输出 |
半双工同步 | 推挽复用输出 | |
USARTx-RX | 全双工 | 上拉输入输出 |
半双工同步 | 未用,可以做普通GPIO |
串口操作的相关函数(见代码)
- 串口初始化
- 串口使能
- 串口中断使能
- 发送数据到串口
- 接收数据(有返回值)
- 获取状态标志位
- 清除状态标志位
- 获取中断状态标志位
- 清除中断状态标志位
串口配置的一般步骤(见代码)
- 使能串口所在GPIO时钟
- 使能响应串口时钟
- 查表设置串口对应引脚的模式
- 设置推挽/浮空/上拉
- 设置引脚
- 设置速度
- 结构体赋值
- 串口初始化
- 波特率
- 硬件流控制
- TX和RX使能
- 奇偶校验
- 停止位
- 字长
- 结构体赋值
- 中断函数
- 判断中断类型
- 函数体
- 主函数
- 设置中断分组
- 初始化串口
#include "stm32f10x.h"
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
void myusart_init(){
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);//使能GPIOA口时钟,因为串口1是A9和A10
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能串口1时钟(更换串口的时候注意这一句)
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//全双工 TX需要设置推挽复用输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; //指定引脚
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_10MHz; //设置速度
GPIO_Init(GPIOA,&GPIO_InitStruct); // 结构体赋值
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;// 全双工 RX需要设置上拉输入或者浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;// 指定引脚
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_10MHz;//设置速度
GPIO_Init(GPIOA,&GPIO_InitStruct);//结构体赋值
USART_InitStruct.USART_BaudRate=115200; // 设置波特率
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None ;//不开启硬件流控制
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//开始TX和RX使能
USART_InitStruct.USART_Parity=USART_Parity_No;// 不需要奇偶校验
USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位为1
USART_InitStruct.USART_WordLength=USART_WordLength_8b ;//字长8bit
USART_Init(USART1,&USART_InitStruct); //结构体赋值
USART_Cmd(USART1,ENABLE); // 使能串口
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); // 配置串口中断
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; // 配置通道
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; // 使能通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; // 抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; // 子优先级
NVIC_Init(&NVIC_InitStruct); // 结构体赋值
}
void USART1_IRQHandler (void){
u8 receiveData;
if(USART_GetITStatus(USART1,USART_IT_RXNE)){ //如果的确是串口1中断
receiveData = USART_ReceiveData(USART1); // 把收到的值储存起来
USART_SendData(USART1,receiveData); // 把收到的值再传送回去
}
}
int main (void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断分组为2(2抢占+2响应)
myusart_init(); //初始化串口
while(1); // 死循环一直等待中断
return 0;
}
关于usart.c里面的串口处理代码
版权声明:本文为CSDN博主「Kafen Wong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/KafenWong/article/details/122266279
暂无评论