4.STM32基础_串口

  1. 串口
    1. 串口:USART,通用(a) 同步(s)/异步(a) 收发(t)器,串行 全双工 同/异步
    2. 协议:串行通信协议
      1. 起始位:通常是逻辑0,标志着传输开始
      2. 数据位:常用8位,也有9位
      3. 奇偶校验位:通常不用
      4. 停止位:传输结束的标志,通常设置1位
      5. 空闲位:总线空闲的标志,通常是逻辑1
    3. 速率:双方约定波特率,常用9600,115200 (速率单位bit)
  2. STM32串口工作原理
    1. 发送
      1. Data->TDR(发送数据寄存器)->发送移位寄存器->TX,TDR数据会自动转移到移位寄存器,当TDR的数据全部转移至发送移位寄存器时,TXE标志位置1,发送移位寄存器逐位将数据移至TX,此时TDR可以再次写入发送数据。
    2. 接收
      1. RX->接收移位寄存器(接收数据寄存器)->RDR->Data,RX将数据逐位放进接收移位寄存器(先收的在高位),当移位寄存器满8位后将数据放进RDR中,此时RXNE置1,数据可以被读出。
    3. 标志位
      1. TXE:
        1. 1 TDR空,可以开始发送
        2. 0 TDR非空,还有数据没有转移完毕
      2. TC:
        1. 1 发送完成,此时TXE==1
        2. 0 未发送成功
      3. RXNE:
        1. 1 RDR非空,还不可以读数据
        2. 0 RDR空,可以开始读数据
      4. IDLE:
        1. 1 检测到总线空闲,产生中断
        2. 0 总线非空闲
  3. 例程
void Usart1_Config(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
	//配置GPIO口
	//配置对应IO口 PA9(TX):复用推挽  PA10(RX):浮空输入
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//配置串口 配置串口1  数据8位,0位校验位 ,1位停止位,波特率115200
	USART_InitTypeDef USART_InitStruct = {0};//可以通过结构体类型跳转
	USART_InitStruct.USART_BaudRate = 115200;//波特率
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件控制流不开
	USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//打开发送和接收
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1,&USART_InitStruct);
	
	USART_Cmd(USART1,ENABLE);
	//配置串口1的中断
	//在串口1产生接收的时候,会产生中断,我们直接去中断函数里面处理就可以了
	//选择串口1的中断原因
	USART1->CR1 |= 0x1<<5;//使能串口1的接收非空中断
	//USART_ITConfig();
	NVIC_SetPriority(USART1_IRQn,7);//设置优先级0~15
	NVIC_EnableIRQ(USART1_IRQn);//使能中断通道
}

void USART1_IRQHandler(void)
{
	uint8_t data;
	if((USART1->SR&0x1<<5)!=0){//执行该中断函数的原因有很多,所以判断一下是不是接收导致的
		//接收数据
		data = USART1->DR;//读操作,同时也是清空中断标志位
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值