当前位置:   article > 正文

STM32与Proteus的串口仿真详细教程与源程序_proteus中串口模拟

proteus中串口模拟

资料下载地址:STM32与Proteus的串口仿真详细教程与源程序

资料内容

包含LCD1602显示,串口发送接收,完美实现。
文档内容齐全,包含使用说明,相关驱动等。
解决了STM32的Proteus串口收发问题。    注意:每输入一个字符后,要按一次“手动发送”按钮,才能收到正确字符。

Proteus的串口仿真

打开串口调试助手,如图11-30所示。进入串口调试助手后,需要设置相关参数,串口号为图11-29所查到的端口号,其他参数根据实际程序来确定。打开串口后,按开发板上的reset按键,显示区就能接收到从开发板发送过来的“Welcome to HBEU”,每按复位键一次,就会接收一次,如图11-31所示;在发送区输入字符,如图11-32所示,点击“手动发送”,开发板上就能收到对应的字符,根据要求,不是以“x”结束的字符串,当超过20个字符后也接收到字符串。

图11-29 查看串口号
   在Proteus中仿真串口时,先安装“虚拟串口”驱动,如图11-33所示,安装完之后也可以查看虚拟串口的端口号,查看方法与图11-29一致。在串口助手中设置好串口参数后,按Proteus中运行按钮,也可以在串口助手收到信息,如图11-34所示,注意串口波特率。

        由于Proteus没有对stm32的时钟树做仿真模型,只固定了一套时钟值,可以用GETSYS/HCLK/PCLK函数看。Proteus不是实时仿真,所以串口速率不是硬件速率对应的值,可能更高,可能更低,好在Proteus的虚拟终端是可以输入非标准波特率的,推荐波特率设为9600bit/s。另外,在Proteus仿真的程序中加了一条语句:
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
        若没有该系统配置语句,则看不到仿真效果。仿真时钟跟实际时钟存在一定的延时误差,在上位机发送数据时,一次发送一个字符串时,接收会出现乱码,因此需要一个一个字符发送,如图11-35所示,在发送区依次输入“e1x”之后(注意:每输入一个字符后,要按一次“手动发送”按钮),虚拟终端(Virtual Terminal)会显示所发送的所有字符,当STM32的串口接收到字符“x”后,表示结束,在LCD屏上显示“e1”。
        为了接收方便,将最多发送20个字符改为最多发送5个字符,当我们依次输入“123456”后(注意:每输入一个字符后,要按一次“手动发送”按钮),LCD显示收到的字符串“12345”,如图11-36所示。

 

图11-35  STM32串口遇到“x”结束接收   图11-36  STM32串口收到6个字符自动结束 

程序代码

  1. #include "stm32f10x.h"
  2. #include "stdio.h"
  3. //#include "led.h"
  4. #include "delay.h"
  5. #include "lcd1602.h"
  6. uint8_t USART_RXBUF[5];
  7. extern uint8_t RXOVER;
  8. /* Private function prototypes -----------------------------------------------*/
  9. void NVIC_Configuration(void);
  10. //void Delay_Ms(uint32_t nTime);
  11. void USART_Config(void);
  12. //void USART_SendString(int8_t *str);
  13. void USART_SendString(unsigned char *buf);
  14. int main(void)
  15. {
  16. uint8_t i;
  17. RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);
  18. //SysTick_Init();
  19. SysTick_Config(SystemCoreClock/100000);
  20. GPIO_Configuration();
  21. LCD1602_Init();
  22. LCD1602_Show_Str(0,0,"Receive:");
  23. USART_Config();
  24. //USART_SendString(Tx_Buf);//发送字符串
  25. USART_SendString("Welcome to HBEU\r\n");//发送字符串
  26. while(1)
  27. {
  28. if(RXOVER == 1){
  29. LCD1602_Show_Str(0,2,USART_RXBUF);
  30. for(i=0;i<5;i++){
  31. USART_RXBUF[i] =' '; //清空接收区
  32. }
  33. RXOVER = 0;
  34. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/
  35. }
  36. /*if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
  37. {
  38. USART_SendData(USART1,USART_ReceiveData(USART1));
  39. delay_ms(1000);
  40. }*/
  41. }
  42. }
  43. /*void USART_Config(void)
  44. {
  45. GPIO_InitTypeDef GPIO_InitStructure;
  46. USART_InitTypeDef USART_InitStructure;
  47. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
  48. //RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  49. //NVIC_Configuration();
  50. //配置USART2 TX引脚工作模式
  51. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  52. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  53. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  54. GPIO_Init(GPIOA, &GPIO_InitStructure);
  55. //配置USART2 RX引脚工作模式
  56. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  57. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  58. GPIO_Init(GPIOA, &GPIO_InitStructure);
  59. //串口2工作模式配置
  60. USART_InitStructure.USART_BaudRate = 9600;
  61. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  62. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  63. USART_InitStructure.USART_Parity = USART_Parity_No ;
  64. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  65. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  66. USART_Init(USART1, &USART_InitStructure);
  67. //USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  68. USART_Cmd(USART1, ENABLE);
  69. }*/
  70. void USART_Config(void)
  71. {
  72. GPIO_InitTypeDef GPIO_InitStructure;
  73. USART_InitTypeDef USART_InitStructure;
  74. // 打开串口GPIO的时钟
  75. //DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  76. // 打开串口外设的时钟
  77. //DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
  78. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  79. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  80. NVIC_Configuration();
  81. // 将USART Tx的GPIO配置为推挽复用模式
  82. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  83. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  84. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  85. GPIO_Init(GPIOA, &GPIO_InitStructure);
  86. // 将USART Rx的GPIO配置为浮空输入模式
  87. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  88. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  89. GPIO_Init(GPIOA, &GPIO_InitStructure);
  90. // 配置串口的工作参数
  91. // 配置波特率
  92. USART_InitStructure.USART_BaudRate = 9600;
  93. // 配置 针数据字长
  94. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  95. // 配置停止位
  96. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  97. // 配置校验位
  98. USART_InitStructure.USART_Parity = USART_Parity_No ;
  99. // 配置硬件流控制
  100. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  101. // 配置工作模式,收发一起
  102. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  103. // 完成串口的初始化配置
  104. USART_Init(USART1, &USART_InitStructure);
  105. // 使能串口
  106. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  107. USART_Cmd(USART1, ENABLE);
  108. }
  109. /**
  110. * @说明 USART2字符串发送函数
  111. * @参数 str: 指向字符串的指针
  112. * @返回值 None
  113. */
  114. /*void USART_SendString(int8_t *str)
  115. {
  116. uint8_t index = 0;
  117. do
  118. {
  119. USART_SendData(USART1,str[index]);
  120. while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
  121. index++;
  122. }
  123. while(str[index] != 0); //检查字符串结束标志
  124. }*/
  125. void USART_SendString(unsigned char *buf)
  126. {
  127. while (*buf != '\0')
  128. {
  129. while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  130. USART_SendData(USART1, *buf++);
  131. }
  132. }
  133. /**
  134. * @说明 配置中断向量控制器
  135. * @参数 None
  136. * @返回值 None
  137. */
  138. void NVIC_Configuration(void)
  139. {
  140. NVIC_InitTypeDef NVIC_InitStructure;
  141. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  142. /* Enable the RTC Interrupt */
  143. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  144. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  145. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  146. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  147. NVIC_Init(&NVIC_InitStructure);
  148. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/652852
推荐阅读
相关标签
  

闽ICP备14008679号