[其他ST产品] STM32-串口通信

[复制链接]
2389|58
 楼主| 甲虫666 发表于 2023-9-24 01:20 | 显示全部楼层
9.2 发送字符串
        本质是利用上面的字节发送函数逐位发送字符串中的内容。

  1. void USART_SendString(USART_TypeDef * pUSARTx, char *str)
  2. {
  3.         unsigned int   k=0;
  4.         while(*(str+k)!='\0')
  5.         {
  6.                 USART_SendData(pUSARTx, *(str+k));
  7.                 /* 等待发送数据寄存器为空 */
  8.                 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
  9.                 k++;
  10.         }
  11.         while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);   /* TC:传输完成标志 */
  12. }
 楼主| 甲虫666 发表于 2023-9-24 01:20 | 显示全部楼层
9.3 重定向printf函数发送字符串
        在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。

        以printf()为例:printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。
        修改fputc函数如示:
  1. /* 重定向printf函数 */
  2. int fputc(int ch, FILE *f)
  3. {
  4.         USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
  5.         /* 等待发送完毕 */
  6.         while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
  7.         return ch;
  8. }
 楼主| 甲虫666 发表于 2023-9-24 01:20 | 显示全部楼层
    修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include <stdio,h> 88192650f1e7166165.png
 楼主| 甲虫666 发表于 2023-9-24 01:21 | 显示全部楼层
    重定向后的printf()函数功能强大,具有向串口调试助手打印数据的功能,使用方法和c语言时一样,比如printf("串口实验\n");就可以将“串口实验”这句话发送到上位机中,而且换行符“\n”还具有换行作用。
  1. /* 重定向printf函数 */
  2. int fputc(int ch, FILE *f)
  3. {
  4.         USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
  5.         /* 等待发送完毕 */
  6.         while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
  7.         return ch;
  8. }
 楼主| 甲虫666 发表于 2023-9-24 01:21 | 显示全部楼层
9.4 重定向getchar函数接收字符
        具体操作与重定向后的printf函数类似,比如可以通过如下代码向上位机发送已经接收到的数据:
  1. x=getchar();
  2. printf("接收到的字符是:%c\n",x);
 楼主| 甲虫666 发表于 2023-9-24 01:21 | 显示全部楼层
重定义如下:
  1. ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
  2. int fgetc(FILE *f)
  3. {
  4.                 /* 等待串口输入数据 */
  5.                 while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

  6.                 return (int)USART_ReceiveData(DEBUG_USARTx);
  7. }
 楼主| 甲虫666 发表于 2023-9-24 01:22 | 显示全部楼层
9.5 通过中断接收
        在stm32f10x_it.c中编写USART1中断源相对应得中断函数,利用了固件库函数中的:
                1)USART_ReceiveData(DEBUG_USARTx);接收函数
                2)USART_SendData(DEBUG_USARTx, x);发送函数
                3)USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE);判断标志位函数
————————————————
 楼主| 甲虫666 发表于 2023-9-24 01:22 | 显示全部楼层
  1. /* #define  DEBUG_USART_IRQn         USART1_IRQn
  2.    #define  DEBUG_USART_IRQHandler   USART1_IRQHandler */
  3. void DEBUG_USART_IRQHandler(void)
  4. {
  5.         uint16_t  x;
  6.         /* 判断是否收到中断信号 */
  7.         if(USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) == SET)
  8.         {
  9.                 x = USART_ReceiveData(DEBUG_USARTx);
  10.                 USART_SendData(DEBUG_USARTx, x);
  11.         }
  12. }
 楼主| 甲虫666 发表于 2023-9-24 01:22 | 显示全部楼层
开发板与上位机的连接
开发板与上位机之间通过USB线连接,所以在上位机上要配置一个USB转串口的驱动,以便把USB传输过来的电平转换为TTL电平,TTL电平才能与串口调试助手建立联系。一般使用CH341驱动作为win10下的USB转串口,驱动安装成功的情况下接入USB会在计算机的设备管理器的端口中发现串口:


90549650f1ed16fac3.png
Clyde011 发表于 2024-2-21 07:08 | 显示全部楼层

要在外部连接一个振荡电路提供时钟信号
公羊子丹 发表于 2024-2-21 08:01 | 显示全部楼层

影响控制IC
万图 发表于 2024-2-21 09:04 | 显示全部楼层

与15号引脚连接的C1称为旁路电容
Uriah 发表于 2024-2-21 10:07 | 显示全部楼层

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的
帛灿灿 发表于 2024-2-21 12:03 | 显示全部楼层

电压范围称为工作电源电压
Bblythe 发表于 2024-2-21 13:06 | 显示全部楼层

内部电路工作电圧是通过内部电压调节器调节电源电压得到的
周半梅 发表于 2024-2-21 15:02 | 显示全部楼层

减小滤波电容的等效串联电阻(ESR)
Pulitzer 发表于 2024-2-21 16:05 | 显示全部楼层

通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。
童雨竹 发表于 2024-2-21 18:01 | 显示全部楼层

通过电容方式耦合到不同层上邻近的引线上
Wordsworth 发表于 2024-2-21 19:04 | 显示全部楼层

防止因瞬间大电流引起的电源电压下降
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部