stm32入门(四): 串口

关于串口转换

转换串口的时候注意不同串口的挂载总线,注意把所有串口的名称都换掉

串口寄存器

  1. USART-SR 状态寄存器:TC发送完成 RXNE 读数据寄存器非空
  2. USART-DR 数据寄存器 DR[8:0]
  3. USART- BRR 波特率 bit[15:4] 整数部分 bit[3:0]小数部分,两者和为usartdiv
    1. 波特率=

      f

      p

      c

      k

      x

      16

      /

      u

      s

      a

      r

      t

      d

      i

      v

      \frac{f_{pckx}}{16/usartdiv}

      16/usartdivfpckx

    2. 比如说设置波特率为115200,PCLK=72M,USARTDIV=72000000/(115200*16)=39.00625
    3. DIV_Fraction =16*0.0625=0x01
    4. 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

串口操作的相关函数(见代码)

  1. 串口初始化
  2. 串口使能
  3. 串口中断使能
  4. 发送数据到串口
  5. 接收数据(有返回值)
  6. 获取状态标志位
  7. 清除状态标志位
  8. 获取中断状态标志位
  9. 清除中断状态标志位

串口配置的一般步骤(见代码)

  1. 使能串口所在GPIO时钟
  2. 使能响应串口时钟
  3. 查表设置串口对应引脚的模式
    1. 设置推挽/浮空/上拉
    2. 设置引脚
    3. 设置速度
    4. 结构体赋值
  4. 串口初始化
    1. 波特率
    2. 硬件流控制
    3. TX和RX使能
    4. 奇偶校验
    5. 停止位
    6. 字长
    7. 结构体赋值
  5. 中断函数
    1. 判断中断类型
    2. 函数体
  6. 主函数
    1. 设置中断分组
    2. 初始化串口
#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

生成海报
点赞 0

Kafen Wong

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32(X):ADC

概述 ADC_Init()函数 函数声明:void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); ADCx参数有效性 a

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里