当前位置: 首页 > wzjs >正文

网站建设与组织管理广州网站优化方式

网站建设与组织管理,广州网站优化方式,电商网店运营,o2o的代表平台有哪些文章目录 什么是USARTUSART框图 stm32的Usart串口收发配置初始化发送接收 重定向的几种方法串口发送数据包 什么是USART USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器USART是STM32内部集成的硬件外设&#xff0…

文章目录

  • 什么是USART
    • USART框图
  • stm32的Usart串口收发配置
    • 初始化
    • 发送
    • 接收
  • 重定向的几种方法
  • 串口发送数据包

什么是USART

  • USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器
  • USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
  • 自带波特率发生器,最高达4.5Mbits/s
  • 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)
  • 可选校验位(无校验/奇校验/偶校验)
  • 支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN //基于串口通信的一些变体通信方式

STM32F103C8T6 USART资源: USART1、 USART2、 USART3

USART框图

在这里插入图片描述

  • 灰色的两个寄存器 再物理上是独立的两个寄存器,但软件上共用一个地址
  • 收发数据的细节 移位寄存器与数据寄存器的工作流程
    • 最后都是一位一位的输入或输出.
    • 可以发现输入和输出是相反的操作
    • 输出:
      1. 直接写入一个byte的数据到 发送数据寄存器(TDR)
      2. 发送数据寄存器一位一位的移动到 发送移位寄存器
      3. 再串行输出
    • 输入:
      1. 一位一位的串行数据读入到接收移位寄存器
      2. 当满了一个Byte ,这一个Byte的数据就从 接收移位寄存器 转到接收数据寄存器(RDR)中。
      3. 再直接读取

stm32的Usart串口收发配置

初始化

  • 初始化对应gpio
  • 初始化usart外设
    • USART_BaudRate //波特率
    • USART_HardwareFlowControl //硬件流控制,通常不需要
    • USART_Mode //选择收发模式
    • USART_Parity //选择是否要奇偶校验
    • USART_StopBits //停止位长度,选择1位
    • USART_WordLength //选择字长,即为数据帧的长度
void Serial_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA9引脚初始化为复用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);					//将PA10引脚初始化为上拉输入/*USART初始化*/USART_InitTypeDef USART_InitStructure;					//定义结构体变量USART_InitStructure.USART_BaudRate = 9600;				//波特率USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	//硬件流控制,不需要USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	//模式,发送模式和接收模式均选择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_Init,配置USART1/*中断输出配置*/USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);			//开启串口接收数据的中断/*NVIC中断分组*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			//配置NVIC为分组2/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;					//定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		//选择配置NVIC的USART1线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);							//将结构体变量交给NVIC_Init,配置NVIC外设/*USART使能*/USART_Cmd(USART1, ENABLE);								//使能USART1,串口开始运行
}

发送

  • 将数据写入发送数据寄存器(TDR)后,要等待写入完成再进行下一次写入(避免数据覆盖)
void Serial_SendByte(uint8_t Byte)
{USART_SendData(USART1, Byte);		//将字节数据写入数据寄存器,写入后USART自动生成时序波形while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//等待发送完成/*下次写入数据寄存器会自动清除发送完成标志位,故此循环后,无需清除标志位*/
}

在这里插入图片描述

接收

  • 通过串口中断实现数据接收
void USART1_IRQHandler(void)
{if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		//判断是否是USART1的接收事件触发的中断{Serial_RxData = USART_ReceiveData(USART1);				//读取数据寄存器,存放在接收的数据变量Serial_RxFlag = 1;										//置接收标志位变量为1USART_ClearITPendingBit(USART1, USART_IT_RXNE);			//清除USART1的RXNE标志位//读取数据寄存器会自动清除此标志位//如果已经读取了数据寄存器,也可以不执行此代码}
}

重定向的几种方法

  1. 直接改fputc 改fputc
    (printf就是由fputc实现的)
  2. 自己封装printf函数

void Serial_Printf(char *format, ...)
{char String[100];				//定义字符数组va_list arg;					//定义可变参数列表数据类型的变量argva_start(arg, format);			//从format开始,接收参数列表到arg变量vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组String中va_end(arg);					//结束变量argSerial_SendString(String);		//串口发送字符数组(字符串)
}

串口发送数据包

  • 两种数据包 ,固定与不固定,文本与十六进制
  • 状态机思想 (注意其中状态的判断用if else if级联,不要用if语句)
    • 接收数据 -> 根据不同的状态做不同的处理
/*** 函    数:USART1中断函数* 参    数:无* 返 回 值:无* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行*           函数名为预留的指定名称,可以从启动文件复制*           请确保函数名正确,不能有任何差异,否则中断函数将不能进入*/
void USART1_IRQHandler(void)
{static uint8_t RxState = 0;		//定义表示当前状态机状态的静态变量static uint8_t pRxPacket = 0;	//定义表示当前接收数据位置的静态变量if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)		//判断是否是USART1的接收事件触发的中断{uint8_t RxData = USART_ReceiveData(USART1);				//读取数据寄存器,存放在接收的数据变量/*使用状态机的思路,依次处理数据包的不同部分*//*当前状态为0,接收数据包包头*/if (RxState == 0){if (RxData == 0xFF)			//如果数据确实是包头{RxState = 1;			//置下一个状态pRxPacket = 0;			//数据包的位置归零}}/*当前状态为1,接收数据包数据*/else if (RxState == 1){Serial_RxPacket[pRxPacket] = RxData;	//将数据存入数据包数组的指定位置pRxPacket ++;				//数据包的位置自增if (pRxPacket >= 4)			//如果收够4个数据{RxState = 2;			//置下一个状态}}/*当前状态为2,接收数据包包尾*/else if (RxState == 2){if (RxData == 0xFE)			//如果数据确实是包尾部{RxState = 0;			//状态归0Serial_RxFlag = 1;		//接收数据包标志位置1,成功接收一个数据包}}USART_ClearITPendingBit(USART1, USART_IT_RXNE);		//清除标志位}
}
http://www.dtcms.com/wzjs/70028.html

相关文章:

  • 网站建设新零售写软文怎么接单子
  • 动态手机网站怎么做的seo报告
  • wordpress4.6下载重庆seo海洋qq
  • 什么是网站开发工程师网页设计图
  • 专业供应的网站制作搜索引擎营销成功案例
  • ipad网站制作互联网营销师
  • wordpress 登陆注册下载优化大师并安装
  • 模板企业快速建站营销方案怎么写
  • 网站建设外包给别人要注意什么如何出售自己的域名
  • 海南房地产网站建设百度官方版
  • 杭州政府网站建设管理网络推广代运营公司
  • 免费网站空间哪个好百度手机助手安卓版
  • 墨星写作网站app下载公司企业员工培训
  • 正规制作网站公司哪家好国际军事最新消息今天
  • 网页的网站建设在哪里谷歌搜索引擎营销
  • 营销型网站建设亏1有了域名怎么建网站
  • 排版模板素材宁波seo网络推广咨询价格
  • 响应式网站什么意思dw网页制作教程
  • 昆明网站建设网站今天有什么新闻
  • 深圳 企业网站建设电子商务网站建设教程
  • 网站运营建站优化专家百度快照没有了用什么代替了
  • 如何用html做网站seo关键词的选择步骤
  • 网站模板建设南宁seo推广优化
  • 一起做网站下载数据包百度网盘pc网页版入口
  • 洛阳市做网站的seo的优点
  • 怎么做水果机网站关键词排名seo优化
  • 营销网站建站企业下载手机百度最新版
  • 南京市高淳县建设厅网站收录网站有哪些
  • 宁波网站建设相信荣胜网络营销渠道策略有哪些
  • 域名跟空间都有了怎么做网站企业站seo案例分析