0
点赞
收藏
分享

微信扫一扫

关于STM32F10x串口UART相关代码笔记

何以至千里 2022-01-23 阅读 94
stm32p2plinq

目录

一、更新时间

二、相关器件

三、硬件连接

四、现象与事件

五、具体操作:

 5.1 常用的串口相关寄存器以及波特率计算

 5.1 串口配置步骤


一、更新时间

        2022.1.23

二、相关器件

        stm32f103c8t6最小系统板,CH340。

三、硬件连接

        PA9与PA10

四、现象与事件

        接收电脑发送的数据,再发回给电脑。

五、具体操作:

        UART(通用异步收发器)为异步通讯(无时钟),所以要双方约定好波特率。需要定义的参数如下:

                1.起始位;

                2.数据位;

                3.奇偶校验位;(可以没有)

                4.停止位;

                5.波特率。

 5.1 常用的串口相关寄存器以及波特率计算

        USART_SR状态寄存器:串口传输当前的状态数据。

        USART_DR数据寄存器:数据的中转站。

        USART_CR1控制寄存器:发送接受使能以及一些中断使能。

        USART_BRR波特率寄存器。

        其中波特率计算方法如下:

\frac{PCLK}{16*USARTIV}

        其中PCLK1用于USART2、3、4、5;PCLK2用于USART1。PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。比如需要设置串口1波特率为115200,则:

USARTDIV=\frac{72000000}{115200*16}=39.0625

        则DIV_Fraction=16*0.625=1=0x01;

           DIV_Mantissa=39=0x27。

        所以BRR寄存器的值设置为0x0271。

 5.1 串口配置步骤

        1.串口时钟使能

void uart_init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}

        2.串口复位(可有可无)

        3.GPIO模式设置

void uart_init()
{ 
  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.串口参数初始化

void uart_init()
{
 
	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

        6.使能串口

void uart_init()
{
 
	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.串口传输状态获取

举报

相关推荐

0 条评论