Openmv,stm32串口(定时器配置)

新手学习记录中:

得先有from pyb import UART的包以及import json

初始化uart=UART(3,115200)表示是在串口3处,其波特率为115200

(需要看openmv的原理图,看uart3的TX和RX是哪两个IO口,通过TTL与其通信)

接线方式:TX-RX,RX-TX,GND-GND,VIN-VCC

初始化也可用uart.init(115200,bits=8,parity=None,stop=1)来表示:

打包数据:通过struct模块的pack函数将数据封装成字符串(二进制传输): 

Openmv,stm32串口(定时器配置)_第1张图片

前面的格式可以参照此表(几个字符几个整型):

Openmv,stm32串口(定时器配置)_第2张图片

 其次是两个帧头,stm32可通过帧头来判断该数据是不是openmv所发送的数据

后两个即为所要传输发送的数据,可在最后加上一个帧尾,32可通过此知道数据接收结束

一般有关openmv通信的相关函数就这几个:

Openmv,stm32串口(定时器配置)_第3张图片

其次就是stm32的串口:

我所使用的STM32F103ZET6开发板已经装载了USB-TTL芯片,所以不需要外接模块,用USB线直接连接即可。

 若需要外接USB-TTL模块,接线方式为:RX-TX,TX-RX,GND-GND

使用cubemx配置32串口:

Openmv,stm32串口(定时器配置)_第4张图片

其中UART是只支持异步串口,USART除异步串口外还支持同步串口,所以我这里选择USART。

要将MODE改为Asynchronous,下面的配置如果想要稳定,波特率可设为9600,想要快速的话,可设为115200。其他一般保持不变

Openmv,stm32串口(定时器配置)_第5张图片 

之后再在GPIO Settings处看串口是否为所需串口。之后即可生成代码

阻塞式收发:

 

供电之后需要将代码先烧进32板中,再打开串口助手进行调试

需要注意:板上的USART需要用跳线帽盖住,不然烧代码会一直显示超时。而且烧完之后记得要按复位键,再用串口助手。

也可用printf函数来进行串口输出:

首先需要加上printf的头文件

Openmv,stm32串口(定时器配置)_第6张图片 

再写上fputc函数

 

在while(1)处写上即可

要接收发出去的数据可用:(在while里面)

        uint8_t buf[5];
        HAL_UART_Receive(&huart1,buf,3,0xFFFF);
        HAL_UART_Transmit(&huart1,buf,3,0xFFFF);
 接收数据也可写接收函数:
int fgetc(FILE *stream)
{
    uint8_t ch[1];
    HAL_UART_Receive(&huart1,ch,1,0xFFFF);
    return ch[0];
}

while里面加上:

        int val=0;
        scanf("%d",&val);
        printf("%d\r\n",val);

 使用中断收发,需要再在cubemx上配置:

Openmv,stm32串口(定时器配置)_第7张图片

在NVIC中对所用串口进行打勾并将优先级改为1。

生成代码即可

中断函数:

Openmv,stm32串口(定时器配置)_第8张图片 上图的Transmit函数即为发送函数

 接收函数:

每发送或接收一个数据都会再次进入中断函数中 

定时器配置:

Openmv,stm32串口(定时器配置)_第9张图片

 配置中的Prescaler是看时钟树

Openmv,stm32串口(定时器配置)_第10张图片

右边APB1 Timer为8,所以Prescaler需要8-1

看视频说要将Count Period改为500000-1,但是我的无论怎么改都还是65535(应该没影响吧)

之后再将NVIC中的定时器TIM2打勾,改优先级即可生成代码 

Openmv,stm32串口(定时器配置)_第11张图片

若以上有任何错误,欢迎大家在评论区指出,我很希望得到建议和改正 

你可能感兴趣的:(单片机,嵌入式硬件)