STM32中USART 串口简单使用

发布时间:2022-12-27  

  使用查询方式的USART:


  设置时钟:


  RCC_APB2Periph_AFIO 功能复用IO时钟

  RCC_APB2Periph_GPIOA GPIOA时钟

  RCC_APB2Periph_USART1 USART1时钟

  你可以用


  //使能串口1,PA,AFIO总线 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);


  或直接


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB2外设时钟开启

  注意USART2的你开启为 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);


  设置GPIO:


  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入-RX

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  设置USART:


  这里我用的是3.0的库相对于2.0的库来说多了一步,先说2.0


  USART_InitTypeDef USART_InitStructure;

  USART_StructInit(&USART_InitStructure); //装填默认值

  USART_Init(USART1, &USART_InitStructure);  //根据USART_InitStruct中指定的参数初始化外设USARTx寄存器

  USART_Cmd(USART1, ENABLE); //启用

  就好了~!


  而3.0的库需要


  USART_InitTypeDef USART_InitStructure;

  USART_ClockInitTypeDef USART_ClockInitStructure;

  USART_StructInit(&USART_InitStructure);

  USART_ClockStructInit (&USART_ClockInitStructure);

  USART_ClockInit(USART1, &USART_ClockInitStructure);

  USART_Init(USART1, &USART_InitStructure);

  USART_Cmd(USART1, ENABLE);

  //只是多分出了1个 USART_ClockInitStructure  我也不知为啥要这样??为了同步异步模式?USART_InitStruct中指定的参数内容为:(2.0的)

  typedef struct

  {

  u32 USART_BaudRate; //USART传输的波特率

  u16 USART_WordLength; //一个帧中传输或者接收到的数据位数通常是8

  u16 USART_StopBits; //停止位

  u16 USART_Parity; //奇偶校验

  u16 USART_HardwareFlowControl; //硬件流控制模式使能还是失能

  u16 USART_Mode; //指定了使能或者失能发送和接收模式

  u16 USART_Clock; //提示了USART时钟使能还是失能

  u16 USART_CPOL; //指定了下SLCK引脚上时钟输出的极性

  u16 USART_CPHA; //指定了下SLCK引脚上时钟输出的相位

  u16 USART_LastBit;

  //来控制是否在同步模式下,在SCLK引脚上输出最后发送的那个数据字通常用USART_LastBit_Disable

  } USART_InitTypeDef;

  我靠~!太细了~!我只知道(9600,8,n,1)这就够了 其他的统统默认~!


  USART_StructInit(&USART_InitStructure);

  USART_ClockStructInit (&USART_ClockInitStructure);  //2.0不用这句,这样就设好了好了~!自动为您装填了默认参数。默认的参数如下(3.0的库):

  void USART_StructInit(USART_InitTypeDef* USART_InitStruct)

  {

  USART_InitStruct->USART_BaudRate = 9600;

  USART_InitStruct->USART_WordLength = USART_WordLength_8b;

  USART_InitStruct->USART_StopBits = USART_StopBits_1;

  USART_InitStruct->USART_Parity = USART_Parity_No ;

  USART_InitStruct->USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStruct->USART_HardwareFlowControl =  USART_HardwareFlowControl_None;

  }

  void USART_ClockStructInit(USART_ClockInitTypeDef*  USART_ClockInitStruct)

  {

  USART_ClockInitStruct->USART_Clock = USART_Clock_Disable;

  USART_ClockInitStruct->USART_CPOL = USART_CPOL_Low;

  USART_ClockInitStruct->USART_CPHA = USART_CPHA_1Edge;

  USART_ClockInitStruct->USART_LastBit = USART_LastBit_Disable;

  }

  /************************************************************************************************/


  当然了你也可以自己设参数,比如这样。


  void USART_Configuration(void)

  {

  USART_InitTypeDef USART_InitStructure;

  USART_ClockInitTypeDef USART_ClockInitStructure;

  USART_InitStructure.USART_BaudRate = 9600;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl =  USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;

  USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;

  USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;

  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

  USART_ClockInit(USART1, &USART_ClockInitStructure);

  USART_Init(USART1, &USART_InitStructure);

  USART_Init(USART1, &USART_InitStructure);

  USART_ClockInit(USART1, &USART_ClockInitStructure);

  USART_Cmd(USART1, ENABLE);

  } ////USART_ClockInitStructure.USART_CPHA=  USART_CPHA_2Edge;除了这句以外其他的都和默认的参数一样,二者有啥区别我至今也不太清楚但就一般的应用来说两个都可以正常工作。

  收发的方法:


  1.发送


  void USART1_Puts(char * str)

  {

  while(*str)

  {

  USART_SendData(USART1, *str++);

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  }

  }

  USART1_Puts("hello-java~!rn"); //这样就发送了hello-java~!

  跟C语言的printf不太一样在于n 并没有另起一行要用个r这样在终端上好看。


  2.接收


  u8 uart1_get_data; //存放接受的内容

  while(1)

  {

  if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)

  {

  uart1_get_data = USART_ReceiveData(USART1);

  USART1_Puts("rn获取到串口1数据:");

  USART1_Putc(uart1_get_data);

  USART1_Puts("rn");

  }

  }

  查询法的可以看出要不断扫描不是很好,下面介绍中断法。


  首先配置时钟:这里我拿USART2说事:


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //USART2和USART3都在在APB1上而USART1是在APB2上的


  设置GPIO:


  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO  |ENABLE);

  // A2 做T2X

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  // A3 做R2X

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  配置SUART2:


  USART_InitTypeDef USART_InitStructure;

  USART_ClockInitTypeDef USART_ClockInitStructure;

  USART_StructInit(&USART_InitStructure);

  USART_ClockStructInit (&USART_ClockInitStructure);

  USART_ClockInit(USART2, &USART_ClockInitStructure);

  USART_Init(USART2, &USART_InitStructure);

  USART_Cmd(USART2, ENABLE);


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    程序的执行,存储器用于存储程序和数据,定时器用于计时和延时,中断控制器用于响应外部中断请求,串口和并口用于数据通信和控制输出。通过使用专用的汇编语言和高级语言编程,开发......
    桥接模式,分别为4S(PCIe转4个串口)、2S+1P(PCIe转2个串口和1个并口)、2S+SPI(PCIe转2个串口和SPI主控)、以及LB(PCIe转本地总线/类似ISA)。此方案可适用于各种串并口I......
    桥接模式,分别为4S(PCIe转4个串口)、2S+1P(PCIe转2个串口和1个并口)、2S+SPI(PCIe转2个串口和SPI主控)、以及LB(PCIe转本地总线/类似ISA)。此方案可适用于各种串并口I/O......
    为4S(PCIe转4个串口)、2S+1P(PCIe转2个串口和1个并口)、2S+SPI(PCIe转2个串口和SPI主控)、以及LB(PCIe转本地总线/类似ISA)。此方案可适用于各种串并口I/O接口......
    为4S(PCIe转4个串口)、2S+1P(PCIe转2个串口和1个并口)、2S+SPI(PCIe转2个串口和SPI主控)、以及LB(PCIe转本地总线/类似ISA)。此方案可适用于各种串并口I/O接口......
    通常是9针,也有25针的接口,最大速率115200bps。通常用于连接鼠标(串口)及通讯设备(如连接外置式调制解调器进行数据通讯或一些工厂的数控机接口)等。一般主板外部只有一个串口,机箱后面和并口......
    PCIE总线四串口及打印口芯片 CH384;概述; CH384 是PCI-Express总线的四串口及打印口芯片,包含四个兼容16C550或者16C750 的异步串口和一个EPP/ECP 增强型双向并口......
    。 CH558提供丰富的接口资源,包括内置类485数据收发器、LED控制卡接口和快速电平捕捉功能,其他包括1组SPI、2路串口、8位并口等,UART1兼容16C550;内置4组定时器;提供1路16位......
    烧写状态,为了防止误操作,S1为H时为擦除芯片和加密,L时为读写,电路简单,相信很容易看懂,印刷电路板的土我就不给出,我使用的是实验板做成的,样子非常丑。   然后是对EPP并口和rtl8139的编......
    收发器、LED控制卡接口和快速电平捕捉功能,其他包括2组SPI、2路串口、8位并口等,UART1兼容16C550;内置4组定时器;提供1路16位PWM和2路8位PWM;支持8通道10/11位ADC。 系统......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>