串口通讯+PWM波:STM32F103C8T6通过USART1输入相应的指令控制的TIM3四个通道生成四个占空比不同的频率为50HzPWM波来控制云台。
之前用FT232直连单片机,一切正常返回的指令无乱码正常。
接上数传图传出现问题:
1、连续给出高电平时间持续1.5ms的指令,电机本该静止却会往一个方向慢慢漂移。怀疑每次在发出指令单片机相应指令的过程中会导致PWM波占空比变化。
2、接上数传后返回的指令中含有很多乱码。设备有时会莫名重启或者关闭。怀疑是发送的指令出现了偏差触发了开关机的指令。
3、设备返回的图像黑屏
解决方法:
1、对于重复发出的指令,设置相应的重复处理程序。若指令相同或者相同指令持续3次则跳过该次指令返回”REPEAT COMMAND!!!”字样,直到接收到不同指令。
2、加上校验码,采用的是求和校验的方式。
3、重新研究了下PWM波高电平长短顺序控制设备的指令,发现之前的理解有误,重新修正了PWM波生成的顺序。
4、图像黑屏是USB设备引起的,重启即可。
另外:
1、校验方法可否改进。CRC校验?
2、PWM波占空比设置方式可否改变。改为DMA直接控制,绕过CPU可否解决这个问题。
关键字:STM32 CUBEMX 串口通讯
引用地址:
回炉重造STM32 CUBEMX之串口通讯问题四
推荐阅读最新更新时间:2024-11-17 20:46
stm32ADC的DMA模式
//变量定义 __IO uint16_t ADCConvertedValue ; //ADC 外设的数据寄存器 #define ADC1_DR_Address ((uint32_t)0x4001244C) //ADC_DR(ADC规则数据寄存器),偏移量=0x4c ADC1(0x40012400-0x400127ff) //ADC1_GPIO配置 void ADC1_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure PC.01 (ADC Channel11) as analog inpu
[单片机]
STM32 | hex文件、bin文件、axf文件的区别?
在STM32开发中,经常会碰到hex文件、bin文件与axf文件,这些都是可以烧写到板子里运行的文件。这三个文件有什么区别呢?在这之前,先来一起回顾一下C语言编译的过程: 编译的原理 在之前的C语言笔记《C程序的编译过程》中,有简单的分析了C程序编译的几个过程: STM32也是用C语言来开发,也会经过类似的编译过程,只不过我们常常用MDK或者其它IDE来编译,其编译过程如下: 例如,我们的LED程序编译过程如下: 在IDE中进行编译时,我们只需点击编译按钮即可完成这些过程,编译过程用到的工具(.exe文件)在IDE的安装目录下的某个文件夹下,比如我们这里用的MDK的编译工具路径: 一般这些IDE或者工具集的一些
[单片机]
CM3(STM32)内核复位与系统复位区别及应用
Ⅰ、写在前面 某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。 例子:我一个A系统通过一个IO控制另一个B系统的电源,而这个IO置高时才开启B系统的电源。 正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。 这个时候如果我使用常规的引脚复位,就会使IO置低,不符合要求,就需要使用到本文说到的内核复位。 Ⅱ、关于复位 说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。 复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。 上面说的复位按键,也就
[单片机]
STM32PWM配置详解笔记
关于STM32的PWM模式配置 ,核心代码如下,以原子的mini板STM32F103RCT6为例子 void TIM1_PWM_Init(u16 arr,u16 psc)//定时器1的PWM初始化 { /*结构体变量定义*/ GPIO_InitTypeDef GPIO_Initstrue; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstrue; TIM_OCInitTypeDef TIM_OCInitstrue; /*-------------*/ /*开启TIM1时钟,配置对应管脚(PA8)为复用输出*/ RCC_APB2PeriphClockCmd(RCC_APB2Per
[单片机]
为什么STM32中SPI的MISO引脚设置成复用推挽输出
在复用SPI总线时,必须先设置总线端口。读取其他ARM芯片(如NXP)一般很容易看出芯片的设置是否正确。不过对于STM32就容易让人迷惑了。例如,我们在使用SPI总线进行通信时,可以这样设置: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用的推挽输出 恐怕大家对MISO端口的设置就会产生疑惑了,M
[单片机]
STM32 8位IO的操作
归根结底就是对8个IO口的读写问题。你可以自己编写两个函数WriteData()和ReadData();还是分别调用GPIO位操作的函数。 void WriteData(u8 data) { //分别操作与液晶连接的IO口,顺序是由高位到低位 GPIO_WriteBit(GPIO号, Pin号,(data & 0x80) 7 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x40) 6 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x20) 5 ); GPIO_WriteBit(GPIO号, Pin号,(data & 0x10) 4 ); GP
[单片机]
51单片机实现通讯协议的串口通讯编程
我们以51单片机为例。51中一般针对串口通讯编程,通常采取中断接受查询发送的方式。中断函数在接受数据到达时被重复调用,其实是个重复入栈的过程,所以不宜将函数写的太长,函数太长一般会导致栈太深占用系统资源,二是处理时间过长,可能导致通讯出错。为了防止在处理数据过程中不受干扰,通常在处理接受数据前关闭中断,处理完后再开。 通常的的编程方式如下: static void UartInterruptService(void) interrupt 4 { ES = 0; RI = 0; uart_process(SBUF); ES=1; } 下面重点介绍数据处理函数 uart_process(SBUF); 其实很多时候,对于通讯
[单片机]
STM32数据类型的定义
/* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef signed int int32_t; typedef signed __int64 int64_t; /* exact-width unsigned integer types */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned in
[单片机]