发新帖我要提问
123
返回列表
打印
[其他ST产品]

STM32-串口通信

[复制链接]
楼主: 甲虫666
手机看帖
扫描二维码
随时随地手机跟帖
41
甲虫666|  楼主 | 2023-9-24 01:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
9.2 发送字符串
        本质是利用上面的字节发送函数逐位发送字符串中的内容。

void USART_SendString(USART_TypeDef * pUSARTx, char *str)
{
        unsigned int   k=0;
        while(*(str+k)!='\0')
        {
                USART_SendData(pUSARTx, *(str+k));
                /* 等待发送数据寄存器为空 */
                while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
                k++;
        }
        while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);   /* TC:传输完成标志 */
}

使用特权

评论回复
42
甲虫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函数如示:
/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{
        USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
        /* 等待发送完毕 */
        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
        return ch;
}

使用特权

评论回复
43
甲虫666|  楼主 | 2023-9-24 01:20 | 只看该作者
    修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include <stdio,h>

使用特权

评论回复
44
甲虫666|  楼主 | 2023-9-24 01:21 | 只看该作者
    重定向后的printf()函数功能强大,具有向串口调试助手打印数据的功能,使用方法和c语言时一样,比如printf("串口实验\n");就可以将“串口实验”这句话发送到上位机中,而且换行符“\n”还具有换行作用。
/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{
        USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
        /* 等待发送完毕 */
        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
        return ch;
}

使用特权

评论回复
45
甲虫666|  楼主 | 2023-9-24 01:21 | 只看该作者
9.4 重定向getchar函数接收字符
        具体操作与重定向后的printf函数类似,比如可以通过如下代码向上位机发送已经接收到的数据:
x=getchar();
printf("接收到的字符是:%c\n",x);

使用特权

评论回复
46
甲虫666|  楼主 | 2023-9-24 01:21 | 只看该作者
重定义如下:
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
                /* 等待串口输入数据 */
                while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

                return (int)USART_ReceiveData(DEBUG_USARTx);
}

使用特权

评论回复
47
甲虫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);判断标志位函数
————————————————

使用特权

评论回复
48
甲虫666|  楼主 | 2023-9-24 01:22 | 只看该作者
/* #define  DEBUG_USART_IRQn         USART1_IRQn 
   #define  DEBUG_USART_IRQHandler   USART1_IRQHandler */
void DEBUG_USART_IRQHandler(void)
{
        uint16_t  x;
        /* 判断是否收到中断信号 */
        if(USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) == SET)
        {
                x = USART_ReceiveData(DEBUG_USARTx);
                USART_SendData(DEBUG_USARTx, x);
        }
}

使用特权

评论回复
49
甲虫666|  楼主 | 2023-9-24 01:22 | 只看该作者
开发板与上位机的连接
开发板与上位机之间通过USB线连接,所以在上位机上要配置一个USB转串口的驱动,以便把USB传输过来的电平转换为TTL电平,TTL电平才能与串口调试助手建立联系。一般使用CH341驱动作为win10下的USB转串口,驱动安装成功的情况下接入USB会在计算机的设备管理器的端口中发现串口:


使用特权

评论回复
50
Clyde011| | 2024-2-21 07:08 | 只看该作者

要在外部连接一个振荡电路提供时钟信号

使用特权

评论回复
51
公羊子丹| | 2024-2-21 08:01 | 只看该作者

影响控制IC

使用特权

评论回复
52
万图| | 2024-2-21 09:04 | 只看该作者

与15号引脚连接的C1称为旁路电容

使用特权

评论回复
53
Uriah| | 2024-2-21 10:07 | 只看该作者

时序电路是按时钟信号(CK)的上升沿(信号从L→H的变化)或下降沿(信号从H→L的变化)同步工作的

使用特权

评论回复
54
帛灿灿| | 2024-2-21 12:03 | 只看该作者

电压范围称为工作电源电压

使用特权

评论回复
55
Bblythe| | 2024-2-21 13:06 | 只看该作者

内部电路工作电圧是通过内部电压调节器调节电源电压得到的

使用特权

评论回复
56
周半梅| | 2024-2-21 15:02 | 只看该作者

减小滤波电容的等效串联电阻(ESR)

使用特权

评论回复
57
Pulitzer| | 2024-2-21 16:05 | 只看该作者

通常选择0.01μF~0.1μF的陶瓷电容作为旁路电容。

使用特权

评论回复
58
童雨竹| | 2024-2-21 18:01 | 只看该作者

通过电容方式耦合到不同层上邻近的引线上

使用特权

评论回复
59
Wordsworth| | 2024-2-21 19:04 | 只看该作者

防止因瞬间大电流引起的电源电压下降

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则