1. 串口通信
配置串口为异步通信
设置波特率,数据位,校验位,停止位,数据的方向
同步通信
在同步通信中,数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持同步,以确保数据在正确的时间传输。在同步通信中,数据被划分成等长的块,并且在每个时钟周期内传输一个完整的数据块。因此,发送方和接收方需要严格按照时钟信号的节奏进行数据的发送和接收。
异步通信
在异步通信中,数据的传输是通过一组起始和停止信号来确定的,而不是通过共享的时钟信号。每个数据块都有一个起始位和一个或多个停止位,用于确定数据的开始和结束。异步通信中,发送端和接收端的时钟不需要保持同步,因此可以更灵活地处理速度不同步的情况。
区别
时钟同步:在同步通信中,发送端和接收端需要共享一个时钟信号以同步数据传输;而在异步通信中,时钟信号不是必需的,数据的传输通过起始和停止信号来确定。
速度区别:
同步通信速度:同步通信的速度受制于时钟信号的频率,因为数据的传输是根据时钟信号进行同步的。发送端和接收端需要以相同的时钟频率进行数据传输,因此速度受限于这一频率。
异步通信速度:相比之下,异步通信的速度没有受到严格的时钟同步的限制。由于数据的传输是通过起始和停止信号来确定的,因此发送端和接收端可以以不同的速度进行数据传输。这意味着异步通信可以更灵活地处理速度不同步的情况,因此在某些情况下可能会比同步通信更快。
灵活性:由于不需要时钟同步,异步通信更灵活,能够处理速度不同步的情况;而同步通信需要发送端和接收端保持严格的时钟同步,因此在处理速度不同步的情况下可能会出现问题。
串口发送数据
函数:
UART:串口异步发送(A:异步)
USART:串口的同步和异步发送(S:同步)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
UART_HandleTypeDef *huart:指定要使用的串口
const uint8_t *pData:要发送的数据(typedef unsigned char uint8_t;)
uint16_t Size:要发送数据的大小
uint32_t Timeout:超时时间,单位是ms,1000ms
HAL_StatusTypeDef:数据是否成功发送
串口重定向
串口重定向就是将串口的功能重新定向到标准输入或者是标准输出当中。
在stm32cube中配置
在usart.c中包含头文件,并编写函数
//重新实现fputc的功能
int fputc(int ch, FILE* f)
{
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 1000);
return ch;
}
调用printf会调用到fputc,所以我们只需要将fputc重新实现就可以实现使用printf来向电脑打印数据的功能。
串口接收数据
打开串口接收中断
当接收到数据后就会调用到接收中断回调函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart:指定要接收数据的串口
uint8_t *pData:数据缓冲区用来保存数据
uint16_t Size:每次要接收多少字节数据
HAL_StatusTypeDef:是否成功打开接收中断
串口接收中断回调函数:
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
}
注意事项:每次接收完数据后都需要重新打开接收中断。
2. DMA
在嵌入式系统中,DMA(Direct Memory Access,直接内存访问)也是一种重要的技术,用于实现外部设备和系统内存之间的高效数据传输,从而减轻CPU的负担,提高系统性能。在嵌入式系统中,由于资源有限、对功耗和性能要求较高,因此DMA技术显得尤为重要。通过DMA技术,嵌入式系统可以更高效地进行数据传输和处理,从而满足各种应用场景的需求。
DMA的优点:
1.使用DMA可以减轻CPU负担提高系统的运行效率
2.使用DMA可以快速传输数据(像音频,视频等数据量较大的数据)
配置DMA传输数据
传输函数
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
注意:不需要超时时间了,因为CPU得到了释放,不需要一直等待将数据发送完成,这个工作交给了DMA
空闲中断+DMA处理不定长数据
CPU不知道外部什么时候会发来数据,可以开启DMA接收,让DMA一直监测是否有数据,当有数据并且接收完一包数据就产生空闲中断处理数据。
开启DMA接收
以DMA+空闲中断的方式接收数据的函数
HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
UART_HandleTypeDef *huart:指定从哪个串口接收数据
uint8_t *pData:数据保存的缓冲区
uint16_t Size:要接收数据的大小
HAL_StatusTypeDef:是否成功开启
空闲中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
}
3. ADC采样
ADC是一种将模拟信号转换为数字信号的一种器件或者是电路。
STM32Cubemx配置ADC采样
开启ADC采样函数
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
HAL_StatusTypeDef:是否成功打开
ADC_HandleTypeDef* hadc:指定要打开哪个ADC
获取采样数值
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
ADC_HandleTypeDef* hadc:要对哪个ADC进行采样
uint32_t:代表采样到的数据
4. PWM
PWM是脉宽调制(Pulse Width Modulation)的缩写。它是一种通过控制信号的脉冲宽度来产生模拟效果的技术。PWM信号由一系列周期性的脉冲组成,每个脉冲的宽度可以调整,从而改变其平均功率或能量。
PWM信号常用于控制电机速度、LED亮度调节、音频信号合成等应用中。例如,在电机驱动器中,通过调整PWM信号的脉冲宽度,可以控制电机的转速;在LED调光控制中,通过调整PWM信号的脉冲宽度,可以实现LED的亮度调节。
打开定时器的PWM通道
函数
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
TIM_HandleTypeDef *htim:指定要打开的定时器
uint32_t Channel:指定要打开的通道
HAL_StatusTypeDef:是否打开成功
作业
在stmcubemx开启DMA接收
使用函数HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)以空闲中断的方式接收数据
在回调函数void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)中编写功能代码,此时当接收数据后搁一段时间没有数据继续出现,则执行回调函数。